<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
	<title>TommyBlue.it</title>
	
	<link>http://www.tommyblue.it</link>
	<description />
	<lastBuildDate>2013-05-23T14:39:31+02:00</lastBuildDate>

	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://github.com/mojombo/jekyll</generator>
	  
		  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/tommyblue" /><feedburner:info uri="tommyblue" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
  		<title>Icinga: Could not stat() command file</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/gqOrIxrpvN8/icinga-could-not-stat-command-file</link>
  		<comments>/2013/02/15/icinga-could-not-stat-command-file/#comments</comments>
  		<pubDate>2013-02-15T15:35:18+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Memoria ausiliaria]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2013/02/15/icinga-could-not-stat-command-file</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>Se dopo aver installato Icinga 1.6.x su una macchina Ubuntu server non siete in grado di inviare comandi al server icinga per problemi di permessi sul file <em>/var/lib/icinga/rw/icinga.cmd</em> ecco una veloce soluzione (da tenere a mente!):</p>

<pre><code>sudo service icinga stop
sudo dpkg-statoverride --update --add nagios www-data 2710 /var/lib/icinga/rw/
sudo dpkg-statoverride --update --add nagios nagios 751 /var/lib/icinga/
sudo service icinga start</code></pre>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2013/02/15/icinga-could-not-stat-command-file/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2013/02/15/icinga-could-not-stat-command-file</feedburner:origLink></item>
		
		  <item>
  		<title>Rails Recipes review</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/dWDoTgXdGqs/rails-recipes-review</link>
  		<comments>/2012/09/16/rails-recipes-review/#comments</comments>
  		<pubDate>2012-09-16T13:03:29+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/09/16/rails-recipes-review</guid>
  		
  		<description />
  			<content:encoded><![CDATA[

<p><img src="http://imagery.pragprog.com/products/239/rr2_xlargecover.jpg?" style="float:left; margin:0 6px 6px 0;" /> I write code using Rails since 3 or 4 years now, but the reading of <a href="http://shop.oreilly.com/product/9781934356777.do" target="_blank"><strong>Rails Recipes, Rails 4 ed.</strong></a> by Chad Fowler suprised me with helpful <strong>Tips & Tricks</strong> at every page.</p>

<p>This book isn't a guide for a newcomer to the Rails world (although it can be a newsworthy reading) but a sort of <em>reference</em> for daily development, which can suggest professional solution to common problems that everybody will have to face someday :)</p>

<p>So read it the first time then leave it on your desk, tomorrow you'll need to open it and get suggestions to write some awesome new code.</p>
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/09/16/rails-recipes-review/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/09/16/rails-recipes-review</feedburner:origLink></item>
		
		  <item>
  		<title>Passare a Vim grazie ad Emacs</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/yLlKscu7y-4/passare-a-vim-grazie-ad-emacs</link>
  		<comments>/2012/09/01/passare-a-vim-grazie-ad-emacs/#comments</comments>
  		<pubDate>2012-09-01T21:38:51+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/09/01/passare-a-vim-grazie-ad-emacs</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p><strong>Grazie <a href='http://scia.mp'>Sciamp</a> per avermi convinto a passare a Vim parlandomi di Emacs :)</strong></p>

<p>Lo so, sembra uno scherzo, eppure è proprio vero! Era da tanto che volevo cambiare editor passando da Textmate a qualcos&#8217;altro, ho intravisto Sublime Text 2, ma volevo qualcosa di open source. Da un po&#8217; di tempo <a href='https://github.com/sciamp'>Alessandro</a> stava rompendo le scatole a tutti su quanto è figo Emacs :) e avevo iniziato a lavorarci un po&#8217;, ma non sono mai riuscito ad entrarci in sintonia. Arriviamo ai giorni nostri e in particolare al primo incontro ufficiale del <a href='http://firenze.ruby-it.org/2012/05/02/2-maggio-al-pangoro'>Ruby Social Club Firenze</a> dove ho assistito al talk proprio di Alessandro <a href='http://vimeo.com/41595912'>&#8220;Ma perchè non Emacs? - a caccia di feature che sicuramente esistono già</a>. Il talk è stato illuminante, talmente interessante che mi sono detto: &#8220;Ma se Emacs fa tutte queste cose (e io mi trovo molto bene con Vim), possibile che anche Vim non le faccia?&#8221;. Mi sono guardato un po&#8217; di video (scoprendo che, ovviamente, le faceva) e alla fine ho deciso di abbandonare Textmate e passare a Vim!</p>

<p>Lo ammetto: non è stato subito semplice: stupito dai video e dagli articoli letti quà e là ho installato plugin, clonato repository, fatto configurazioni per lo più senza sapere troppo cosa stavo facendo e mi sono trovato in situazioni veramente strane, tipo non capire perchè il Tab non tabbava oppure vedere apparire cose a caso in conseguenza di shortcut che non sapevo di aver digitato! L&#8217;editor risultava comunque molto potente, ma non sentivo di padroneggiarlo abbastanza anche se non ho mai rimpianto troppo TextMate. Poi ho letto <a href='http://yehudakatz.com/2010/07/29/everyone-who-tried-to-convince-me-to-use-vim-was-wrong/'>questo articolo di Yahuda Katz</a> e ho trovato le sue osservazioni molto giuste: quando si passa a editor potenti come Emacs o Vim bisogna evitare il <strong>troppo</strong>, ovvero le centinaia di funzioni e plugin che gli esperti di quell&#8217;editor ti suggeriscono di installare subito come se fossero essenziali, quando invece ti trovi a non capirci più un tubo.</p>

<p>Ho quindi deciso di eliminare <strong>~/.vim/</strong> e <strong>~/.vimrc</strong> e ricominciare da capo un passo alla volta. Userò questo articolo per tenere traccia delle cose che ho fatto. Non so bene cosa verrà fuori, intanto sappiate che uso sia Vim (sui server e da terminale) che GVim (su Fedora) e Mvim (sul Mac), quindi mi aspetto che le configurazioni debbano funzionare su tutte e tre le varianti dell&#8217;editor. Troverete la versione aggiornata e completa dei file nel <a href='https://github.com/tommyblue/vim'>mio repository GitHub dedicato a Vim</a> (leggete il README prima di usarlo).</p>

<p><strong>N.B.</strong>: d&#8217;ora in poi scriverò sempre le configurazioni riferendomi al file <em>~/.vimrc</em> ma se state usando il mio repository quel file è praticamente vuoto e include il file <em>~/.vim/vimrc</em>, dove effettivamente troverete le configurazioni. A parte il cambio di file, la sostanza non cambia :)</p>

<h2 id='configurazioni_di_base'>Configurazioni di base</h2>

<p>Tutto ciò che concerne Vim è essenzialmente in due posti: il file <em>~/.vimrc</em> e la cartella <em>~/.vim/</em>. Il file <em>~/.vimrc</em> viene eseguito al lancio del programma mentre nella cartella si trovano tutte le estensioni (colori, plugin, ecc.). Come prima cosa impostiamo un po&#8217; di configurazioni di base in <em>~/.vimrc</em>:</p>
<div class='highlight'><pre><code class='vim'><span class='k'>set</span> <span class='nb'>showcmd</span>     <span class='c'>&quot;show incomplete cmds down the bottom</span>
<span class='k'>set</span> <span class='nb'>showmode</span>    <span class='c'>&quot;show current mode down the bottom</span>

<span class='k'>set</span> <span class='nb'>incsearch</span>   <span class='c'>&quot;find the next match as we type the search</span>
<span class='k'>set</span> <span class='nb'>hlsearch</span>    <span class='c'>&quot;hilight searches by default</span>

<span class='c'>&quot;turn off needless toolbar on gvim/mvim</span>
<span class='k'>set</span> <span class='nb'>guioptions</span><span class='p'>-=</span>T

<span class='c'>&quot;indent settings</span>
<span class='k'>set</span> <span class='nb'>tabstop</span><span class='p'>=</span><span class='m'>4</span>
<span class='k'>set</span> <span class='nb'>shiftwidth</span><span class='p'>=</span><span class='m'>4</span>
<span class='k'>set</span> <span class='nb'>softtabstop</span><span class='p'>=</span><span class='m'>4</span>
<span class='k'>set</span> <span class='nb'>cindent</span>
<span class='k'>set</span> <span class='nb'>smartindent</span>
<span class='k'>set</span> <span class='nb'>autoindent</span>
<span class='k'>set</span> <span class='nb'>expandtab</span>

<span class='c'>&quot;folding settings</span>
<span class='k'>set</span> <span class='nb'>foldmethod</span><span class='p'>=</span>indent   <span class='c'>&quot;fold based on indent</span>
<span class='k'>set</span> <span class='nb'>foldnestmax</span><span class='p'>=</span><span class='m'>3</span>       <span class='c'>&quot;deepest fold is 3 levels</span>
<span class='k'>set</span> <span class='nb'>nofoldenable</span>        <span class='c'>&quot;dont fold by default</span>

<span class='k'>set</span> <span class='nb'>wildmode</span><span class='p'>=</span><span class='nb'>list</span>:longest   <span class='c'>&quot;make cmdline tab completion similar to bash</span>
<span class='k'>set</span> <span class='nb'>wildmenu</span>                <span class='c'>&quot;enable ctrl-n and ctrl-p to scroll thru matches</span>

<span class='c'>&quot; Vim tabs navigation</span>
nmap <span class='p'>&lt;</span>leader<span class='p'>&gt;</span>] :<span class='k'>tabn</span><span class='p'>&lt;</span>CR<span class='p'>&gt;</span>
nmap <span class='p'>&lt;</span>leader<span class='p'>&gt;</span>[ :<span class='k'>tabp</span><span class='p'>&lt;</span>CR<span class='p'>&gt;</span>
</code></pre>
</div>
<p>Per Vim sono disponibili tantissimi <a href='http://www.vim.org/scripts/script_search_results.php?keywords=&amp;script_type=color+scheme&amp;order_by=rating&amp;direction=descending&amp;search=search'>schemi di colore</a>, per installarli è necessario copiare il file <em>.vim</em> contenente lo schema in <em>~/.vim/colors</em>. A quel punto è possibile abilitare a runtime lo schema colori con:</p>

<pre><code>:colorscheme MyScheme</code></pre>

<p>oppure, usando <em>~/.vimrc</em>:</p>

<pre><code>colorscheme MyScheme</code></pre>

<p>Di seguito una configurazione leggermente più complessa riguardante lo schema colori che tiene conto dell&#8217;interfaccia di Vim usata:</p>
<div class='highlight'><pre><code class='vim'><span class='c'>&quot; Color scheme</span>
<span class='k'>if</span> has<span class='p'>(</span><span class='s2'>&quot;gui_running&quot;</span><span class='p'>)</span>
<span class='c'>    &quot;tell the term has 256 colors</span>
    <span class='k'>set</span> <span class='nb'>t_Co</span><span class='p'>=</span><span class='m'>256</span>

    <span class='k'>colorscheme</span> railscasts
    <span class='k'>set</span> <span class='nb'>guitablabel</span><span class='p'>=</span>%M%<span class='k'>t</span>
    <span class='k'>set</span> <span class='nb'>lines</span><span class='p'>=</span><span class='m'>40</span>
    <span class='k'>set</span> <span class='nb'>columns</span><span class='p'>=</span><span class='m'>115</span>

    <span class='k'>if</span> has<span class='p'>(</span><span class='s2'>&quot;gui_gnome&quot;</span><span class='p'>)</span>
	<span class='k'>set</span> <span class='nb'>term</span><span class='p'>=</span>gnome<span class='m'>-256</span>color
	<span class='k'>colorscheme</span> railscasts
	<span class='k'>set</span> <span class='nb'>guifont</span><span class='p'>=</span>Monospace\ Bold\ <span class='m'>12</span>
    <span class='k'>endif</span>

    <span class='k'>if</span> has<span class='p'>(</span><span class='s2'>&quot;gui_mac&quot;</span><span class='p'>)</span> <span class='p'>||</span> has<span class='p'>(</span><span class='s2'>&quot;gui_macvim&quot;</span><span class='p'>)</span>
	<span class='k'>set</span> <span class='nb'>guifont</span><span class='p'>=</span>Menlo:h14
<span class='c'>	&quot; key binding for Command-T to behave properly</span>
<span class='c'>	&quot; uncomment to replace the Mac Command-T key to Command-T plugin</span>
<span class='c'>	&quot;macmenu &amp;File.New\ Tab key=&lt;nop&gt;</span>
<span class='c'>	&quot;map &lt;D-t&gt; :CommandT&lt;CR&gt;</span>
<span class='c'>	&quot; make Mac&#39;s Option key behave as the Meta key</span>
    <span class='k'>endif</span>

    <span class='k'>if</span> has<span class='p'>(</span><span class='s2'>&quot;gui_win32&quot;</span><span class='p'>)</span> <span class='p'>||</span> has<span class='p'>(</span><span class='s2'>&quot;gui_win32s&quot;</span><span class='p'>)</span>
	<span class='k'>set</span> <span class='nb'>guifont</span><span class='p'>=</span>Consolas:h12
	<span class='k'>set</span> <span class='nb'>enc</span><span class='p'>=</span>utf<span class='m'>-8</span>
    <span class='k'>endif</span>
<span class='k'>else</span>
<span class='c'>    &quot;dont load csapprox if there is no gui support - silences an annoying warning</span>
    <span class='k'>let</span> g:CSApprox_loaded <span class='p'>=</span> <span class='m'>1</span>

<span class='c'>    &quot;set railscasts colorscheme when running vim in gnome terminal</span>
    <span class='k'>if</span> $COLORTERM <span class='p'>==</span> <span class='s1'>&#39;gnome-terminal&#39;</span>
	<span class='k'>set</span> <span class='nb'>term</span><span class='p'>=</span>gnome<span class='m'>-256</span>color
	<span class='k'>colorscheme</span> railscasts
    <span class='k'>else</span>
	<span class='k'>if</span> $TERM <span class='p'>==</span> <span class='s1'>&#39;xterm&#39;</span>
	    <span class='k'>set</span> <span class='nb'>term</span><span class='p'>=</span>xterm<span class='m'>-256</span>color
	    <span class='k'>colorscheme</span> railscasts
	<span class='k'>else</span>
	    <span class='k'>colorscheme</span> default
	<span class='k'>endif</span>
    <span class='k'>endif</span>
<span class='k'>endif</span>
</code></pre>
</div>
<p>Personalmente non modifico il tasto Leader (di default <em>\</em>), ma se lo volete fare:</p>
<div class='highlight'><pre><code class='vim'><span class='k'>let</span> mapleader<span class='p'>=</span><span class='s2'>&quot;,&quot;</span>
</code></pre>
</div>
<h2 id='pathogen'>Pathogen</h2>

<p>Installare un plugin in Vim vuol dire copiare i suoi file nella cartella <em>~/.vim/</em> e in particolare nelle sue varie sottodirectory (<em>plugin</em>, <em>doc</em>, <em>autoload</em>, ecc). Non mi piace molto dover dividere i file di uno stesso plugin ed evidentemente non sono il solo dato che esiste il plugin <a href='http://www.vim.org/scripts/script.php?script_id=2332'>Pathogen</a> che permette di scompattare ogni plugin nella sua cartella in <em>~/.vim/bundle/</em>. Per installare il plugin bisogna copiare il plugin in <em>~/.vim/autoload</em> e creare la cartella <em>~/.vim/bundle/</em>:</p>
<div class='highlight'><pre><code class='bash'>mkdir -p ~/.vim/autoload ~/.vim/bundle 
curl <span class='s1'>&#39;www.vim.org/scripts/download_script.php?src_id=16224&#39;</span> &gt; ~/.vim/autoload/pathogen.vim
</code></pre>
</div>
<p>Per attivare il plugin basta inserire in <em>~/.vimrc</em>:</p>
<div class='highlight'><pre><code class='vim'><span class='c'>&quot;necessary on some Linux distros for pathogen to properly load bundles</span>
<span class='k'>filetype</span> <span class='k'>on</span>
<span class='k'>filetype</span> off

<span class='c'>&quot;load pathogen managed plugins</span>
<span class='k'>call</span> pathogen#infect<span class='p'>()</span>
</code></pre>
</div>
<h2 id='nerdtree'>NERDTree</h2>

<p>Adesso che abbiamo installato Pathogen cosa di meglio se non provarlo! Uno dei plugin che uso di più è sicuramente <a href='http://www.vim.org/scripts/script.php?script_id=1658'>NerdTree</a>, che permette la visualizzazione dell&#8217;albero delle directory e dei file. Per installarlo quindi si seguono le <a href='https://github.com/scrooloose/nerdtree'>istruzioni del repository GitHub</a>, ovvero:</p>
<div class='highlight'><pre><code class='bash'><span class='nb'>cd</span> ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git
</code></pre>
</div>
<p>Personalmente utilizzo queste configurazioni in <em>~/.vimrc</em> per NerdTree:</p>
<div class='highlight'><pre><code class='vim'><span class='c'>&quot; Visualizzo NERDTree con i tasti &#39;wm&#39;</span>
nmap <span class='nb'>wm</span> :NERDTree<span class='p'>&lt;</span><span class='k'>cr</span><span class='p'>&gt;</span>
<span class='c'>&quot; Ignoro i file di backup di Vim</span>
<span class='k'>let</span> NERDTreeIgnore<span class='p'>=</span>[<span class='s1'>&#39;\.swp$&#39;</span>]
<span class='c'>&quot; Utilizzo &lt;leader&gt;p per mostrare e nascondere NERDTree</span>
<span class='k'>silent</span><span class='p'>!</span> nmap <span class='p'>&lt;</span><span class='k'>silent</span><span class='p'>&gt;</span> <span class='p'>&lt;</span>Leader<span class='p'>&gt;</span><span class='k'>p</span> :NERDTreeToggle<span class='p'>&lt;</span>CR<span class='p'>&gt;</span>
</code></pre>
</div>
<h2 id='vundle'>Vundle</h2>

<p>Come abbiamo appena visto installare i plugin è molto semplice, specialmente con Pathogen, ma a lungo andare si potrebbe perdere un po&#8217; traccia di cosa si è installato e, soprattutto, se i plugin installati sono anche aggiornati. Per ovviare al problema uso <a href='https://github.com/gmarik/vundle'>Vundle</a>, un plugin che, sfruttando Pathogen, permette di automatizzare le operazioni di installazione e aggiornamento dei plugin. Per installarlo:</p>
<div class='highlight'><pre><code class='bash'>git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
</code></pre>
</div>
<p>La configurazione a questo punto è piuttosto semplice:</p>
<div class='highlight'><pre><code class='vim'><span class='k'>set</span> <span class='nb'>nocompatible</span>               <span class='c'>&quot; be iMproved</span>
<span class='k'>filetype</span> off                   <span class='c'>&quot; required!</span>

<span class='k'>set</span> <span class='nb'>rtp</span><span class='p'>+=~</span><span class='sr'>/.vim/</span>bundle<span class='sr'>/vundle/</span>
<span class='k'>call</span> vundle#rc<span class='p'>()</span>

<span class='c'>&quot; let Vundle manage Vundle</span>
<span class='c'>&quot; required! </span>
Bundle <span class='s1'>&#39;gmarik/vundle&#39;</span>

<span class='c'>&quot; Set plugins here...</span>


<span class='k'>filetype</span> plugin indent <span class='k'>on</span>     <span class='c'>&quot; required!</span>
</code></pre>
</div>
<p>Se a questo punto si vuole installare un plugin da GitHub (ad esempio reinstalliamo, dopo averlo eliminato, NerdTree), basta inserire in <em>~/.vimrc</em>:</p>
<div class='highlight'><pre><code class='vim'>Bundle <span class='s1'>&#39;scrooloose/nerdtree.git&#39;</span>
</code></pre>
</div>
<p>Se il plugin non fosse su GitHub è sufficiente indicare l&#8217;url GIT completo.</p>

<p>Una volta inserito il plugin si lancia Vim e si esegue:</p>

<pre><code>:BundleInstall</code></pre>

<p>Se si vogliono vedere i bundle presenti:</p>

<pre><code>:BundleList</code></pre>

<p>se si vogliono aggiornare i bundle installati:</p>

<pre><code>:BundleInstall!</code></pre>

<p>e infine se si vuole eliminare un plugin si elimina la riga corrispondente in <em>~/.vimrc</em> e si esegue:</p>

<pre><code>:BundleClean</code></pre>

<p>Niente di più semplice.</p>

<p>Adesso che Vim è configurato per installare velocemente i plugin inizio con una carrellata di plugin che ho installato. Vi consiglio anche la visione di questa interessante serie di video intitolata <a href='http://net.tutsplus.com/sessions/vim-essential-plugins/'>VIM Essential Plugins</a>.</p>

<h2 id='fugitive'>Fugitive</h2>

<p>Inizio con Fugitive, un plugin che trasforma Vim in un client Git. Personalmente, almeno per ora, non uso direttamente le funzionalità per Git, ma mi è utile per visualizzare lo stato del repository su cui sto lavorando. Dopo aver inserito il bundle:</p>
<div class='highlight'><pre><code class='vim'>Bundle <span class='s1'>&#39;tpope/vim-fugitive&#39;</span>
</code></pre>
</div>
<p>per vedere lo stato del repository si inserisce in <em>~/.vimrc</em>:</p>
<div class='highlight'><pre><code class='vim'><span class='k'>set</span> <span class='nb'>statusline</span><span class='p'>+=</span>%{fugitive#<span class='nb'>statusline</span><span class='p'>()</span>}
</code></pre>
</div>
<p>Per una panoramica più completa del plugin esiste una <a href='http://vimcasts.org/blog/2011/05/the-fugitive-series/'>serie di screencast su Fugitive</a></p>

<h2 id='snipmate'>SnipMate</h2>

<p><a href='https://github.com/msanders/snipmate.vim'>Snipmate</a> è un plugin che permette l&#8217;uso degli snippet, ovvero l&#8217;uso di una stringa che, seguita dal Tab, genera del codice. Snipmate non va d&#8217;accordo con Pathogen quindi non è possibile utilizzare Vundle. Per installarlo bisogna quindi seguire la guida:</p>
<div class='highlight'><pre><code class='bash'>git clone git://github.com/msanders/snipmate.vim.git
<span class='nb'>cd </span>snipmate.vim
cp -R * ~/.vim
</code></pre>
</div>
<p>Per fare un esempio, si può aprire un file html, digitare <em>html</em> seguito da un Tab e Snipmate genererà:</p>
<div class='highlight'><pre><code class='html'><span class='nt'>&lt;html&gt;&lt;/html&gt;</span>
</code></pre>
</div>
<p>Se lavorate molto con l&#8217;HTML vi consiglio di dare un bello sguardo a <a href='https://github.com/rstacruz/sparkup'>Sparkup</a> che permette di creare HTML molto complesso con poco, ad esempio:</p>

<pre><code>nav &gt; ul &gt; li &gt; a*4 { Links }</code></pre>

<p>seguito da un Tab produce:</p>
<div class='highlight'><pre><code class='html'><span class='nt'>&lt;nav&gt;</span>
   <span class='nt'>&lt;ul&gt;</span>
      <span class='nt'>&lt;li&gt;</span>
         <span class='nt'>&lt;a</span> <span class='na'>href=</span><span class='s'>&quot;&quot;</span><span class='nt'>&gt;</span> Links <span class='nt'>&lt;/a&gt;</span>
         <span class='nt'>&lt;a</span> <span class='na'>href=</span><span class='s'>&quot;&quot;</span><span class='nt'>&gt;</span> Links <span class='nt'>&lt;/a&gt;</span>
         <span class='nt'>&lt;a</span> <span class='na'>href=</span><span class='s'>&quot;&quot;</span><span class='nt'>&gt;</span> Links <span class='nt'>&lt;/a&gt;</span>
         <span class='nt'>&lt;a</span> <span class='na'>href=</span><span class='s'>&quot;&quot;</span><span class='nt'>&gt;</span> Links <span class='nt'>&lt;/a&gt;</span>
      <span class='nt'>&lt;/li&gt;</span>
   <span class='nt'>&lt;/ul&gt;</span>
<span class='nt'>&lt;/nav&gt;</span>
</code></pre>
</div>
<p>Mica male&#8230; :)</p>

<h2 id='commandt'>Command-T</h2>

<p><a href='https://github.com/wincent/Command-T'>Command-T</a> prende direttamente spunto dal Command-T di TextMate e serve per trovare velocemente un file e aprirlo: basta digitare <em>leader-t</em> e iniziare a digitare il nome di un file per trovarlo.</p>

<p>La sua installazione è molto più complessa dei plugin installati finora, quindi mi ci soffermerò un po&#8217; di più.</p>

<p>Intanto i requisiti: Command-T richiede che sia installato Ruby (e che sia della stessa versione usata per compilare Vim) e alcune librerie di sistema. Su Fedora i pacchetti necessari sono:</p>

<pre><code>yum install ruby ruby-devel libxml2-devel libxslt-devel</code></pre>

<p>Il plugin si può installare con Vundle, quindi in <em>~/.vimrc</em>:</p>
<div class='highlight'><pre><code class='vim'>Bundle <span class='s1'>&#39;git://git.wincent.com/command-t.git&#39;</span>
</code></pre>
</div>
<p>e, come al solito, si installa con:</p>
<div class='highlight'><pre><code class='vim'><span class='p'>:</span>BundleInstall
</code></pre>
</div>
<p>Fatto questo il plugin va compilato. Se, come me, usate RVM, prima di compilare Command-T, switchate al ruby di sistema con:</p>

<pre><code>rvm use system</code></pre>

<p>entrate poi nella cartella <em>~/.vim/bundle/command-t/ruby/command-t/</em> e lanciate:</p>
<div class='highlight'><pre><code class='bash'>ruby extconf.rb
make
</code></pre>
</div>
<p>Se tra l&#8217;installazione del plugin e la sua compilazione provate a lanciare vim vi troverete con un bel <strong>Segmentation Fault</strong> :)</p>

<p>Esiste anche un plugin alternativo che promette faville, specialmente per chi ha MacOSX, <a href='https://peepcode.com/products/peepopen'>PeepOpen</a>, ma costa 12$</p>

<h2 id='vimrails'>Vim-Rails</h2>

<p>Eccoci al mio plugin preferito: <a href='https://github.com/tpope/vim-rails'>Vim-Rails</a>. Chiunque programmi in Ruby on Rails amerà <em>:Rmodel</em>, <em>:Rview</em>, <em>:Rcontroller</em> per navigare velocemente l&#8217;MVC di una risorsa, <em>:Rextract</em> per creare un partial al volo di un codice selezionato, ecc. Per installarlo, in <em>~/.vimrc</em>:</p>
<div class='highlight'><pre><code class='vim'>Bundle <span class='s1'>&#39;tpope/vim-rails.git&#39;</span>
</code></pre>
</div>
<h2 id='altri_plugin'>Altri plugin</h2>

<p>Termino con una breve descrizione di altri plugin utili:</p>

<ul>
<li><a href='https://github.com/ervandew/supertab'>SuperTab</a> permette l&#8217;autocompletamento con un utile menù a tendina da cui scegliere l&#8217;opzione desiderata</li>

<li><a href='https://github.com/Raimondi/delimitMate.git'>DelimitMate</a>: chiusura automatica delle parentesi</li>

<li><a href='https://github.com/docunext/closetag.vim.git'>CloseTag</a>: premendo <em>Ctrl-_</em> in un file HTML chiude in automatico un Tag rimasto aperto</li>

<li><a href='http://majutsushi.github.com/tagbar/'>TagBar</a>: un plugin simile a <a href='http://vim.sourceforge.net/scripts/script.php?script_id=273'>TagList</a> che genera la lista di classi/metodi/ecc. del file aperto (richiede exuberant-ctags)</li>

<li><a href='https://github.com/mattn/zencoding-vim/'>ZenCoding</a>: abbreviazioni per file HTML in stile <a href='http://code.google.com/p/zen-coding/'>zen-coding</a></li>

<li><a href='https://github.com/vim-scripts/Better-CSS-Syntax-for-Vim'>CSS Syntax</a>: una versione migliorata della colorazione dei CSS</li>
</ul>

<p>Questa volta, più che mai, un augurio di <em>Happy Hacking!</em></p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/09/01/passare-a-vim-grazie-ad-emacs/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/09/01/passare-a-vim-grazie-ad-emacs</feedburner:origLink></item>
		
		  <item>
  		<title>Create a contact form for Jekyll</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/mep27hvx0nU/create-a-contact-form-for-jekyll</link>
  		<comments>/2012/08/28/create-a-contact-form-for-jekyll/#comments</comments>
  		<pubDate>2012-08-28T14:49:43+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Sito]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/08/28/create-a-contact-form-for-jekyll</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>As I promised to a reader who wrote me an email some days ago, with this post I&#8217;ll explain how I built the contact form of this website using Sinatra and Sendgrid. As you know (or you&#8217;re just learning) this site is made by <a href='https://github.com/mojombo/jekyll'>Jekyll</a>, a static site generator written in Ruby. As the result of the work of Jekyll it is a static HTML website, so it&#8217;s not immediate to build a contact form. I tried to find a JS solution to maintain a full static website, but didn&#8217;t find any. So I wrote a few Ruby lines and the contact form is now working.</p>

<p>How to let the form work is strictly dependent on how you deploy your Jekyll website. I use <a href='http://www.heroku.com/'>Heroku</a> so I deploy the site as a <a href='https://devcenter.heroku.com/articles/rack'>Rack-based app</a> using <a href='http://www.sinatrarb.com/'>Sinatra</a>, this how-to works only if you have my deployment configuration. If not, you must adapt it to your needs.</p>

<p>The first step is to register a free account to <a href='http://www.google.com/recaptcha'>reCAPTCHA</a> and get the public and private API keys. Then register a <a href='https://devcenter.heroku.com/articles/sendgrid'>Sendgrid free account as Heroku add-on</a> in your website app.</p>

<p>To use a rack-based app on Heroku you need a <em>config.ru</em> file, this is mine:</p>
<div class='highlight'><pre><code class='ruby'><span class='nb'>require</span> <span class='s1'>&#39;rubygems&#39;</span>
<span class='nb'>require</span> <span class='s1'>&#39;sinatra&#39;</span>
<span class='nb'>require</span> <span class='s1'>&#39;rack/recaptcha&#39;</span>

<span class='n'>use</span> <span class='no'>Rack</span><span class='o'>::</span><span class='no'>Recaptcha</span><span class='p'>,</span> <span class='ss'>:public_key</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;MyPublicKey&#39;</span><span class='p'>,</span> <span class='ss'>:private_key</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;TheS3cr3tS3cr3tKey&#39;</span>
<span class='n'>helpers</span> <span class='no'>Rack</span><span class='o'>::</span><span class='no'>Recaptcha</span><span class='o'>::</span><span class='no'>Helpers</span>
<span class='n'>enable</span> <span class='ss'>:sessions</span>

<span class='nb'>require</span> <span class='s1'>&#39;./application&#39;</span>
<span class='n'>run</span> <span class='no'>Sinatra</span><span class='o'>::</span><span class='no'>Application</span>
</code></pre>
</div>
<p>Just insert the reCAPTCHA keys and the file is ready. Now the <em>application.rb</em> file called by the <em>require</em> above:</p>
<div class='highlight'><pre><code class='ruby'><span class='n'>set</span> <span class='ss'>:public</span><span class='p'>,</span> <span class='no'>Proc</span><span class='o'>.</span><span class='n'>new</span> <span class='p'>{</span> <span class='no'>File</span><span class='o'>.</span><span class='n'>join</span><span class='p'>(</span><span class='n'>root</span><span class='p'>,</span> <span class='s2'>&quot;_site&quot;</span><span class='p'>)</span> <span class='p'>}</span>

<span class='n'>post</span> <span class='s1'>&#39;/send&#39;</span> <span class='k'>do</span>
  <span class='k'>if</span> <span class='n'>recaptcha_valid?</span>
    <span class='n'>session</span><span class='o'>[</span><span class='ss'>:captcha</span><span class='o'>]</span> <span class='o'>=</span> <span class='kp'>true</span>
    <span class='p'>{</span> <span class='ss'>:message</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;success&#39;</span> <span class='p'>}</span><span class='o'>.</span><span class='n'>to_json</span>
  <span class='k'>else</span>
    <span class='n'>session</span><span class='o'>[</span><span class='ss'>:captcha</span><span class='o'>]</span> <span class='o'>=</span> <span class='kp'>false</span>
    <span class='p'>{</span> <span class='ss'>:message</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;failure&#39;</span> <span class='p'>}</span><span class='o'>.</span><span class='n'>to_json</span>
  <span class='k'>end</span>
<span class='k'>end</span>

<span class='n'>post</span> <span class='s1'>&#39;/send_email&#39;</span> <span class='k'>do</span>
    <span class='nb'>require</span> <span class='s1'>&#39;pony&#39;</span>
    <span class='nb'>require</span> <span class='s1'>&#39;json&#39;</span>

    <span class='k'>if</span> <span class='n'>session</span><span class='o'>[</span><span class='ss'>:captcha</span><span class='o'>]</span>
      <span class='n'>session</span><span class='o'>[</span><span class='ss'>:captcha</span><span class='o'>]</span> <span class='o'>=</span> <span class='kp'>false</span>
      <span class='n'>res</span> <span class='o'>=</span> <span class='no'>Pony</span><span class='o'>.</span><span class='n'>mail</span><span class='p'>(</span>
	<span class='ss'>:from</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='ss'>:name</span><span class='o'>]</span> <span class='o'>+</span> <span class='s2'>&quot;&lt;&quot;</span> <span class='o'>+</span> <span class='n'>params</span><span class='o'>[</span><span class='ss'>:email</span><span class='o'>]</span> <span class='o'>+</span> <span class='s2'>&quot;&gt;&quot;</span><span class='p'>,</span>
	<span class='ss'>:to</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;me@mydomain.com&#39;</span><span class='p'>,</span>
	<span class='ss'>:subject</span> <span class='o'>=&gt;</span> <span class='s2'>&quot;Message from your awesome website :)&quot;</span><span class='p'>,</span>
	<span class='ss'>:body</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='ss'>:message</span><span class='o'>]</span><span class='p'>,</span>
	<span class='ss'>:port</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;587&#39;</span><span class='p'>,</span>
	<span class='ss'>:via</span> <span class='o'>=&gt;</span> <span class='ss'>:smtp</span><span class='p'>,</span>
	<span class='ss'>:via_options</span> <span class='o'>=&gt;</span> <span class='p'>{</span>
	  <span class='ss'>:address</span>              <span class='o'>=&gt;</span> <span class='s1'>&#39;smtp.sendgrid.net&#39;</span><span class='p'>,</span>
	  <span class='ss'>:port</span>                 <span class='o'>=&gt;</span> <span class='s1'>&#39;587&#39;</span><span class='p'>,</span>
	  <span class='ss'>:enable_starttls_auto</span> <span class='o'>=&gt;</span> <span class='kp'>true</span><span class='p'>,</span>
	  <span class='ss'>:user_name</span>            <span class='o'>=&gt;</span> <span class='no'>ENV</span><span class='o'>[</span><span class='s1'>&#39;SENDGRID_USERNAME&#39;</span><span class='o'>]</span><span class='p'>,</span>
	  <span class='ss'>:password</span>             <span class='o'>=&gt;</span> <span class='no'>ENV</span><span class='o'>[</span><span class='s1'>&#39;SENDGRID_PASSWORD&#39;</span><span class='o'>]</span><span class='p'>,</span>
	  <span class='ss'>:authentication</span>       <span class='o'>=&gt;</span> <span class='ss'>:plain</span><span class='p'>,</span>
	  <span class='ss'>:domain</span>               <span class='o'>=&gt;</span> <span class='s1'>&#39;heroku.com&#39;</span>
	<span class='p'>})</span>
      <span class='n'>content_type</span> <span class='ss'>:json</span>
      <span class='k'>if</span> <span class='n'>res</span>
	  <span class='p'>{</span> <span class='ss'>:message</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;success&#39;</span> <span class='p'>}</span><span class='o'>.</span><span class='n'>to_json</span>
      <span class='k'>else</span>
	  <span class='p'>{</span> <span class='ss'>:message</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;failure&#39;</span> <span class='p'>}</span><span class='o'>.</span><span class='n'>to_json</span>
      <span class='k'>end</span>
    <span class='k'>else</span>
      <span class='p'>{</span> <span class='ss'>:message</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;failure&#39;</span> <span class='p'>}</span><span class='o'>.</span><span class='n'>to_json</span>
    <span class='k'>end</span>
<span class='k'>end</span>

<span class='n'>before</span> <span class='k'>do</span>
    <span class='n'>response</span><span class='o'>.</span><span class='n'>headers</span><span class='o'>[</span><span class='s1'>&#39;Cache-Control&#39;</span><span class='o'>]</span> <span class='o'>=</span> <span class='s1'>&#39;public, max-age=36000&#39;</span>
<span class='k'>end</span>

<span class='n'>not_found</span> <span class='k'>do</span>
    <span class='no'>File</span><span class='o'>.</span><span class='n'>read</span><span class='p'>(</span><span class='s1'>&#39;_site/404.html&#39;</span><span class='p'>)</span>
<span class='k'>end</span>

<span class='n'>get</span> <span class='s1'>&#39;/*&#39;</span> <span class='k'>do</span>
    <span class='n'>file_name</span> <span class='o'>=</span> <span class='s2'>&quot;_site</span><span class='si'>#{</span><span class='n'>request</span><span class='o'>.</span><span class='n'>path_info</span><span class='si'>}</span><span class='s2'>/index.html&quot;</span><span class='o'>.</span><span class='n'>gsub</span><span class='p'>(</span><span class='sr'>%r{\/+}</span><span class='p'>,</span><span class='s1'>&#39;/&#39;</span><span class='p'>)</span>
    <span class='k'>if</span> <span class='no'>File</span><span class='o'>.</span><span class='n'>exists?</span><span class='p'>(</span><span class='n'>file_name</span><span class='p'>)</span>
	<span class='no'>File</span><span class='o'>.</span><span class='n'>read</span><span class='p'>(</span><span class='n'>file_name</span><span class='p'>)</span>
    <span class='k'>else</span>
	<span class='k'>raise</span> <span class='no'>Sinatra</span><span class='o'>::</span><span class='no'>NotFound</span>
    <span class='k'>end</span>
<span class='k'>end</span>
</code></pre>
</div>
<p>As you see in the code I use two methods, <em>send</em> and <em>send_email</em>: the first check the captcha and set a session variable, returning a JSON message (<em>success</em>). The second method sends the email using Pony only if the captcha was verified. The SendGrid username and password are loaded automatically from your Heroku environment.</p>

<p>The last step is to create the contact form page, including the reCAPTCHA js:</p>
<div class='highlight'><pre><code class='html'><span class='nt'>&lt;script </span><span class='na'>type=</span><span class='s'>&quot;text/javascript&quot;</span> <span class='na'>src=</span><span class='s'>&quot;http://www.google.com/recaptcha/api/js/recaptcha_ajax.js&quot;</span><span class='nt'>&gt;&lt;/script&gt;</span>

<span class='nt'>&lt;script </span><span class='na'>type=</span><span class='s'>&quot;text/javascript&quot;</span><span class='nt'>&gt;</span>
  <span class='kd'>function</span> <span class='nx'>showRecaptcha</span><span class='p'>(</span><span class='nx'>element</span><span class='p'>)</span> <span class='p'>{</span>
     <span class='nx'>Recaptcha</span><span class='p'>.</span><span class='nx'>create</span><span class='p'>(</span><span class='s2'>&quot;MyPublicKey&quot;</span><span class='p'>,</span> <span class='nx'>element</span><span class='p'>,</span> <span class='p'>{</span>
       <span class='nx'>theme</span><span class='o'>:</span> <span class='s2'>&quot;red&quot;</span><span class='p'>,</span>
       <span class='nx'>callback</span><span class='o'>:</span> <span class='nx'>Recaptcha</span><span class='p'>.</span><span class='nx'>focus_response_field</span><span class='p'>});</span>
   <span class='p'>}</span>
   <span class='nx'>$</span><span class='p'>(</span><span class='nb'>document</span><span class='p'>).</span><span class='nx'>ready</span><span class='p'>(</span><span class='kd'>function</span><span class='p'>(){</span>
	<span class='nx'>showRecaptcha</span><span class='p'>(</span><span class='s1'>&#39;recaptcha_div&#39;</span><span class='p'>);</span>
	
	<span class='nx'>$</span><span class='p'>(</span><span class='s2'>&quot;#form&quot;</span><span class='p'>).</span><span class='nx'>submit</span><span class='p'>(</span><span class='kd'>function</span><span class='p'>(</span><span class='nx'>ev</span><span class='p'>){</span>
	    <span class='nx'>ev</span><span class='p'>.</span><span class='nx'>preventDefault</span><span class='p'>();</span>
	    <span class='k'>if</span> <span class='p'>(</span><span class='o'>!</span><span class='nx'>$</span><span class='p'>(</span><span class='k'>this</span><span class='p'>).</span><span class='nx'>valid</span><span class='p'>())</span> <span class='k'>return</span><span class='p'>;</span>
	    <span class='nx'>$</span><span class='p'>.</span><span class='nx'>ajax</span><span class='p'>({</span>
	      <span class='nx'>type</span><span class='o'>:</span> <span class='s2'>&quot;post&quot;</span><span class='p'>,</span>
	      <span class='nx'>url</span><span class='o'>:</span> <span class='s2'>&quot;/send&quot;</span><span class='p'>,</span>
	      <span class='nx'>data</span><span class='o'>:</span> <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#form&#39;</span><span class='p'>).</span><span class='nx'>serialize</span><span class='p'>(),</span>
	      <span class='nx'>dataType</span><span class='o'>:</span> <span class='s2'>&quot;json&quot;</span><span class='p'>,</span>
	      <span class='nx'>success</span><span class='o'>:</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>response</span><span class='p'>)</span> <span class='p'>{</span>
		<span class='k'>if</span><span class='p'>(</span><span class='nx'>response</span><span class='p'>.</span><span class='nx'>message</span> <span class='o'>===</span> <span class='s2'>&quot;success&quot;</span><span class='p'>)</span> <span class='p'>{</span>
		  <span class='nx'>$</span><span class='p'>.</span><span class='nx'>ajax</span><span class='p'>({</span>
		      <span class='nx'>type</span><span class='o'>:</span> <span class='s2'>&quot;post&quot;</span><span class='p'>,</span>
		      <span class='nx'>url</span><span class='o'>:</span> <span class='s2'>&quot;/send_email&quot;</span><span class='p'>,</span>
		      <span class='nx'>data</span><span class='o'>:</span> <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#form&#39;</span><span class='p'>).</span><span class='nx'>serialize</span><span class='p'>(),</span>
		      <span class='nx'>dataType</span><span class='o'>:</span> <span class='s2'>&quot;json&quot;</span><span class='p'>,</span>
		      <span class='nx'>success</span><span class='o'>:</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>response</span><span class='p'>)</span> <span class='p'>{</span>
			  <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#form&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;div id=&#39;message&#39;&gt;&lt;/div&gt;&quot;</span><span class='p'>);</span>
			  <span class='k'>if</span><span class='p'>(</span><span class='nx'>response</span><span class='p'>.</span><span class='nx'>message</span> <span class='o'>===</span> <span class='s2'>&quot;success&quot;</span><span class='p'>)</span> <span class='p'>{</span>
			      <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#message&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;h2&gt;Message successfully sent.&lt;/h2&gt;&quot;</span><span class='p'>).</span><span class='nx'>hide</span><span class='p'>().</span><span class='nx'>fadeIn</span><span class='p'>(</span><span class='mi'>1500</span><span class='p'>);</span>
			  <span class='p'>}</span> <span class='k'>else</span> <span class='p'>{</span>
			      <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#message&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;h2&gt;Error sending the message&lt;/h2&gt;&quot;</span><span class='p'>).</span><span class='nx'>hide</span><span class='p'>().</span><span class='nx'>fadeIn</span><span class='p'>(</span><span class='mi'>1500</span><span class='p'>);</span>
			  <span class='p'>}</span>
		      <span class='p'>},</span>
		      <span class='nx'>error</span><span class='o'>:</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>xhr</span><span class='p'>,</span> <span class='nx'>ajaxOptions</span><span class='p'>,</span> <span class='nx'>thrownError</span><span class='p'>){</span>
			  <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#form&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;div id=&#39;message&#39;&gt;&lt;/div&gt;&quot;</span><span class='p'>);</span>
			  <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#message&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;h2&gt;Error sending the message&lt;/h2&gt;&quot;</span><span class='p'>).</span><span class='nx'>hide</span><span class='p'>().</span><span class='nx'>fadeIn</span><span class='p'>(</span><span class='mi'>1500</span><span class='p'>);</span>
		      <span class='p'>}</span> 
		  <span class='p'>});</span>
		<span class='p'>}</span> <span class='k'>else</span> <span class='p'>{</span>
		  <span class='nx'>showRecaptcha</span><span class='p'>(</span><span class='s1'>&#39;recaptcha_div&#39;</span><span class='p'>);</span>
		  <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#notice&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;Captcha failed!&quot;</span><span class='p'>).</span><span class='nx'>hide</span><span class='p'>().</span><span class='nx'>fadeIn</span><span class='p'>(</span><span class='mi'>1500</span><span class='p'>);</span>
		<span class='p'>}</span>
	      <span class='p'>},</span>
	      <span class='nx'>error</span><span class='o'>:</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>xhr</span><span class='p'>,</span> <span class='nx'>ajaxOptions</span><span class='p'>,</span> <span class='nx'>thrownError</span><span class='p'>){</span>
		  <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#form&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;div id=&#39;message&#39;&gt;&lt;/div&gt;&quot;</span><span class='p'>);</span>
		  <span class='nx'>$</span><span class='p'>(</span><span class='s1'>&#39;#message&#39;</span><span class='p'>).</span><span class='nx'>html</span><span class='p'>(</span><span class='s2'>&quot;&lt;h2&gt;Error sending the message&lt;/h2&gt;&quot;</span><span class='p'>).</span><span class='nx'>hide</span><span class='p'>().</span><span class='nx'>fadeIn</span><span class='p'>(</span><span class='mi'>1500</span><span class='p'>);</span>
	      <span class='p'>}</span>
	    <span class='p'>});</span>
	<span class='p'>});</span>
    <span class='p'>});</span>
<span class='nt'>&lt;/script&gt;</span>
</code></pre>
</div>
<p><strong>The code seems a bit tricky :)</strong> but it&#8217;s simple. It just intercepts the form submission, send a first POST call to <em>/send</em> and, if the captcha is verified, generates a second POST call to <em>/send_email</em>, which sends the email. The last piece is the form HTML code:</p>
<div class='highlight'><pre><code class='html'><span class='nt'>&lt;form</span> <span class='na'>id=</span><span class='s'>&quot;form&quot;</span> <span class='na'>method=</span><span class='s'>&quot;post&quot;</span><span class='nt'>&gt;</span>
	<span class='nt'>&lt;label</span> <span class='na'>for=</span><span class='s'>&quot;name&quot;</span><span class='nt'>&gt;</span>Name<span class='nt'>&lt;/label&gt;</span>
	<span class='nt'>&lt;input</span> <span class='na'>type=</span><span class='s'>&quot;text&quot;</span> <span class='na'>name=</span><span class='s'>&quot;name&quot;</span> <span class='na'>id=</span><span class='s'>&quot;name&quot;</span> <span class='nt'>/&gt;</span>

	<span class='nt'>&lt;label</span> <span class='na'>for=</span><span class='s'>&quot;email&quot;</span><span class='nt'>&gt;</span>Email<span class='nt'>&lt;/label&gt;</span>
	<span class='nt'>&lt;input</span> <span class='na'>type=</span><span class='s'>&quot;text&quot;</span> <span class='na'>name=</span><span class='s'>&quot;email&quot;</span> <span class='na'>id=</span><span class='s'>&quot;email&quot;</span> <span class='nt'>/&gt;</span>

	<span class='nt'>&lt;label</span> <span class='na'>for=</span><span class='s'>&quot;message&quot;</span> <span class='na'>class=</span><span class='s'>&quot;label&quot;</span><span class='nt'>&gt;</span>Message<span class='nt'>&lt;/label&gt;</span>
	<span class='nt'>&lt;textarea</span> <span class='na'>name=</span><span class='s'>&quot;message&quot;</span> <span class='na'>id=</span><span class='s'>&quot;message&quot;</span><span class='nt'>&gt;&lt;/textarea&gt;</span>

	<span class='nt'>&lt;div</span> <span class='na'>id=</span><span class='s'>&quot;recaptcha_div&quot;</span><span class='nt'>&gt;&lt;/div&gt;</span>
	<span class='nt'>&lt;div</span> <span class='na'>id=</span><span class='s'>&quot;notice&quot;</span><span class='nt'>&gt;&lt;/div&gt;</span>

	<span class='nt'>&lt;input</span> <span class='na'>class=</span><span class='s'>&quot;submit&quot;</span> <span class='na'>type=</span><span class='s'>&quot;submit&quot;</span> <span class='na'>value=</span><span class='s'>&quot;Send&quot;</span> <span class='nt'>/&gt;</span>
<span class='nt'>&lt;/form&gt;</span>
</code></pre>
</div>
<p>That&#8217;s it, now you can send email from a <em>static</em> website.</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/08/28/create-a-contact-form-for-jekyll/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/08/28/create-a-contact-form-for-jekyll</feedburner:origLink></item>
		
		  <item>
  		<title>Wunderlist on Fedora 17</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/ypzgjq0dneI/wunderlist-on-fedora-17</link>
  		<comments>/2012/08/28/wunderlist-on-fedora-17/#comments</comments>
  		<pubDate>2012-08-28T14:02:03+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/08/28/wunderlist-on-fedora-17</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>After the update to Fedora 17 (64bit), <a href='http://www.6wunderkinder.com/wunderlist/'>Wunderlist</a> stopped woking with the error:</p>

<pre><code>./Wunderlist: symbol lookup error: /lib64/libgdk_pixbuf-2.0.so.0: undefined symbol: g_bytes_unref</code></pre>

<p>It seems to have some problems mixing the internal and the system libraries, so with the help of Google and trying some tricks, I managed to make it work again:</p>

<pre><code>cd Wunderlist-1.2.4/runtime/1.2.0.RC3
rm libglib-2.0.so libglib-2.0.so.0 libproxy.so.0
ln -s /usr/lib64/libproxy.so.1 libproxy.so.0</code></pre>

<p>After this fix the old error disappears but a new one appears:</p>

<pre><code>[Titanium.Host] [Error] Could not load module (~/Wunderlist-1.2.4/modules/tiui/1.2.0.RC3/libtiuimodule.so): &quot;Error loading module (~/Wunderlist-1.2.4/modules/tiui/1.2.0.RC3/libtiuimodule.so): libnotify.so.1</code></pre>

<p>Another symbolic link and <a href='http://www.6wunderkinder.com/wunderlist/'>Wunderlist</a> will work again:</p>

<pre><code>ln -s /usr/lib64/libnotify.so.4 libnotify.so.1</code></pre>

<p>My Fedora is a 64bit o.s. but the error seems to appear with 32bit too. If you&#8217;re working on a 32bit system just check and modify the paths to the libraries (probably <em>/usr/lib</em> instead of <em>/usr/lib64</em>)</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/08/28/wunderlist-on-fedora-17/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/08/28/wunderlist-on-fedora-17</feedburner:origLink></item>
		
		  <item>
  		<title>Rubyfatt 1.0 - software di fatturazione per partite IVA</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/MNvBOkUCfaU/rubyfatt-1.0</link>
  		<comments>/2012/08/23/rubyfatt-1.0/#comments</comments>
  		<pubDate>2012-08-23T12:29:40+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/08/23/rubyfatt-1.0</guid>
  		
  		<description />
  			<content:encoded><![CDATA[

<p>Approfittando della pausa estiva sono riuscito a lavorare un po' su <a href="http://rubyfatt.kreations.it" target="_blank">Rubyfatt</a>, il software che mi sono scritto per la gestione della mia partita IVA.</p>

<p>Senza dilungarmi troppo, dalla versione 1.0 il software è ormai maturo e può essere usato senza problemi (spero). Vi rimando alla  pagina ufficiale all'indirizzo: <a href="http://rubyfatt.kreations.it" target="_blank">http://rubyfatt.kreations.it</a> in cu si trova la lista di tutte le caratteristiche e le istruzioni per installarlo.<br />Ovviamente ogni aiuto è ben accetto, trovate tutto sulla <a href="https://github.com/tommyblue/Rubyfatt" target="_blank">pagina di Github del progetto</a></p>

<h3>Video Demo</h3>
<iframe src="http://player.vimeo.com/video/48064911?color=d60927" width="900" height="506" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/08/23/rubyfatt-1.0/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/08/23/rubyfatt-1.0</feedburner:origLink></item>
		
		  <item>
  		<title>Monitoraggio distribuito con Nagios/Icinga e NSCA</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/mDVXtsIGScg/monitoraggio-distribuito-con-nagiosicinga-e-nsca</link>
  		<comments>/2012/06/13/monitoraggio-distribuito-con-nagiosicinga-e-nsca/#comments</comments>
  		<pubDate>2012-06-13T15:30:15+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/06/13/monitoraggio-distribuito-con-nagiosicinga-e-nsca</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>Sebbene Icinga/Nagios e NRPE siano un&#8217;ottima coppia per monitorare le macchine (sia via socket che internamente), a volte possono non bastare. Potrebbe infatti essere utile distribuire i check su più macchine, sia per un fattore di carico sia per aggirare eventuali firewall.</p>

<p>Partendo quindi da una macchina con un server Icinga o Nagios funzionante, come descritto <a href='http://tommyblue.it/2011/03/08/realizzare-un-sistema-di-monitoraggio-con-icinga'>qui</a>, mostrerò come configurare un secondo server remoto che comunica via NSCA il risultato dei check al server principale.</p>

<h1 id='configurazione_del_server_distribuito_client'>Configurazione del server distribuito (client)</h1>

<p>Sulla macchina client (Ubuntu server 12.04 LTS) si installano i seguenti pacchetti:</p>

<pre><code>sudo apt-get install icinga-core nsca nagios-plugins-extra</code></pre>

<p>Bisogna configurare <em>/etc/send_nsca.cfg</em> inserendo la password e la scelta di cifratura. Entrambi i dati andranno fedelmente riprodotti nel server NSCA.</p>

<p>Adesso si edita il file <em>/etc/icinga/commands.cfg</em> aggiungendo il comando che invierà i dati al server NSCA:</p>

<pre><code>define command{
    command_name    submit_check_result
    command_line    /usr/share/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca $HOSTNAME$ &#39;$SERVICEDESC$&#39; $SERVICESTATEID$ &#39;$SERVICEOUTPUT$&#39;
}</code></pre>

<p>Nel file <em>/usr/share/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca</em> bisogna editare la variabile <em>IcingaHost</em> con l&#8217;hostname del server Icinga principale.</p>

<p>Il concetto di funzionamento del monitoraggio distribuito è che i server secondari inviano al master i risultati dei check. Per farlo bisogna attivare il servizio OCSP (<strong>obsessive compulsive service processor</strong>) in <em>/etc/icinga/icinga.cfg</em> dicendogli di usare il comando precedentemente definito per comunicare al server NSCA i risultati dei check:</p>

<pre><code>obsess_over_services=1
ocsp_command=submit_check_result
ocsp_timeout=5</code></pre>

<p>Dato che il server slave deve soltanto comunicare i risultati dei check, si disabilitano le notifiche dei servizi in <em>objects/generic-service_icinga.cfg</em> impostando:</p>

<pre><code>notifications_enabled   0</code></pre>

<p>In questo modo eventuali allarmi partiranno soltanto dal server principale.</p>

<p>Per finire si può definire un check base:</p>

<pre><code>define host{
        use                     generic-host
        host_name               base-icinga
        alias                   Icinga server
        address                 127.0.0.1
}

define service{
        use                             generic-service
        host_name                       base-icinga
        service_description             Disk Space
        check_command                   check_all_disks!20%!10%
}</code></pre>

<h1 id='integrazione_di_nsca_nel_server_principale_e_ricezione_dei_check_passivi'>Integrazione di NSCA nel server principale e ricezione dei check passivi</h1>

<p>Passiamo al server principale e per prima cosa definiamo un servizio passivo:</p>

<pre><code>define service{
    use                     generic-service   ; template to inherit from
    name                    passive-service   ; name of this template
    active_checks_enabled   0                 ; no active checks
    passive_checks_enabled  1                 ; allow passive checks
    check_command           check_dummy!0     ; use &quot;check_dummy&quot;, RC=0 (OK)
    check_period            24x7              ; check active all the time
    check_freshness         0                 ; don&#39;t check if check result is &quot;stale&quot;
    register                0                 ; this is a template, not a real service
    }</code></pre>

<p>Tale template verrà usato per ogni servizio passivo.</p>

<p>Per abilitare la ricezione di check passivi in <em>icinga.cfg</em> devono essere presenti:</p>

<pre><code>check_external_commands=1
command_check_interval=&lt;n&gt;[s]
log_passive_checks=1</code></pre>

<p>Si faccia attenzione: i check passivi non arriveranno dal server slave, ma dal server NSCA che sarà installato su questa stessa macchina e che li passa a Icinga. Si installa quindi il pacchetto <strong>nsca</strong> e si configura <em>/etc/nsca.cfg</em>, ricordandosi di settare la password e la cifratura inseriti nel client. Si dia un occhio anche ad altre configurazioni, ad esempio il percorso al file che accetta i check passivi, nel mio caso:</p>

<pre><code>command_file=/usr/local/icinga/var/rw/icinga.cmd</code></pre>

<p>Una volta avviato il server NSCA (standalone o via xinetd) se dal client si lancia una connessione questo dovrebbe essere il risultato:</p>

<pre><code>echo -e &quot;A\tB\tC\tD\n&quot; | /usr/share/icinga/plugins/eventhandlers/distributed-monitoring/submit_check_result_via_nsca
0 data packet(s) sent to host successfully.</code></pre>

<p>Adesso si può definire l&#8217;host e il check passivo:</p>

<pre><code>define host {
        use             drwolf-server
        host_name       base-icinga
        alias           Icinga@base
        address         127.0.0.1
}

define service{
    use                     passive-service
    host_name               base-icinga
    service_description     Current Users
    }</code></pre>

<p>Al termine si può riavviare Icinga e tutto dovrebbe essere a posto. Attenzione che il nome dell&#8217;host (<strong>host_name</strong>) e il nome del servizio (<strong>service_description</strong>) siano esattamente gli stessi definiti nello slave, altrimenti nel file <em>/var/log/icinga/icinga.log</em> troverete messaggi come questo:</p>

<pre><code>[1339598868] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;localhost;HTTP;0;HTTP OK: HTTP/1.1 200 OK - 453 bytes in 0,001 second response time
[1339598868] Warning:  Passive check result was received for service &#39;HTTP&#39; on host &#39;localhost&#39;, but the host could not be found!</code></pre>

<p>Se invece va tutto bene troverete nel log questi messaggi:</p>

<pre><code>[1339599272] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;base-icinga;Current Users;0;USERS OK - 1 users currently logged in
[1339599277] PASSIVE SERVICE CHECK: base-icinga;Current Users;0;USERS OK - 1 users currently logged in</code></pre>

<p>e dall&#8217;interfaccia di Icinga vedrete cambiare lo stato dei vari servizi remoti :)</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/06/13/monitoraggio-distribuito-con-nagiosicinga-e-nsca/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/06/13/monitoraggio-distribuito-con-nagiosicinga-e-nsca</feedburner:origLink></item>
		
		  <item>
  		<title>Screencast al volo su Fedora/Gnome3 e su Mac OSX</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/ggDq9EE-j8s/screencast-al-volo-su-fedora-gnome3-e-su-mac-osx</link>
  		<comments>/2012/05/14/screencast-al-volo-su-fedora-gnome3-e-su-mac-osx/#comments</comments>
  		<pubDate>2012-05-14T14:45:54+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Software Libero]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/05/14/screencast-al-volo-su-fedora-gnome3-e-su-mac-osx</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>Ho recentemente avuto bisogno di creare alcuni screencast e dopo essermi imbattuto in soluzioni più o meno open e più o meno veloci ho trovato due metodi molto veloci per creare screencast sia su Fedora 16 (con Gnome 3), sia su Mac OSX.</p>

<p>Su <strong>Fedora 16</strong> la cosa è veramente banale, basta premere la sequenza di tasti:</p>

<pre><code>CTRL + SHIFT + ALT + R</code></pre>

<p>Alla prima esecuzione partirà la registrazione, alla seconda terminerà. Nella home si troverà un file <strong>.webm</strong> contenente la registrazione.</p>

<p>Su <strong>Mac OSX</strong> invece basta utilizzare <strong>QuickTime Player</strong>. Una volta lanciato si vada in <em>Archivio &gt; Nuova registrazione schermo</em> per creare lo screencast (oppure <em>SHIFT + COMMAND + N</em>). Dallo stesso menù si può avviare una registrazione audio oppure una registrazione audio+video.</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/05/14/screencast-al-volo-su-fedora-gnome3-e-su-mac-osx/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/05/14/screencast-al-volo-su-fedora-gnome3-e-su-mac-osx</feedburner:origLink></item>
		
		  <item>
  		<title>Installare puppet su Ubuntu server 12.04 LTS</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/INgdSB69RoQ/installare-puppet-su-ubuntu-server-1204-lts</link>
  		<comments>/2012/05/09/installare-puppet-su-ubuntu-server-1204-lts/#comments</comments>
  		<pubDate>2012-05-09T11:21:43+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/05/09/installare-puppet-su-ubuntu-server-1204-lts</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img alt='Puppet Labs' src='/uploads/2012/05/puppet-labs-logo.jpg' style='float:left;' />
<p>Sono riuscito finalmente a trovare del tempo per spippolare con <a href='http://puppetlabs.com/'>Puppet</a>, un software per la configurazione centralizzata dei server. Come dice qualcuno: il miglior modo per distribuire un errore su più server con un solo clic :)</p>

<p>Ho intenzione quindi di scrivere una serie di articoli sulla sua installazione, configurazione ed uso. Iniziamo da qui.</p>

<p>In questo articolo illustro come installare <a href='http://puppetlabs.com/'>Puppet</a> (master e un primo nodo) sulla neonata Ubuntu server 12.04 LTS.</p>

<h2 id='prepariamo_lambiente'>Prepariamo l&#8217;ambiente</h2>

<p>La configurazione che ho usato è formata da un server master e uno slave, entrambi 12.04.</p>

<p>Su 12.04 i pacchetti sono sul repository ufficiale, in alternativa Puppet Labs fornisce un repository che può essere aggiunto alle proprie sorgenti con:</p>

<pre><code>~$ wget http://apt.puppetlabs.com/puppetlabs-release_1.0-2_all.deb
~$ sudo dpkg -i puppetlabs-release_1.0-2_all.deb</code></pre>

<p>Per delle più complete istruzioni di installazione vi rimando alla <a href='http://docs.puppetlabs.com/guides/installation.html'>documentazione ufficiale</a>.</p>

<p>I client si connettono al master sulla <strong>porta 8140</strong> quindi si faccia attenzione ai firewall.</p>

<p>I server devono avere hostname con risoluzioni DNS valide (anche <em>reverse</em>). Se nella rete non c&#8217;è un server DNS si può usare il file <em>/etc/hosts</em> sui vari nodi.</p>

<h2 id='master'>Master</h2>

<p>Come di consueto si inizia installando il necessario:</p>

<pre><code>~$ sudo apt-get install puppetmaster</code></pre>

<p>Il pacchetto crea la cartella <em>/etc/puppet</em> con delle configurazioni di base. Si dia un&#8217;occhiata anche alla cartella <em>/usr/share/doc/puppet-common/examples</em> dove ci sono molti file interessanti.</p>

<p>La comunicazione tra i nodi avviene utilizzando SSL e i certificati garantiscono l&#8217;autenticità del master. Pertanto una volta installato il master vanno rigenerati i certificati usando l&#8217;hostname del server.</p>

<p>Si aggiunge al file <em>/etc/puppet/puppet.conf</em>, nella sezione <strong>[master]</strong>, la riga:</p>

<pre><code>dns_alt_names = puppet, puppet.mydomain</code></pre>

<p>ovviamente rispettando il proprio hostname. Se serve si può ottenere col comando:</p>

<pre><code>~$ hostname -f</code></pre>

<p>Vanno inoltre eliminati i certificati esistenti, personalmente consiglio di rinominare la cartella (giusto per essere sicuri..):</p>

<pre><code>~$ sudo mv /var/lib/puppet/ssl/ /var/lib/puppet/ssl-orig</code></pre>

<p>Al riavvio del servizio (<em>sudo service puppetmaster restart</em>), puppet si accorgerà del maltolto e rigenererà i certificati. Per verificare la correttezza del DNS:</p>

<pre><code>~$ sudo openssl x509 -in /var/lib/puppet/ssl/certs/puppet.mydomain.pem -text | grep -i dns</code></pre>

<h2 id='nodo_di_prova'>Nodo di prova</h2>

<p>Passando al nodo slave da usare per le prove, anche in questo caso l&#8217;hostname deve essere risolto dal DNS e deve poter risolvere l&#8217;hostname del master. Fatto questo si può installare il necessario:</p>

<pre><code>~$ sudo apt-get install puppet</code></pre>

<p>Va editato il file <em>/etc/puppet/puppet.conf</em> aggiungendo:</p>

<pre><code>[agent]
server = puppet.mydomain</code></pre>

<p>Si modifica anche <em>/etc/default/puppet</em> impostando l&#8217;avvio al boot:</p>

<pre><code>START=yes</code></pre>

<p>Si può adesso riavviare l&#8217;agent:</p>

<pre><code>~$ sudo service puppet restart</code></pre>

<p>Può essere utile non utilizzare il demone ma far girare puppet con cron (ad esempio sembra che a volte il demone rimanga inchiodato al 100% della CPU). Per creare il job basta lanciare:</p>

<pre><code>~$ sudo puppet resource cron puppet-agent ensure=present user=root minute=30 command=&#39;/usr/bin/puppet agent --onetime --no-daemonize --splay&#39;</code></pre>

<p>Per verificare la regola bisogna guardare il cron di root:</p>

<pre><code>~$ sudo crontab -l
# HEADER: This file was autogenerated at Wed May 09 17:15:29 +0200 2012 by puppet.
# HEADER: While it can still be managed manually, it is definitely not recommended.
# HEADER: Note particularly that the comments starting with &#39;Puppet Name&#39; should
# HEADER: not be deleted, as doing so could cause duplicate cron jobs.
# Puppet Name: puppet-agent
30 * * * * /usr/bin/puppet agent --onetime --no-daemonize --splay</code></pre>

<p>Ovviamente bisogna stoppare puppet e settare in <em>/etc/default/puppet</em>:</p>

<pre><code>START=no</code></pre>

<h2 id='autenticare_il_nodo'>Autenticare il nodo</h2>

<p>Se tutto è andato bene il master dovrebbe aver rilevato lo slave, si può verificare lanciando sul master:</p>

<pre><code>~$ sudo puppet cert --list
slave.mydomain (12:A1:08:DD:A4:40:16:A4:DC:C8:46:37:4C:46:93:E3)</code></pre>

<p>Bingo! Firmiamo la chiave dello slave usando il master:</p>

<pre><code>~$ sudo puppet cert --sign slave.mydomain
notice: Signed certificate request for slave.mydomain
notice: Removing file Puppet::SSL::CertificateRequest slave.mydomain at &#39;/var/lib/puppet/ssl/ca/requests/slave.mydomain.pem&#39;</code></pre>

<h2 id='test'>Test</h2>

<p>Proviamo a vedere se il tutto funziona creando un modulo <strong>&#8220;HelloWorld&#8221;</strong>. Si crea il file necessario:</p>

<pre><code>~$ sudo mkdir -p /etc/puppet/modules/helloworld/manifests/
~$ sudo vi /etc/puppet/modules/helloworld/manifests/init.pp</code></pre>

<p>Il contenuto del file <em>init.pp</em> è:</p>

<pre><code>class helloworld {
    file { &#39;/tmp/helloFromMaster&#39;:
        content =&gt; &quot;Hello, World!\n&quot;
    }
}</code></pre>

<p>Si edita il manifesto generale <em>/etc/puppet/manifests/site.pp</em> aggiungendo:</p>

<pre><code>node slave.mydomain { include helloworld }</code></pre>

<p>e infine:</p>

<pre><code>~$ sudo service puppetmaster restart</code></pre>

<p>Dopo qualche tempo lo slave si accorgerà del cambiamento creando il file <em>/tmp/helloFromMaster</em>. Per accelerare la cosa basta riavviare il servizio sullo slave (o aspettare il cron).</p>

<h2 id='server_di_produzione'>Server di produzione</h2>

<p>Di base il pacchetto <strong>puppetmaster</strong> utilizza Webrick, molto comodo ma anche molto lento. In un ambiente di produzione è utile installare il pacchetto <strong>puppetmaster-passenger</strong> che utilizza, appunto, Passenger. Prima di farlo bisogna ricordarsi di fermare il servizio <strong>puppetmaster</strong> e modificare <em>/etc/default/puppetmaster</em> impostando:</p>

<pre><code>SERVERTYPE=passenger</code></pre>

<p>A questo punto si può installare <strong>puppetmaster-passenger</strong> e riavviare il servizio <strong>puppetmaster</strong>. Troverete in <em>/etc/apache2/sites-enabled/puppetmaster</em> la configurazione di passenger.</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/05/09/installare-puppet-su-ubuntu-server-1204-lts/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/05/09/installare-puppet-su-ubuntu-server-1204-lts</feedburner:origLink></item>
		
		  <item>
  		<title>Rubyfatt - software di fatturazione per partite IVA</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/ybNKWQii1G4/rubyfatt-software-di-fatturazione-per-partite-iva</link>
  		<comments>/2012/05/07/rubyfatt-software-di-fatturazione-per-partite-iva/#comments</comments>
  		<pubDate>2012-05-07T01:53:00+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/05/07/rubyfatt-software-di-fatturazione-per-partite-iva</guid>
  		
  		<description />
  			<content:encoded><![CDATA[

<h2><a href="/2012/08/23/rubyfatt-1.0">UPDATE: Ho scritto un articolo aggiornato su Rubyfatt 1.0, vai a leggerlo &raquo;</a></h2>

<p>A Gennaio ho cambiato regime di partita IVA e con esso anche il calcolo delle tasse sulle notule. Dopo vani sforzi ho deciso che il mio caro Billings non sarebbe mai stato in grado di capire le particolarissime tasse nostrane e ho deciso di scrivermi un software per gestire le mie notule. Ovviamente l'ho scritto usando Ruby on Rails ed è open-source (lo trovate su <a href="https://github.com/tommyblue/Rubyfatt/">Github</a>).</p>
<p>In pochi giorni è nato un abbozzo di software in grado comunque di emettere le prime notule ed esportarle in PDF. Col tempo il software è notevolmente migliorato e, anche se non ho ancora deciso di pubblicare la versione 1.0, sul <a href="https://github.com/tommyblue/Rubyfatt/issues">bugtracker di Github</a> ho segnato le modifiche da apportare per poter raggiungere la versione stabile. <strong>Ovviamente chiunque è invitato a provare il software e a proporre patch e correzioni.</strong></p>
<p>Qui di seguito propongo un breve filmato che illustra velocemente le caratteristiche principali del software. Come vedrete non ho nascosto ciò che ancora manca, ma quel che c'è funziona piuttosto bene :)</p>

<h4>Se siete curiosi di provarlo ho creato una paginetta con tutte le istruzioni necessarie: <a href="http://rubyfatt.kreations.it" target="_blank">http://rubyfatt.kreations.it</a></h4>

<iframe width="900" height="500" frameborder="0" allowfullscreen="" webkitallowfullscreen="mozallowfullscreen" src="http://player.vimeo.com/video/48064911?color=d60927">
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/05/07/rubyfatt-software-di-fatturazione-per-partite-iva/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/05/07/rubyfatt-software-di-fatturazione-per-partite-iva</feedburner:origLink></item>
		
		  <item>
  		<title>Sostituire un disco in un raid software</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/5DBps8LrjZE/sostituire-un-disco-in-un-raid-software</link>
  		<comments>/2012/04/26/sostituire-un-disco-in-un-raid-software/#comments</comments>
  		<pubDate>2012-04-26T15:47:30+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/04/26/sostituire-un-disco-in-un-raid-software</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>Ho recentemente scoperto un&#8217;interessante opzione di <em>sfdisk</em> che risolve molti problemi quando si deve sostituire un disco di un raid software. Integro quindi <a href='/2010/09/28/sostituire-un-disco-in-un-raid-1-con-mdadm/'>l&#8217;articolo originale</a> segnlando questa opzione, da usare nel caso in cui al comando:</p>

<pre><code>sfdisk -d /dev/sda | sfdisk /dev/sdb</code></pre>

<p>sfdisk si rifiuti di partizionare correttamente <em>/dev/sdb</em> a causa di problemi con i cilindri. Dato che Linux è molto meno schizzinoso del DOS, esiste un&#8217;opzione per ignorare problemi che con Linux, appunto, non sono tali:</p>

<pre><code>sfdisk -d /dev/sda | sfdisk --Linux /dev/sdb</code></pre>

<p>et voilà! :)</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/04/26/sostituire-un-disco-in-un-raid-software/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/04/26/sostituire-un-disco-in-un-raid-software</feedburner:origLink></item>
		
		  <item>
  		<title>Bind Log Analyzer: Simple analysis and SQL storage for Bind logs</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/UD_wbv3luOM/bind-log-analyzer-simple-analysis-and-sql-storage-for-bind-dns-server-logs</link>
  		<comments>/2012/04/03/bind-log-analyzer-simple-analysis-and-sql-storage-for-bind-dns-server-logs/#comments</comments>
  		<pubDate>2012-04-03T17:34:43+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/04/03/bind-log-analyzer-simple-analysis-and-sql-storage-for-bind-dns-server-logs</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p><img alt='Bind Log Analyzer web interface' src='http://f.cl.ly/items/0A1A173R3b012R1V2x2b/bind_log_analyzer_screenshot_1.jpg' /></p>

<p>Bind Log Analyzer is my first gem :)</p>

<p>It analyzes a Bind query log file and stores the logs into a database (using ActiveRecord). See the details and the source code on <a href='https://github.com/tommyblue/Bind-Log-Analyzer'>GitHub</a> and get the gem on <a href='https://rubygems.org/gems/bind_log_analyzer'>RubyGems</a>. Or simply install it with:</p>

<pre><code>gem install bind_log_analyzer</code></pre>

<p>Starting from version 0.2.1 it includes a simple <a href='http://www.sinatrarb.com/'>Sinatra</a> webserver to show some reports and (soon) some cool graphs.</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/04/03/bind-log-analyzer-simple-analysis-and-sql-storage-for-bind-dns-server-logs/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/04/03/bind-log-analyzer-simple-analysis-and-sql-storage-for-bind-dns-server-logs</feedburner:origLink></item>
		
		  <item>
  		<title>Retjilp: un bot di auto-retweeting</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/U_kiv_AkrT4/retjilp-un-bot-di-auto-retweeting</link>
  		<comments>/2012/03/25/retjilp-un-bot-di-auto-retweeting/#comments</comments>
  		<pubDate>2012-03-25T19:21:14+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/03/25/retjilp-un-bot-di-auto-retweeting</guid>
  		
  		<description />
  			<content:encoded><![CDATA[

Ho recentemente forkato <a href="https://github.com/tommyblue/retjilp" target="_blank">Retjilp</a>, un bot di auto-retweeting.
Retjilp si connette al proprio account Twitter, analizza gli account che si seguono e effettua il retweet di ci&ograve; che contiene le parole a cui siamo interessati.
Col mio fork ho praticamente riscritto l'applicazione rendendola molto pi&ugrave; Rubesca :) e ho aggiunto alcune caratteristiche:
<ul>
<li>&egrave; semplice aggiungere opzioni dato che ho usato la libreria <strong>optparse</strong></li>
<li>il logging pu&ograve; essere configurato in modo pi&ugrave; puntuale</li>
<li>&egrave; possibile configurare quanti retweet effettuare per ogni ciclo e quanti effettuarne per ogni utente</li>
</ul>
Lo script viene attualmente usato da <a href="https://twitter.com/#!/TopTweetsItaly" target="_blank">@TopTweetsItaly</a>, se vi interessa lo potete clonare o forkare dal <a href="https://github.com/tommyblue/retjilp" target="_blank">mio repository su Github</a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/03/25/retjilp-un-bot-di-auto-retweeting/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/03/25/retjilp-un-bot-di-auto-retweeting</feedburner:origLink></item>
		
		  <item>
  		<title>Mandare notifiche SMS con Skebby da QNAP</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/5bn4EalxhZE/mandare-notifiche-sms-con-skebby-da-qnap</link>
  		<comments>/2012/02/28/mandare-notifiche-sms-con-skebby-da-qnap/#comments</comments>
  		<pubDate>2012-02-28T17:53:00+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[How-To]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=/2012/02/28/mandare-notifiche-sms-con-skebby-da-qnap</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p><a href='/2012/01/18/notifiche-sms-gratis-con-nagiosicinga-e-skebby/'>Sempre in tema di SMS via Skebby</a> condivido queste poche righe di codice scritte per permettere a QNAP di inviare SMS utilizzando Skebby. Infatti, sebbene QNAP supporti le notifiche SMSC, la sua interfaccia non è particolarmente malleabile e le <a href='http://www.skebby.it/business/index/send-docs/#sendSMSSkebby0centMethodSection'>API di Skebby</a> sono&#8230; diciamo &#8220;strane&#8221; (vabbè, oggi mi sento buono). In particolare Skebby vuole il <em>sender</em> e i <em>recipients</em> (il sender da documentazione è opzionale, ma senza non funziona) in formato <em>semi-internazionale</em>, formato tutto nostrano in cui il <em>+</em> o lo <em>00</em> iniziale sono omessi. Dato che il QNAP non prevede questo fantasmagorico formato ho scritto un minuscolo proxy in Ruby usando <a href='http://www.sinatrarb.com/'>Sinatra</a>.</p>

<p>Il codice è molto acerbo, volendo si potrebbe gestire la possibilità di impostare più recipients, selezionare o meno SSL, impostare il sender, gestire gli errori, ecc, ma mi serviva alla svelta e così&#8230; eccolo qui di seguito:</p>
<div class='highlight'><pre><code class='ruby'><span class='lineno'> 1</span> <span class='nb'>require</span> <span class='s1'>&#39;rubygems&#39;</span>
<span class='lineno'> 2</span> <span class='nb'>require</span> <span class='s1'>&#39;sinatra&#39;</span>
<span class='lineno'> 3</span> <span class='nb'>require</span> <span class='s1'>&#39;net/http&#39;</span>
<span class='lineno'> 4</span> <span class='nb'>require</span> <span class='s1'>&#39;uri&#39;</span>
<span class='lineno'> 5</span> 
<span class='lineno'> 6</span> <span class='n'>get</span> <span class='s1'>&#39;/username/:username/password/:password/recipients/:recipients/text/:text&#39;</span> <span class='k'>do</span>
<span class='lineno'> 7</span> 	<span class='vi'>@url</span> <span class='o'>=</span> <span class='s1'>&#39;http://gateway.skebby.it/api/send/smsskebby/advanced/http.php&#39;</span>
<span class='lineno'> 8</span> 	<span class='vi'>@url_ssl</span> <span class='o'>=</span> <span class='s1'>&#39;https://gateway.skebby.it/api/send/smsskebby/advanced/http.php&#39;</span>
<span class='lineno'> 9</span> 	<span class='n'>uri</span> <span class='o'>=</span> <span class='no'>URI</span><span class='p'>(</span><span class='vi'>@url</span><span class='p'>)</span>
<span class='lineno'>10</span> 	<span class='n'>res</span> <span class='o'>=</span> <span class='no'>Net</span><span class='o'>::</span><span class='no'>HTTP</span><span class='o'>.</span><span class='n'>post_form</span><span class='p'>(</span><span class='n'>uri</span><span class='p'>,</span> 
<span class='lineno'>11</span> 		<span class='p'>{</span>
<span class='lineno'>12</span> 			<span class='s1'>&#39;method&#39;</span> <span class='o'>=&gt;</span> <span class='s1'>&#39;send_sms&#39;</span><span class='p'>,</span>
<span class='lineno'>13</span> 			<span class='s1'>&#39;username&#39;</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='s1'>&#39;username&#39;</span><span class='o'>]</span><span class='p'>,</span>
<span class='lineno'>14</span> 			<span class='s1'>&#39;password&#39;</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='s1'>&#39;password&#39;</span><span class='o'>]</span><span class='p'>,</span>
<span class='lineno'>15</span> 			<span class='s1'>&#39;recipients[]&#39;</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='s1'>&#39;recipients&#39;</span><span class='o'>].</span><span class='n'>sub</span><span class='p'>(</span><span class='sr'>/0{2}|[+]/</span><span class='p'>,</span> <span class='s1'>&#39;&#39;</span><span class='p'>),</span>
<span class='lineno'>16</span> 			<span class='c1'># Imposto il sender come il recipient</span>
<span class='lineno'>17</span> 			<span class='s1'>&#39;sender_number&#39;</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='s1'>&#39;recipients&#39;</span><span class='o'>].</span><span class='n'>sub</span><span class='p'>(</span><span class='sr'>/0{2}|[+]/</span><span class='p'>,</span> <span class='s1'>&#39;&#39;</span><span class='p'>),</span>
<span class='lineno'>18</span> 			<span class='s1'>&#39;text&#39;</span> <span class='o'>=&gt;</span> <span class='n'>params</span><span class='o'>[</span><span class='s1'>&#39;text&#39;</span><span class='o'>].</span><span class='n'>gsub</span><span class='p'>(</span><span class='sr'>/\+/</span><span class='p'>,</span> <span class='s1'>&#39; &#39;</span><span class='p'>)</span>
<span class='lineno'>19</span> 		<span class='p'>})</span>
<span class='lineno'>20</span> 
<span class='lineno'>21</span>     <span class='nb'>puts</span> <span class='n'>res</span><span class='o'>.</span><span class='n'>body</span>
<span class='lineno'>22</span>     <span class='s2'>&quot;OK&quot;</span>
<span class='lineno'>23</span> <span class='k'>end</span>
</code></pre>
</div>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/02/28/mandare-notifiche-sms-con-skebby-da-qnap/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/02/28/mandare-notifiche-sms-con-skebby-da-qnap</feedburner:origLink></item>
		
		  <item>
  		<title>Notifiche SMS gratis con Nagios/Icinga e Skebby</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/983_77NECVE/notifiche-sms-gratis-con-nagiosicinga-e-skebby</link>
  		<comments>/2012/01/18/notifiche-sms-gratis-con-nagiosicinga-e-skebby/#comments</comments>
  		<pubDate>2012-01-18T12:26:25+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1291</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p>Ho scritto un po&#8217; di codice Ruby in grado di mandare SMS gratis con <a href='http://smsgratis.skebby.it/'>Skebby</a> utilizzando due account per privati (funziona anche con uno soltanto sia come mittente che destinatario). L&#8217;account Skebby deve essere attivo attivo e dovete aver abilitato username e password (dal pannello di gestione utente).</p>

<p>Lo script è questo:</p>
<div class='highlight'><pre><code class='ruby'><span class='lineno'>  1</span> <span class='c1'>#!/usr/bin/env ruby</span>
<span class='lineno'>  2</span> <span class='c1'># Copyright 2012 by Tommaso Visconti</span>
<span class='lineno'>  3</span> <span class='c1'>#</span>
<span class='lineno'>  4</span> <span class='c1'># This code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License</span>
<span class='lineno'>  5</span> <span class='c1'># as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</span>
<span class='lineno'>  6</span> <span class='c1'>#</span>
<span class='lineno'>  7</span> <span class='c1'># This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty</span>
<span class='lineno'>  8</span> <span class='c1'># of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</span>
<span class='lineno'>  9</span> <span class='c1'>#</span>
<span class='lineno'> 10</span> <span class='c1'># The full text of the GNU General Public License can be found here: http://www.gnu.org/licenses/gpl.txt</span>
<span class='lineno'> 11</span> <span class='nb'>require</span> <span class='s1'>&#39;net/http&#39;</span>
<span class='lineno'> 12</span> <span class='nb'>require</span> <span class='s1'>&#39;uri&#39;</span>
<span class='lineno'> 13</span> <span class='nb'>require</span> <span class='s1'>&#39;cgi&#39;</span>
<span class='lineno'> 14</span> <span class='vg'>$SENDER</span> <span class='o'>=</span> <span class='s1'>&#39;393XXXXXXXXX&#39;</span>
<span class='lineno'> 15</span> <span class='vg'>$RECIPIENT</span> <span class='o'>=</span> <span class='s1'>&#39;393XXXXXXXXY&#39;</span>
<span class='lineno'> 16</span> <span class='vg'>$USERNAME</span> <span class='o'>=</span> <span class='s1'>&#39;my_username&#39;</span>
<span class='lineno'> 17</span> <span class='vg'>$PASSWORD</span> <span class='o'>=</span> <span class='s1'>&#39;my_password&#39;</span>
<span class='lineno'> 18</span> <span class='c1'># The class sends free SMS using the Skebby API</span>
<span class='lineno'> 19</span> <span class='c1'># @author Tommaso Visconti</span>
<span class='lineno'> 20</span> 
<span class='lineno'> 21</span> <span class='k'>class</span> <span class='nc'>SkebbyGatewaySendSMS</span>
<span class='lineno'> 22</span> 
<span class='lineno'> 23</span>   <span class='c1'># Initializes the object</span>
<span class='lineno'> 24</span>   <span class='c1'># @param username [String] The Skebby username</span>
<span class='lineno'> 25</span>   <span class='c1'># @param text [String] The text of the SMS</span>
<span class='lineno'> 26</span>   <span class='c1'># @param recipients [Array] The recipients of the message</span>
<span class='lineno'> 27</span>   <span class='c1'># @param sender [String] The SMS sender</span>
<span class='lineno'> 28</span>   <span class='k'>def</span> <span class='nf'>initialize</span><span class='p'>(</span><span class='n'>username</span> <span class='o'>=</span> <span class='s1'>&#39;&#39;</span><span class='p'>,</span> <span class='n'>text</span> <span class='o'>=</span> <span class='s1'>&#39;&#39;</span><span class='p'>,</span> <span class='n'>recipient</span> <span class='o'>=</span> <span class='s1'>&#39;&#39;</span><span class='p'>,</span> <span class='n'>sender</span> <span class='o'>=</span> <span class='s1'>&#39;&#39;</span><span class='p'>)</span>
<span class='lineno'> 29</span> 
<span class='lineno'> 30</span>     <span class='vi'>@url</span> <span class='o'>=</span> <span class='s1'>&#39;http://gateway.skebby.it/api/send/smsskebby/advanced/http.php&#39;</span>
<span class='lineno'> 31</span> 
<span class='lineno'> 32</span>     <span class='n'>sms_method</span> <span class='o'>=</span> <span class='s1'>&#39;send_sms&#39;</span>
<span class='lineno'> 33</span> 
<span class='lineno'> 34</span>     <span class='c1'>#@recipients = getRecipients(recipients)</span>
<span class='lineno'> 35</span> 
<span class='lineno'> 36</span>     <span class='vi'>@parameters</span> <span class='o'>=</span> <span class='p'>{</span>
<span class='lineno'> 37</span>       <span class='s1'>&#39;method&#39;</span> <span class='o'>=&gt;</span> <span class='n'>sms_method</span><span class='p'>,</span>
<span class='lineno'> 38</span>       <span class='s1'>&#39;username&#39;</span> <span class='o'>=&gt;</span> <span class='n'>username</span><span class='p'>,</span>
<span class='lineno'> 39</span>       <span class='s1'>&#39;password&#39;</span> <span class='o'>=&gt;</span> <span class='nb'>self</span><span class='o'>.</span><span class='n'>getPassword</span><span class='p'>,</span>
<span class='lineno'> 40</span>       <span class='s1'>&#39;text&#39;</span> <span class='o'>=&gt;</span> <span class='n'>text</span><span class='p'>,</span>
<span class='lineno'> 41</span>       <span class='s1'>&#39;recipients[]&#39;</span> <span class='o'>=&gt;</span> <span class='n'>recipient</span><span class='p'>,</span>
<span class='lineno'> 42</span>       <span class='s1'>&#39;sender_number&#39;</span> <span class='o'>=&gt;</span> <span class='n'>sender</span>
<span class='lineno'> 43</span>     <span class='p'>}</span>
<span class='lineno'> 44</span>   <span class='k'>end</span>
<span class='lineno'> 45</span> 
<span class='lineno'> 46</span>   <span class='c1'># Sends the HTTP request</span>
<span class='lineno'> 47</span>   <span class='c1'># @return [Boolean] The result of the HTTP request</span>
<span class='lineno'> 48</span>   <span class='c1'># @note It returns the result of the HTTP request, not the result of the sending. Use getResponse() or printResponse() to check that!</span>
<span class='lineno'> 49</span>   <span class='k'>def</span> <span class='nf'>sendSMS</span>
<span class='lineno'> 50</span>     <span class='vi'>@response</span> <span class='o'>=</span> <span class='no'>Net</span><span class='o'>::</span><span class='no'>HTTP</span><span class='o'>.</span><span class='n'>post_form</span><span class='p'>(</span><span class='no'>URI</span><span class='p'>(</span><span class='vi'>@url</span><span class='p'>),</span> <span class='vi'>@parameters</span><span class='p'>)</span>
<span class='lineno'> 51</span> 
<span class='lineno'> 52</span>     <span class='vi'>@response</span><span class='o'>.</span><span class='n'>message</span> <span class='o'>==</span> <span class='s2'>&quot;OK&quot;</span> <span class='p'>?</span> <span class='kp'>true</span> <span class='p'>:</span> <span class='kp'>false</span>
<span class='lineno'> 53</span>   <span class='k'>end</span>
<span class='lineno'> 54</span> 
<span class='lineno'> 55</span>   <span class='c1'># Return the response from the server</span>
<span class='lineno'> 56</span>   <span class='c1'># @return [Hash] The hash containing the result of the sending</span>
<span class='lineno'> 57</span>   <span class='k'>def</span> <span class='nf'>getResponse</span>
<span class='lineno'> 58</span>     <span class='n'>result</span> <span class='o'>=</span> <span class='p'>{}</span>
<span class='lineno'> 59</span>     <span class='vi'>@response</span><span class='o'>.</span><span class='n'>body</span><span class='o'>.</span><span class='n'>split</span><span class='p'>(</span><span class='s1'>&#39;&amp;&#39;</span><span class='p'>)</span><span class='o'>.</span><span class='n'>each</span> <span class='k'>do</span> <span class='o'>|</span><span class='n'>res</span><span class='o'>|</span>
<span class='lineno'> 60</span>     <span class='k'>if</span> <span class='n'>res</span> <span class='o'>!=</span> <span class='s1'>&#39;&#39;</span>
<span class='lineno'> 61</span>       <span class='n'>temp</span> <span class='o'>=</span> <span class='n'>res</span><span class='o'>.</span><span class='n'>split</span><span class='p'>(</span><span class='s1'>&#39;=&#39;</span><span class='p'>)</span>
<span class='lineno'> 62</span>       <span class='k'>if</span> <span class='n'>temp</span><span class='o'>.</span><span class='n'>size</span> <span class='o'>&gt;</span> <span class='mi'>1</span>
<span class='lineno'> 63</span>         <span class='n'>result</span><span class='o'>[</span><span class='n'>temp</span><span class='o'>[</span><span class='mi'>0</span><span class='o'>]]</span> <span class='o'>=</span> <span class='n'>temp</span><span class='o'>[</span><span class='mi'>1</span><span class='o'>]</span>
<span class='lineno'> 64</span>       <span class='k'>end</span>
<span class='lineno'> 65</span>     <span class='k'>end</span>
<span class='lineno'> 66</span>   <span class='k'>end</span>
<span class='lineno'> 67</span> 
<span class='lineno'> 68</span>   <span class='k'>return</span> <span class='n'>result</span>
<span class='lineno'> 69</span>   <span class='k'>end</span>
<span class='lineno'> 70</span> 
<span class='lineno'> 71</span>   <span class='c1'># Prints the response in human-readable format</span>
<span class='lineno'> 72</span>   <span class='c1'># @return [Boolean] The result of the SMS sending</span>
<span class='lineno'> 73</span>   <span class='k'>def</span> <span class='nf'>printResponse</span>
<span class='lineno'> 74</span>     <span class='n'>result</span> <span class='o'>=</span> <span class='nb'>self</span><span class='o'>.</span><span class='n'>getResponse</span>
<span class='lineno'> 75</span>     <span class='k'>if</span> <span class='n'>result</span><span class='o'>.</span><span class='n'>has_key?</span><span class='p'>(</span><span class='s1'>&#39;status&#39;</span><span class='p'>)</span> <span class='ow'>and</span> <span class='n'>result</span><span class='o'>[</span><span class='s1'>&#39;status&#39;</span><span class='o'>]</span> <span class='o'>==</span> <span class='s1'>&#39;success&#39;</span>
<span class='lineno'> 76</span>       <span class='nb'>puts</span> <span class='s2'>&quot;SMS sent successfully&quot;</span>
<span class='lineno'> 77</span>       <span class='kp'>true</span>
<span class='lineno'> 78</span>     <span class='k'>else</span>
<span class='lineno'> 79</span>       <span class='nb'>puts</span> <span class='s2'>&quot;Error sending the SMS, printing the full trace:&quot;</span>
<span class='lineno'> 80</span>       <span class='n'>result</span><span class='o'>.</span><span class='n'>each</span> <span class='k'>do</span> <span class='o'>|</span><span class='n'>key</span><span class='p'>,</span><span class='n'>value</span><span class='o'>|</span>
<span class='lineno'> 81</span>         <span class='nb'>puts</span> <span class='s2'>&quot;</span><span class='se'>\t</span><span class='si'>#{</span><span class='n'>key</span><span class='si'>}</span><span class='s2'> =&gt; </span><span class='si'>#{</span><span class='no'>CGI</span><span class='o'>::</span><span class='n'>unescape</span><span class='p'>(</span><span class='n'>value</span><span class='p'>)</span><span class='si'>}</span><span class='s2'>&quot;</span>
<span class='lineno'> 82</span>       <span class='k'>end</span>
<span class='lineno'> 83</span>       <span class='kp'>false</span>
<span class='lineno'> 84</span>     <span class='k'>end</span>
<span class='lineno'> 85</span>   <span class='k'>end</span>
<span class='lineno'> 86</span> 
<span class='lineno'> 87</span>   <span class='c1'># Encodes the recipients in the correct format</span>
<span class='lineno'> 88</span>   <span class='c1'># @param recipients [Array] The Array containing the recipients as String in the format 3912345678 (without + or 00 at the beginning)</span>
<span class='lineno'> 89</span>   <span class='c1'># @return [String] The String in the format accepted by the server</span>
<span class='lineno'> 90</span>   <span class='c1'># @note This method uses CGI::escape to escape the recipients</span>
<span class='lineno'> 91</span>   <span class='k'>def</span> <span class='nf'>getRecipients</span><span class='p'>(</span><span class='n'>recipients</span><span class='p'>)</span>
<span class='lineno'> 92</span>     <span class='n'>recipients</span><span class='o'>.</span><span class='n'>inject</span><span class='p'>(</span><span class='s1'>&#39;&#39;</span><span class='p'>)</span> <span class='k'>do</span> <span class='o'>|</span><span class='n'>result</span><span class='p'>,</span> <span class='n'>number</span><span class='o'>|</span>
<span class='lineno'> 93</span>     <span class='n'>result</span> <span class='o'>&lt;&lt;</span> <span class='s1'>&#39;&amp;&#39;</span> <span class='k'>unless</span> <span class='n'>number</span> <span class='o'>==</span> <span class='n'>recipients</span><span class='o'>.</span><span class='n'>first</span>
<span class='lineno'> 94</span>     <span class='n'>result</span> <span class='o'>&lt;&lt;</span> <span class='s2'>&quot;recipients[]=</span><span class='si'>#{</span><span class='no'>CGI</span><span class='o'>::</span><span class='n'>escape</span><span class='p'>(</span><span class='n'>number</span><span class='p'>)</span><span class='si'>}</span><span class='s2'>&quot;</span> <span class='k'>end</span> 
<span class='lineno'> 95</span>   <span class='k'>end</span> 
<span class='lineno'> 96</span>   
<span class='lineno'> 97</span>   <span class='c1'># Obtains the password from the command line hiding the input </span>
<span class='lineno'> 98</span>   <span class='c1'># @return (String) The given password </span>
<span class='lineno'> 99</span>   <span class='k'>def</span> <span class='nf'>getPassword</span> 
<span class='lineno'>100</span>     <span class='k'>unless</span> <span class='vg'>$PASSWORD</span><span class='o'>.</span><span class='n'>nil?</span>
<span class='lineno'>101</span>       <span class='n'>password</span> <span class='o'>=</span> <span class='vg'>$PASSWORD</span> 
<span class='lineno'>102</span>     <span class='k'>else</span> 
<span class='lineno'>103</span>       <span class='nb'>puts</span> <span class='s2'>&quot;Password:&quot;</span> 
<span class='lineno'>104</span>       <span class='nb'>system</span> <span class='s2'>&quot;stty -echo&quot;</span> 
<span class='lineno'>105</span>       <span class='n'>password</span> <span class='o'>=</span> <span class='vg'>$stdin</span><span class='o'>.</span><span class='n'>gets</span><span class='o'>.</span><span class='n'>chomp</span> 
<span class='lineno'>106</span>       <span class='nb'>system</span> <span class='s2'>&quot;stty echo&quot;</span> 
<span class='lineno'>107</span>     <span class='k'>end</span> 
<span class='lineno'>108</span>     <span class='n'>password</span> 
<span class='lineno'>109</span>   <span class='k'>end</span> 
<span class='lineno'>110</span> <span class='k'>end</span> 
<span class='lineno'>111</span> 
<span class='lineno'>112</span> <span class='c1'># Example method to send SMS fast </span>
<span class='lineno'>113</span> <span class='k'>def</span> <span class='nf'>send_my_sms</span><span class='p'>(</span><span class='n'>text</span> <span class='o'>=</span> <span class='s1'>&#39;Empty&#39;</span><span class='p'>)</span> 
<span class='lineno'>114</span>   <span class='n'>gw</span> <span class='o'>=</span> <span class='no'>SkebbyGatewaySendSMS</span><span class='o'>.</span><span class='n'>new</span><span class='p'>(</span><span class='vg'>$USERNAME</span><span class='p'>,</span> <span class='n'>text</span><span class='p'>,</span> <span class='vg'>$RECIPIENT</span><span class='p'>,</span> <span class='vg'>$SENDER</span><span class='p'>)</span> 
<span class='lineno'>115</span>   <span class='k'>if</span> <span class='n'>gw</span><span class='o'>.</span><span class='n'>sendSMS</span> 
<span class='lineno'>116</span>     <span class='n'>gw</span><span class='o'>.</span><span class='n'>printResponse</span> 
<span class='lineno'>117</span>   <span class='k'>else</span> 
<span class='lineno'>118</span>     <span class='nb'>puts</span> <span class='s2'>&quot;Error in the HTTP request&quot;</span> 
<span class='lineno'>119</span>   <span class='k'>end</span> 
<span class='lineno'>120</span> <span class='k'>end</span> 
<span class='lineno'>121</span> 
<span class='lineno'>122</span> <span class='c1'># Send SMS with Icinga/Nagios </span>
<span class='lineno'>123</span> <span class='k'>if</span> <span class='no'>ARGV</span><span class='o'>.</span><span class='n'>size</span> <span class='o'>&gt;</span> <span class='mi'>0</span>
<span class='lineno'>124</span>   <span class='n'>text</span> <span class='o'>=</span> <span class='no'>ARGV</span><span class='o'>[</span><span class='mi'>0</span><span class='o'>]</span>
<span class='lineno'>125</span>   <span class='n'>send_my_sms</span><span class='p'>(</span><span class='n'>text</span><span class='p'>)</span>
<span class='lineno'>126</span> <span class='k'>end</span>
</code></pre>
</div>
<p>Il programma può essere usato da linea di comando passandogli il messaggio come primo argomento oppure potete includerlo in un altro script ruby e usare la classe <em>SkebbyGatewaySendSMS</em>. Se invece salvate questo script, ad esempio, in <em>/usr/local/icinga/libexec/sms</em>gateway_ e lo rendete eseguibile, potete usarlo per far mandare SMS a Icinga. Bisogna intanto definire due comandi in <em>etc/objects/commands.cfg</em>:</p>

<pre><code># &#39;notify-service-by-sms&#39; command definition
define command{
      command_name    notify-service-by-sms
      command_line      /usr/local/icinga/libexec/sms_gateway &quot;--Nagios Service Notification-- Host: $HOSTNAME$, State: $HOSTSTATE$ Service $SERVICEDESC$ Description: $SERVICESTATE$ Time: $LONGDATETIME$&quot;
}
# &#39;notify-host-by-sms&#39; command definition
define command{
      command_name    notify-host-by-sms
      command_line      /usr/local/icinga/libexec/sms_gateway &quot;--Nagios Host Notification-- Host: $HOSTNAME$, State: $HOSTSTATE$, Time: $LONGDATETIME$&quot;
}</code></pre>

<p>Quindi in <em>etc/objects/contacts.cfg</em> aggiungere all&#8217;utente icingaadmin (o chi per lui) le notifiche via SMS:</p>

<pre><code>define contact{
    contact_name                    icingaadmin
    use                             generic-contact
    alias                           Icinga Admin
    email                           my_email@domain.com
    host_notification_commands      notify-host-by-sms,notify-host-by-email
    service_notification_commands      notify-service-by-sms,notify-service-by-email
}</code></pre>
<h3>Aggiornamento</h3>
<p>Vedo con piacere che Skebby ha usato il codice che gli ho inviato per creare <a href='http://www.skebby.it/business/index/code-examples/?example=sendRuby'>l&#8217;esempio di codice Ruby</a>, anche se nel farlo ha completamente eliminato la licenza GPL che aveva il codice originale&#8230;</p>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/01/18/notifiche-sms-gratis-con-nagiosicinga-e-skebby/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/01/18/notifiche-sms-gratis-con-nagiosicinga-e-skebby</feedburner:origLink></item>
		
		  <item>
  		<title>You3DView Wordpress plugin</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/KK8AYpegTTI/you3dview-wordpress-plugin</link>
  		<comments>/2012/01/05/you3dview-wordpress-plugin/#comments</comments>
  		<pubDate>2012-01-05T15:23:38+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1279</guid>
  		
  		<description />
  			<content:encoded><![CDATA[I wrote a little plugin to insert a You3DView panorama into a Wordpress post or page using a shortcode.

The plugin can be downloaded here:

<a href="http://wordpress.org/extend/plugins/wordpress-you3dview/" target="_blank">http://wordpress.org/extend/plugins/wordpress-you3dview/</a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2012/01/05/you3dview-wordpress-plugin/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2012/01/05/you3dview-wordpress-plugin</feedburner:origLink></item>
		
		  <item>
  		<title>How to fix redmine-mylyn-connector "Server Error: undefined method `visible_by'"</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/dk60FQWUFwM/how-to-fix-redmine-mylyn-connector-server-error-undefined-method-visible_by</link>
  		<comments>/2011/12/14/how-to-fix-redmine-mylyn-connector-server-error-undefined-method-visible_by/#comments</comments>
  		<pubDate>2011-12-14T14:11:08+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1266</guid>
  		
  		<description />
  			<content:encoded><![CDATA[With <a href="http://www.redmine.org/projects/redmine/repository/revisions/5324" target="_blank">version 5324</a> the method <strong>Project.visible_by</strong> has been <a href="http://www.redmine.org/projects/redmine/repository/revisions/5324/diff/trunk/app/models/project.rb" target="_blank">deprecated in favor of <strong>Project.visible_condition</strong></a> and <a href="http://sourceforge.net/apps/wordpress/redmin-mylyncon/" target="_blank">redmine-mylyn-connector</a> plugin stopped working with error:<strong><em> Server Error: undefined by `visible_by'</em></strong>.

Here's the patch you need to fix the plugin:
<pre>[cc lang="ruby"]diff -r redmine-mylyn-connector-2.7.5/app/controllers/mylyn_connector/issues_controller.rb redmine-mylyn-connector-2.7.5-patched/app/controllers/mylyn_connector/issues_controller.rb
63c63
< :conditions => ["#{Issue.table_name}.id in (?) and #{Issue.table_name}.updated_on >= ? and " < < Project.visible_by, issues, cond]
---
>       :conditions => ["#{Issue.table_name}.id in (?) and #{Issue.table_name}.updated_on >= ? and " < < Project.visible_condition(User.current), issues, cond]
79c79
<       :conditions => ["#{Issue.table_name}.id in (?) and " < < Project.visible_by, issues]
---
>       :conditions => ["#{Issue.table_name}.id in (?) and " < < Project.visible_condition(User.current), issues]
diff -r redmine-mylyn-connector-2.7.5/app/controllers/mylyn_connector/projects_controller.rb redmine-mylyn-connector-2.7.5-patched/app/controllers/mylyn_connector/projects_controller.rb
16c16
<       :conditions => [ "enabled_modules.name = 'issue_tracking' AND #{Project.visible_by}"])
---
>       :conditions => [ "enabled_modules.name = 'issue_tracking' AND #{Project.visible_condition(User.current)}"])
diff -r redmine-mylyn-connector-2.7.5/app/controllers/mylyn_connector/queries_controller.rb redmine-mylyn-connector-2.7.5-patched/app/controllers/mylyn_connector/queries_controller.rb
18c18
< :conditions => ["(#{Query.table_name}.is_public = ? OR #{Query.table_name}.user_id = ?) AND (project_id IS NULL OR "  < < Project.visible_by << ")", true, User.current.id],
---
>       :conditions => ["(#{Query.table_name}.is_public = ? OR #{Query.table_name}.user_id = ?) AND (project_id IS NULL OR "  < < Project.visible_condition(User.current) << ")", true, User.current.id],[/cc]</pre></pre>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/12/14/how-to-fix-redmine-mylyn-connector-server-error-undefined-method-visible_by/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/12/14/how-to-fix-redmine-mylyn-connector-server-error-undefined-method-visible_by</feedburner:origLink></item>
		
		  <item>
  		<title>Accesso SSH inverso</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/hD0zae9_9pY/accesso-ssh-inverso</link>
  		<comments>/2011/11/10/accesso-ssh-inverso/#comments</comments>
  		<pubDate>2011-11-10T12:09:40+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1260</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Può tornare utile accedere via SSH ad un pc/server non pubblico. Capita ad esempio quando un cliente disperato sta provando a mettere le mani sul server impallato e tu stai cercando di dettargli i comandi al telefono (generalmente con pessimi risultati).

Quindi basta avere un server SSH a cui il cliente possa arrivare con un utente da utilizzare.
Supponendo che il server da raggiungere sia <em>ssh-server.test.com</em> e l'utente <em>test</em>, basta che digiti il comando:
<pre>ssh -R 9000:127.0.0.1:22 -p 22 -l test ssh-server.test.com -N</pre>
Una volta inserita la password la sua console rimarrà "appesa" e voi, dal vostro server, potrete accedere alla sua macchina con:
<pre>ssh utente@127.0.0.1 -p 9000</pre>
Chiaramente avrete bisogno di un utente sulla sua macchina.

Et voilà, cliente contento e nessuna crisi di nervi per voi nel tentare di spiegargli dove mettere spazi e slash :)]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/11/10/accesso-ssh-inverso/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/11/10/accesso-ssh-inverso</feedburner:origLink></item>
		
		  <item>
  		<title>Installare ChiliProject e Gitolite</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/p_7BS9p_-x0/installare-chiliproject-e-gitolite</link>
  		<comments>/2011/10/12/installare-chiliproject-e-gitolite/#comments</comments>
  		<pubDate>2011-10-12T17:36:58+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1241</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-1253" title="ChiliProject" src="/uploads/2011/10/chili-e1318437213274.jpg" alt="" width="400" height="266" />In questa guida spiegherò come installare <a title="ChiliProject Home" href="http://www.chiliproject.org" target="_blank">ChiliProject</a> (il fork del più famoso <a title="Redmine" href="http://www.redmine.org" target="_blank">Redmine</a>), <a title="Gitolite" href="https://github.com/sitaramc/gitolite" target="_blank">Gitolite</a> e come gestire i repository GIT da ChiliProject grazie al plugin (che funziona anche con Redmine) <a href="https://github.com/tommyblue/redmine_git_hosting" target="_blank">redmine_git_hosting</a> (del plugin ho indicato il mio fork che permette di impostare una cartella temporanea custom, dato che la mia <em>/tmp</em> viene montata <strong>noexec</strong> e il plugin non funziona. L'originale lo trovate <a href="https://github.com/ericpaulbishop/redmine_git_hosting" target="_blank">qui</a>).

Il tutto verrà installato su <strong>Ubuntu server 10.04 LTS</strong>.

A differenza delle guide che si trovano in giro la mia configurazione farà tutto con i permessi di un utente utilizzando RVM e Passenger. Tutti i comandi che citerò sono lanciati dalla shell dell'utente, quindi quando ho bisogno di permessi elevati utilizzo <strong>sudo</strong>. L'utente usato sarà lo stesso che userà gitolite, quindi se non volete "sporcare" il vostro potete crearne uno ad-hoc, ad esempio <em>git</em>.
<h2>Installare RVM</h2>
La wiki del progetto è molto dettagliata. I passaggi, in breve, sono questi.

Iniziamo installando un po' di pacchetti:
<pre>sudo aptitude install build-essential curl libssl-dev zlib1g-dev libreadline5-dev libxml2-dev git-core imagemagick libmagick-dev libmagickcore-dev</pre>
Si può quindi installare RVM:
<pre>bash &lt; &lt;(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)</pre>
Se lo script non lo avesse fatto inserite la seguente riga in fondo a .bashrc (o .zshrc, a seconda di quale shell usate):
<pre>[[ -s "/home/drwolf/.rvm/scripts/rvm" ]] &amp;&amp; source "/home/drwolf/.rvm/scripts/rvm"</pre>
Date comunque una lettura all'output dello script di installazione di RVM.
Riloggatevi e potrete lanciare il comando <strong>rvm</strong>. Fatelo per installare Ruby, io userò Ruby Enterprise Edition, volendo si può usare Ruby 1.8.7:
<pre>rvm install ree
rvm use --default ree</pre>
La mia scelta per il database è MySQL, voi fate la vostra:
<pre>sudo aptitude install mysql-server libmysqlclient-dev</pre>
A questo punto il necessario è installato e posso creare il gemset per ChiliProject e installare le gemme necessarie:
<pre>rvm gemset create chiliproject
rvm gemset use chiliproject
gem install bundler</pre>
<h2>Installare ChiliProject</h2>
Come spiegato farò tutto da utente, quindi posso clonare il repository di ChiliProject direttamente nella home:
<pre>cd
git clone git://github.com/chiliproject/chiliproject.git
cd chiliproject
git checkout stable</pre>
Con bundle è immediato installare le gemme necessarie:
<pre>bundle install --without=test sqlite postgres mysql</pre>
Se non avete scelto MySQL 5.1 come me guardate la <a href="https://www.chiliproject.org/projects/chiliproject/wiki/Bundler" target="_blank">pagina della wiki</a> per lanciare bundler con le giuste opzioni.
A questo punto bisogna creare il database e l'utente per usarlo:
<pre>create database chiliproject character set utf8;
grant all on chiliproject.* to 'chiliproject'@'localhost' identified by 'my_password' with grant option;</pre>
Questi dati vanno inseriti in ChiliProject, in <em>config/database.yml</em> (fate attenzione all'adapter, che ho cambiato in <strong>mysql2</strong>):
<pre>production:
  adapter: mysql2
  database: chiliproject
  host: localhost
  port: 3306
  username: chiliproject
  password: my_password</pre>
Il file database <em>config/database.yml.example</em> è il template da usare per <em>config/database.yml</em>. Stessa cosa dicasi per <em>config/configuration.yml.example</em>. Usate <a href="https://www.chiliproject.org/projects/chiliproject/wiki/Configuration_File" target="_blank">l'apposita pagina della wiki</a> per configurare quest'ultimo file.
Per concludere lanciate questi rake:
<pre>bundle exec rake generate_session_store
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake redmine:load_default_data</pre>
Per testare l'installazione si può lanciare Webrick e collegarsi via HTTP al server sulla porta 3000:
<pre>bundle exec script/server -e production</pre>
<h2>Installare Passenger per Apache</h2>
Per servire ChiliProject sulla porta 80 bisogna installare Apache e Passenger:
<pre>sudo apt-get install apache2 apache2-threaded-dev libcurl4-openssl-dev
gem install passenger
passenger-install-apache2-module</pre>
Terminata l'installazione bisogna creare il file del modulo di apache (<em>/etc/apache2/mods-available/passenger.load</em>) con il contenuto suggerito dall'installer, nel mio caso:
<pre>LoadModule passenger_module /home/tommyblue/.rvm/gems/ree-1.8.7-2011.03@chiliproject/gems/passenger-3.0.9/ext/apache2/mod_passenger.so
PassengerRoot /home/tommyblue/.rvm/gems/ree-1.8.7-2011.03@chiliproject/gems/passenger-3.0.9
PassengerRuby /home/tommyblue/.rvm/wrappers/ree-1.8.7-2011.03@chiliproject/ruby</pre>
Per attivare il modulo:
<pre>sudo a2enmod passenger</pre>
Infine bisogna creare un <em>VirtualHost</em> (o modificare, come ho fatto io, quello di default) facendo puntare la <em>DocumentRoot</em> alla cartella <em>/public</em> di ChiliProject:
<pre>&lt;VirtualHost *:80&gt;
        ServerAdmin webmaster@localhost

        DocumentRoot /home/tommyblue/chiliproject/public
        &lt;Directory /home/tommyblue/chiliproject/public&gt;
                AllowOverride all              
                Options -MultiViews            
                Order allow,deny
                allow from all
        &lt;/Directory&gt;

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
&lt;/VirtualHost&gt;</pre>
Riavviamo Apache e ChiliProject sarà sulla porta 80. I dati per il primo accesso sono <em>admin/admin</em>.

<h2>Premessa: le chiavi</h2>
Mi &egrave; stato fatto giustamente notare che non risulta molto chiaro quali chiavi usare e quando, quindi aggiungo una breve panoramica.<br />
Da qui in poi serviranno <strong>3</strong> coppie di chiavi (volendo anche 2 con la coincidenaza della prima e della terza, ma meglio 3 <em>"per stare manzi" [cit. Sciamp]</em>):
<ul>
  <li>Una chiave <strong>YourName</strong> usata per l'amministrazione iniziale di Gitolite. Questa chiave potr&agrave; essere sempre usata per amministrare i repository su Gitolite, ma dato che lo scopo della guida &egrave; quello di usare Chiliproject proprio a tal fine, questa sar&agrave; una chiave usata soltanto all'inizio per poter dare alla chiave <strong>gitolite</strong> i permessi di amministrazione</li>
  <li>La sovracitata chiave <strong>gitolite</strong>, usata da Chiliproject per amministrare i repository di Gitolite via via che dall'interfaccia vengono creati o vengono modificati i permessi degli utenti</li>
  <li>Una chiave <strong>per l'utente finale</strong>, non citata in questa guida, la cui parte pubblica andr&agrave; inserita nell'apposito form generato dal plugin <em>Redmin Git Hosting</em> nel proprio profile in Chiliproject. Questo sar&agrave; l'utente che userete sempre per lavorare con Chiliproject e la chiave &egrave; quella che vi permette di clonare e pushare i repository su cui avete i giusti permessi (esattamente come fa GitHub).</li>
</ul>

<h2>Installare Gitolite</h2>
Come citato nella stessa <a href="https://github.com/sitaramc/gitolite#_quick_install" target="_blank">documentazione di Gitolite</a> i passaggi sono pochi e semplici:
<pre>cd ~
git clone git://github.com/sitaramc/gitolite
cd gitolite
src/gl-system-install
gl-setup ~/YourName.pub</pre>
Dove <em>YourName.pub</em> è la chiave pubblica dell'amministratore di gitolite. Cambiate il nome con quello che poi userete per amministrare gitolite.
La documentazione completa si trova qui: <a href="http://sitaramc.github.com/gitolite/" target="_blank">http://sitaramc.github.com/gitolite/</a>
<h2>Combinare le due cose</h2>
Per permettere la gestione di Gitolite a ChiliProject è necessario il plugin <a href="https://github.com/tommyblue/redmine_git_hosting" target="_blank"><em>Redmine Git Hosting</em></a>. Per iniziare bisogna creare una coppia di chiavi per un utente <em>gitolite</em>:
<pre>ssh-keygen -t rsa -f gitolite</pre>
Si clona quindi il repository di gestione di Gitolite:
<pre>git clone git@server:gitolite-admin</pre>
dove <em>git</em> di <em>git@server</em> è l'utente di sistema usato per l'installazione del tutto (nel primo paragrafo suggerivo di usare <strong>git</strong>).
Si sposta il file <em>gitolite.pub</em> in <em>gitolite-admin/keydir</em> e si modifica <em>gitolite-admin/conf/gitolite.conf</em> aggiungendo l'utente gitolite al repository <em>gitolite-admin</em>:
<pre>repo    gitolite-admin
        RW+     =   YourName gitolite</pre>
Si committa e si pusha. Adesso l'utente <em>gitolite</em> ha i giusti permessi per configurare Gitolite.

A questo punto si torna a lavorare su ChiliProject, creando la cartella <em>~/chiliproject/.ssh</em> e spostandoci le chiavi pubblica/privata generate precedentemente:
<pre>cd ~/chiliproject
mkdir .ssh
cp /somewhere/gitolite .ssh/gitolite
cp /somewhere/gitolite.pub .ssh/gitolite.pub
chmod 700 .ssh
chmod 600 .ssh/gitolite
chmod 644 .ssh/gitolite.pub</pre>
Finalmente si può installare il plugin:
<pre>cd ~/chiliproject/vendor/plugins
git clone https://github.com/tommyblue/redmine_git_hosting.git
rm -rf redmine_git_hosting/.git</pre>
Prima di lanciare la migrazione bisogna modificare il file <em>redmine_git_hosting/init.rb</em> per adattarlo al proprio sistema. Consiglio di leggere direttamente nella <a href="https://github.com/tommyblue/redmine_git_hosting" target="_blank">wiki</a> il significato dei vari parametri.
Si può quindi lanciare la migrazione, nel mio caso mi ha anche chiesto di aggiungere alcune gemme, quindi:
<pre>bundle install
RAILS_ENV=production rake db:migrate_plugins
touch tmp/restart.txt</pre>
Adesso loggandosi in Chiliproject, nella pagina "Il mio utente" è possibile inserire la propria chiave pubblica, che deve essere unica (quindi non tra quelle usate finora).

Per concludere si va in <em>Amministrazione &gt; Plugin</em> e si configura il plugin. Le opzioni sono le stesse che si trovano in <em>init.rb</em>, in teoria avendo configurato init.rb dovreste già trovare tutto a posto, ma a volte i dati sono nuovamente da impostare. In più ho abilitato <em>Automatically Initialize Git Repositories For New Projects</em>: in questo modo ogni volta che creo un progetto, ChiliProject mi crea un repository Git su cui posso lavorare.<br />Una volta configurato il plugin andate anche in "Ruoli e permessi" e abilitate per il Gestore i nuovi permessi per creare i mirror dei repository.
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/10/12/installare-chiliproject-e-gitolite/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/10/12/installare-chiliproject-e-gitolite</feedburner:origLink></item>
		
		  <item>
  		<title>IPv6 in pochi passi con ALIX e SixXS</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/Ut0Uet2BjoQ/ipv6-in-pochi-passi-con-alix-e-sixxs</link>
  		<comments>/2011/08/03/ipv6-in-pochi-passi-con-alix-e-sixxs/#comments</comments>
  		<pubDate>2011-08-03T16:41:51+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1190</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Come ormai saprete (<a href="http://www.tommyblue.it/2010/05/25/endian-firewall-su-alix/">1</a> - <a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/">2</a>) ho un debole per gli embedded ALIX di <a title="PC Engines" href="http://pcengines.ch/" target="_blank">PcEngines</a>. In questo caso userò una scheda <a href="http://pcengines.ch/alix2d13.htm" target="_blank">2d13</a> con <strong>RTC</strong>, indispensabile perché se il vostro orologio non è sincronizzato con quello del broker IPv4-IPv6 (±30 secondi) non avrete la connessione IPv6!

Come da tradizione il sistema operativo è <a href="http://linux.voyage.hk/" target="_blank">Debian Voyage</a>, ma tutta la procedura può comunque essere applicata ad una qualsiasi macchina con installato un os <em>Debian-based</em> (a meno di qualche piccola modifica). Per altri sistemi operativi guardate la <a title="Wiki di SixXS" href="https://www.sixxs.net/wiki/" target="_blank">wiki di SixXS</a>.
<h2>SixXS</h2>
Il primo passo è, per l'appunto, quello di <a href="http://www.sixxs.net/signup/create/" target="_blank">registrarsi su SixXS</a> e richiedere un account. La registrazione, prima di essere accettata, deve essere verificata manualmente quindi probabilmente potrebbe passare qualche giorno (nel mio caso ci sono voluti pochi minuti).

Una volta ottenuti i dati di accesso bisogna richiedere un tunnel. In questa guida coprirò la configurazione di un tunnel heartbeat con Aiccu. Anche la richiesta del tunnel richiede approvazione, quindi in attesa possiamo configurare il sistema (una volta approvato il tunnel basta inserirne il nome in <em>/etc/aiccu.conf</em> e gli ip in <em>/etc/network/interfaces</em>).
<h2>AICCU</h2>
Come premesso il sistema deve avere l'ora corretta con uno scarto massimo di 30 secondi, altrimenti AICCU non stabilisce la connessione. Nel più semplice dei casi per farlo basta installare il pacchetto <strong>ntp</strong>. AICCU logga in <em>/var/log/syslog</em>, ecco il tipico errore per problemi di sincronizzazione:

<div class="highlight"><pre><code class="bash">~# cat /var/log/syslog | grep aiccu

Apr 28 08:50:19 voyage aiccu<span class="o">[</span>1731<span class="o">]</span>: sock_getline<span class="o">()</span> : <span class="s2">&quot;200 Client Identity accepted&quot;</span>
Apr 28 08:50:19 voyage aiccu<span class="o">[</span>1731<span class="o">]</span>: sock_printf<span class="o">()</span>  : <span class="s2">&quot;get unixtime&quot;</span>
Apr 28 08:50:19 voyage aiccu<span class="o">[</span>1731<span class="o">]</span>: sock_getline<span class="o">()</span> : <span class="s2">&quot;200 1312374039&quot;</span>
Apr 28 08:50:19 voyage aiccu<span class="o">[</span>1731<span class="o">]</span>: The clock is off by 355469420 seconds, use NTP to sync it!
Apr 28 08:50:19 voyage aiccu<span class="o">[</span>1731<span class="o">]</span>: sock_printf<span class="o">()</span>  : <span class="s2">&quot;QUIT Aborting: Clock is off by 355469420 seconds &quot;</span>
Apr 28 08:50:19 voyage aiccu<span class="o">[</span>1731<span class="o">]</span>: Couldn<span class="err">&#39;</span>t retrieve first tunnel <span class="k">for </span>the above reason, aborting
</code></pre>
</div>


Una volta sincronizzato l'orario si può procedere installando il pacchetto <strong>aiccu</strong><em> </em>. All'installazione vi verranno chiesti i dati di accesso a SixXS. Oltre a questo ho scommentato soltanto due righe in <em>/etc/aiccu.conf</em>, riporto tutto il file:

<div class="highlight"><pre><code class="bash">username MY_USERNAME
password MY_PASSWORD
protocol tic
server tic.sixxs.net
ipv6_interface sixxs
tunnel_id MY_TUNNEL
verbose <span class="nb">false</span>
daemonize <span class="nb">true</span>
automatic <span class="nb">true</span>
requiretls <span class="nb">false</span>
makebeats <span class="nb">true</span>
</code></pre>
</div>


Basta adattare le variabili <em>username</em>, <em>password</em> e <em>tunnel_id</em> (tutti dati che vi devono essere dati da SixXS) e il gioco è fatto.
Molte informazioni le potete trovare anche nella wiki di SixXS: <a href="http://www.sixxs.net/wiki/Aiccu" target="_blank">http://www.sixxs.net/wiki/Aiccu</a>
<h2>Interfaccia di rete</h2>
Quando il tunnel ci verrà attivato potremo configurare l'interfaccia, nello specifico inserendo questa configurazione in <em>/etc/network/interfaces</em> (utilizzando i dati che abbiamo ottenuto):

<div class="highlight"><pre><code class="bash">auto sixxs
iface sixxs inet6 v4tunnel
address MY_IPV6_IP
netmask 64
endpoint 213.254.12.34
ttl 64
up ip link <span class="nb">set </span>mtu 1280 dev sixxs
up ip route add default via MY_IPV6_GATEWAY dev sixxs
</code></pre>
</div>


L'IPv4 dell'endpoint è quello italiano, ad ogni modo nella mail di conferma attivazione del tunnel c'è scritto tutto. Il vostro indirizzo IP e quello del gateway differiscono soltanto per l'ultima cifra: <strong>:1</strong> per il gateway e <strong>:2</strong> per il vostro IP.
<h2>Test IPv6</h2>
Terminati questi passaggi il nostro IPv6 dovrebbe essere pronto. Riavviamo AICCU e la rete (<em>/etc/init.d/networking restart</em>) e testiamo il tutto pingando (occhio, ci vuole <em>ping6</em>) il gateway IPv6.
Per ulteriore prova si può visitare ﻿ la home page di <a title="SixXS" href="http://www.sixxs.net/" target="_blank">SixXS</a> dove un blocchetto verde ci accoglierà con un festante <strong>"You've got IPv6!"</strong>.
Se siete a terminale e volete testare qualche sito in IPv6 fate attenzione che <strong>lynx</strong> supporta IPv6 mentre <strong>links2</strong> no.
<h2>Subnet, routing e assegnazione IP</h2>
Ora che abbiamo un IPv6 e lo usiamo per navigare da un pc, è giunto il momento di ottenere una subnet <strong>/48</strong> per poter assegnare un IPv6 ad ogni nostro apparato (ovvero ai nostri<strong> <a title="IPv6 Subnet Size Reference Table" href="http://www.potato-people.com/blog/2009/02/ipv6-subnet-size-reference-table/" target="_blank">1.208.925.819.614.629.500.000.000</a> </strong>apparati).

Come al solito il primo passo è richiedere a SixXS una subnet. Una volta ottenuta la rete /48, seguendo la <a href="https://www.sixxs.net/wiki/Installing_a_Subnet" target="_blank">guida nella wiki di Sixxs</a>, andiamo a configurare una /64 per la nostra rete.
Assegniamo staticamente uno di questi indirizzi in <em>/etc/network/interfaces</em>:

<div class="highlight"><pre><code class="bash">iface eth0 inet6 static
address MY_IP_FROM_SUBNET
netmask 64
</code></pre>
</div>


Riavviata la rete, il nostro ALIX avrà un secondo IPv6 (oltre a quello del tunnel). Per permettere il routing e l'advertising degli indirizzi ip usiamo <strong>radvd</strong>: non si tratta di un DHCPv6 (al momento non esiste un DHCPv6 veramente funzionante) ma di un router IPv6 che periodicamente invia pacchetti multicast di Router Advertisement per permettere l'autoconfigurazione degli apparati di rete utilizzando gli ip della nostra subnet.
Dopo aver installato il pacchetto <strong>radvd</strong> bisogna creare il file <em>/etc/radvd.conf</em> con il seguente contenuto:

<div class="highlight"><pre><code class="bash">interface eth0<span class="o">{</span>
  AdvSendAdvert on;
  prefix MY_IP_FROM_SUBNET/64
  <span class="o">{</span>
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  <span class="o">}</span>;
<span class="o">}</span>;
</code></pre>
</div>


Avviamo radvd e abilitiamo il forwarding:

<div class="highlight"><pre><code class="bash"><span class="nb">echo</span> <span class="s2">&quot;net.ipv6.conf.all.forwarding=1&quot;</span> &gt;&gt; /etc/sysctl.conf
<span class="nb">echo</span> <span class="s2">&quot;net.ipv6.conf.default.forwarding=1&quot;</span> &gt;&gt; /etc/sysctl.conf
sysctl -p
</code></pre>
</div>


Se tutto è andato come doveva le macchine nella vostra rete dovrebbero ottenere un indirizzo IPv6 (parlo di Mac e Linux, per Windows arrangiatevi.. :) e navigare IPv6.
Provate ad aprire il sito SixXS per averne conferma:

<img class="aligncenter size-full wp-image-1223" title="You've got IPv6!" src="/uploads/2011/08/Youve-got-ipv6.png" alt="" width="219" height="78" />
<h2>Firewall IPv6</h2>
Una cosa che ben presto si capisce di IPv6 è che le tanto odiate NAT in certi casi facevano comodo. Uno di questi è che un IP privato era <strong>privato</strong>. Con IPv6 quasi tutto è pubblico e quindi un firewall è indispensabile.

Ho scritto un breve script per <strong>ip6tables</strong> prendendo spunto dalla wiki si SixXS, dopo averlo personalizzato (dovete settare qualche IP) basta metterlo in <em>/etc/init.d</em> e aggiungerlo al runlevel di default (<em>update-rc.d firewall-ipv6 defaults</em>):

<div class="highlight"><pre><code class="bash"><span class="c">#! /bin/bash</span>

<span class="c">### BEGIN INIT INFO</span>
<span class="c"># Provides:             firewall-ipv6</span>
<span class="c"># Required-Start:       $remote_fs $syslog</span>
<span class="c"># Required-Stop:        $remote_fs $syslog</span>
<span class="c"># Default-Start:        2 3 4 5</span>
<span class="c"># Default-Stop:         0 1 6</span>
<span class="c"># Short-Description:    IPTables-based IPv6 firewall</span>
<span class="c">### END INIT INFO</span>

<span class="nb">set</span> -e

<span class="c"># /etc/init.d/firewall-ipv6: start and stop the ip6tables firewall</span>

<span class="nv">IP6</span><span class="o">=</span><span class="s2">&quot;/sbin/ip6tables&quot;</span>

<span class="c"># L&#39;indirizzo IP di questa macchina</span>
<span class="nv">THIS_HOST</span><span class="o">=</span><span class="s2">&quot;2001:1418:AAAA:AAAA::2&quot;</span>

<span class="c"># La subnet assegnata da SixXS</span>
<span class="nv">SUBNET_PREFIX</span><span class="o">=</span><span class="s2">&quot;2001:1418:BBBB::/48&quot;</span>

stop_firewall<span class="o">()</span> <span class="o">{</span>
<span class="c"># First, delete all:</span>
<span class="nv">$IP6</span> -F
<span class="nv">$IP6</span> -X

<span class="nv">$IP6</span> -P INPUT   ACCEPT
<span class="nv">$IP6</span> -P FORWARD ACCEPT
<span class="nv">$IP6</span> -P OUTPUT  ACCEPT
<span class="o">}</span>

start_firewall<span class="o">()</span> <span class="o">{</span>
stop_firewall

<span class="c"># Allow anything on the local link</span>
<span class="nv">$IP6</span> -A INPUT  -i lo -j ACCEPT
<span class="nv">$IP6</span> -A OUTPUT -o lo -j ACCEPT

<span class="c"># Allow anything out on the internet</span>
<span class="nv">$IP6</span> -A OUTPUT -o sixxs -j ACCEPT

<span class="c"># Allow the localnet access us:</span>
<span class="nv">$IP6</span> -A INPUT    -i eth0   -j ACCEPT
<span class="nv">$IP6</span> -A OUTPUT   -o eth0   -j ACCEPT

<span class="c"># Filter all packets that have RH0 headers:</span>
<span class="nv">$IP6</span> -A INPUT -m rt --rt-type 0 -j DROP
<span class="nv">$IP6</span> -A FORWARD -m rt --rt-type 0 -j DROP
<span class="nv">$IP6</span> -A OUTPUT -m rt --rt-type 0 -j DROP

<span class="c"># Allow Link-Local addresses</span>
<span class="nv">$IP6</span> -A INPUT -s fe80::/10 -j ACCEPT
<span class="nv">$IP6</span> -A OUTPUT -s fe80::/10 -j ACCEPT

<span class="c"># Allow multicast</span>
<span class="nv">$IP6</span> -A INPUT -s ff00::/8 -j ACCEPT
<span class="nv">$IP6</span> -A OUTPUT -s ff00::/8 -j ACCEPT

<span class="c"># Allow ICMPv6 everywhere</span>
<span class="nv">$IP6</span> -I INPUT  -p icmpv6 -j ACCEPT
<span class="nv">$IP6</span> -I OUTPUT -p icmpv6 -j ACCEPT
<span class="nv">$IP6</span> -I FORWARD -p icmpv6 -j ACCEPT

<span class="c"># Allow forwarding</span>
<span class="nv">$IP6</span> -A FORWARD -m state --state NEW -i eth0 -o sixxs -s <span class="nv">$SUBNET_PREFIX</span> -j ACCEPT
<span class="nv">$IP6</span> -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

<span class="c"># SSH verso questa macchina</span>
<span class="nv">$IP6</span> -A INPUT -i sixxs -p tcp -d <span class="nv">$THIS_HOST</span> --dport 22 -j ACCEPT

<span class="c"># Accesso a macchine della rete</span>
<span class="c">#$IP6 -A FORWARD -i sixxs -p tcp -d $IP_DA_RAGGIUNGERE --dport $PORTA_DA_RAGGIUNGERE -j ACCEPT</span>

<span class="c"># Set the default policy</span>
<span class="nv">$IP6</span> -P INPUT   DROP
<span class="nv">$IP6</span> -P FORWARD DROP
<span class="nv">$IP6</span> -P OUTPUT  ACCEPT
<span class="o">}</span>

<span class="nb">test</span> -x <span class="nv">$IP6</span> <span class="o">||</span> <span class="nb">exit </span>0

<span class="nb">set</span> -e

<span class="k">case</span> <span class="s2">&quot;$1&quot;</span> in
start<span class="o">)</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Starting Firewall&quot;</span>
stop_firewall
start_firewall
;;
stop<span class="o">)</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Stopping Firewall&quot;</span>
stop_firewall
;;
restart<span class="o">)</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Restarting Firewall&quot;</span>
stop_firewall
start_firewall
;;
*<span class="o">)</span>
<span class="nv">N</span><span class="o">=</span>/etc/init.d/<span class="nv">$NAME</span>
<span class="nb">echo</span> <span class="s2">&quot;Usage: $N {start|stop|restart}&quot;</span> &gt;&amp;2
<span class="nb">exit </span>1
;;
<span class="k">esac</span>

<span class="nb">exit </span>0
</code></pre>
</div>


Per essere sicuri che il firewall funzioni si può usare questa applicazione web: <a title="Tim's Free IPv6 TCP Port Scanner (Firewall Tester)" href="http://ipv6.chappell-family.com/ipv6tcptest/" target="_blank">http://ipv6.chappell-family.com/ipv6tcptest/</a>. Se tutto va bene il risultato dovrebbe essere questo:

<a href="/uploads/2011/08/Firewall-check.png" rel="prettyPhoto"><img class="aligncenter size-medium wp-image-1224" title="IPv6 firewall check" src="/uploads/2011/08/Firewall-check-300x144.png" alt="" width="300" height="144" /></a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/08/03/ipv6-in-pochi-passi-con-alix-e-sixxs/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/08/03/ipv6-in-pochi-passi-con-alix-e-sixxs</feedburner:origLink></item>
		
		  <item>
  		<title>SASS facile con Compass.app</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/JYj0mdvNDlY/sass-facile-con-compass-app</link>
  		<comments>/2011/08/02/sass-facile-con-compass-app/#comments</comments>
  		<pubDate>2011-08-02T20:56:29+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1205</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-1206" title="Compass.App" src="/uploads/2011/08/128.png" alt="" width="128" height="128" /><a title="Compass.app" href="http://compass.handlino.com/" target="_blank">Compass.app</a> è un'applicazione per MacOSX che aiuta nella compilazione dei file <a title="SASS" href="http://sass-lang.com/" target="_blank">SASS</a>. Una volta configurata tiene sotto controllo i file SASS e li compila al volo in CSS.

Il progetto, scritto in Ruby, è open-source e <a href="https://github.com/handlino/CompassApp" target="_blank">ospitato su GitHub</a>. Viene venduta l'applicazione compilata a 7$, ma dato che compilarlo è piuttosto semplice (e sono tirchio) me lo sono compilato.

Ecco come ho fatto:

Il primo passo è installare <a title="JRuby" href="http://www.jruby.org/" target="_blank">JRuby</a>, che con <a href="http://www.tommyblue.it/?s=rvm">RVM</a> si limita ad un semplice:
<pre>rvm install jruby</pre>
Una volta installato creiamo un gemset e installiamo l'unica gemma necessaria: <a title="Rawr" href="http://rawr.rubyforge.org/" target="_blank">rawr</a>
<pre>rvm use jruby
rvm gemset create compassapp
rvm gemset use compassapp
gem install rawr</pre>
Fatto questo bisogna clonare il repository git e lanciare qualche rake:
<pre>git clone https://github.com/handlino/CompassApp.git
cd CompassApp
rake rawr:compile
rake rawr:bundle:app</pre>
Ecco fatto, adesso spostiamo l'app dalla cartella <em>package/osx</em> a <em>Applicazioni</em> e il gioco è fatto :)]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/08/02/sass-facile-con-compass-app/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/08/02/sass-facile-con-compass-app</feedburner:origLink></item>
		
		  <item>
  		<title>Impedire a Spotlight di cercare nel dizionario</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/DpI60djM2SE/impedire-a-spotlight-di-cercare-nel-dizionario</link>
  		<comments>/2011/07/27/impedire-a-spotlight-di-cercare-nel-dizionario/#comments</comments>
  		<pubDate>2011-07-27T01:15:22+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1192</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-1193" title="Spotlight" src="/uploads/2011/07/Spotlight.png" alt="" width="128" height="128" />C'è una cosa che odio in maniera viscerale su <strong>Spotlight</strong>:
il fatto che quando si effettuano delle ricerche viene effettuata anche una ricerca sul dizionario (che, personalmente, non ho mai usato).

La cosa perdipiù impedisce anche il corretto funzionamento dello stesso Spotlight. Un esempio: se cerco la parola "App" probabilmente sto cercando <em>App Store</em>. Quel che accade è che viene cercata la definizione di <em>App</em> ma l'applicazione <em>App Store</em> non viene neanche visualizzata.

Mi segno quindi questo utilissimo comando da console per disabilitare le ricerche di Spotlight nel dizionario:
<pre>defaults write com.apple.spotlight DictionaryLookupEnabled NO</pre>
P.S. Per i più curiosi la definizione di <em>App</em> è:
<pre>app |ap|
noun Computing
short for application (sense 5).</pre>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/07/27/impedire-a-spotlight-di-cercare-nel-dizionario/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/07/27/impedire-a-spotlight-di-cercare-nel-dizionario</feedburner:origLink></item>
		
		  <item>
  		<title>Installazione di Gitorious su Ubuntu server 10.04</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/6W1BFmYrA_4/installazione-di-gitorious-su-ubuntu-server-10-04</link>
  		<comments>/2011/06/01/installazione-di-gitorious-su-ubuntu-server-10-04/#comments</comments>
  		<pubDate>2011-06-01T15:17:14+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1160</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-1161" title="Gitorious" src="/uploads/2011/06/Gitorious.png" alt="" width="95" height="95" />Oggi ho bestemmiato un paio d'ore per installare <a title="Gitorious" href="http://www.gitorious.org/" target="_blank">Gitorious</a>, progetto che mi ha incuriosito e di cui volevo capirne le potenzialità (in ottica di fargli sostituire l'ottimo <a title="Remine" href="http://www.redmine.org/" target="_blank">Redmine</a>). Dato che alla fine sono riuscito a farlo funzionare e non ho trovato una guida fatta a modo, ho deciso di mettere nero su bianco ciò che ho fatto.

L'installazione è stata effettuata su un server virtuale pulito Ubuntu server 10.04 x86_64. Ho provato ad utilizzare <a title="RVM" href="https://rvm.beginrescueend.com/" target="_blank">RVM</a> e ruby 1.9.2 ma non ci sono riuscito... Ho quindi utilizzato <a title="Ruby Enterprise Edition" href="http://www.rubyenterpriseedition.com/" target="_blank">Ruby Enterprise Edition</a> 1.8.7<!--more-->

Per cominciare ho installato un po' di pacchetti:
<pre>apt-get install build-essential zlib1g-dev tcl-dev libexpat-dev libcurl4-openssl-dev postfix apache2 mysql-server mysql-client apg geoip-bin libgeoip1 libgeoip-dev libaspell-dev aspell sqlite3 libsqlite3-dev imagemagick libpcre3 libpcre3-dev zlib1g zlib1g-dev libyaml-dev libmysqlclient15-dev apache2-dev libonig-dev libmagick++-dev zip unzip memcached git-core git-svn git-doc git-cvs irb sphinxsearch uuid uuid-dev openjdk-6-jre libssl0.9.8 libxslt1-dev</pre>
Ho scaricato e installato <a title="ActiveMQ" href="http://activemq.apache.org/" target="_blank">ActiveMQ</a> 5.5.0:
<pre>wget http://www.powertech.no/apache/dist/activemq/apache-activemq/5.5.0/apache-activemq-5.5.0-bin.tar.gz
sudo -s
tar xzvf apache-activemq-5.5.0-bin.tar.gz -C /usr/local/
echo "export ACTIVEMQ_HOME=/usr/local/apache-activemq-5.5.0" >> /etc/activemq.conf﻿
echo "export JAVA_HOME=/usr/" >> /etc/activemq.conf
adduser --system --no-create-home activemq
chown -R activemq /usr/local/apache-activemq-5.5.0/data</pre>
Per lanciare ActiveMQ ho utilizzato <a href="/uploads/2011/06/activemq.txt" target="_blank">questo</a> file, copiato in <em>/etc/init.d</em>:
<pre>wget /uploads/2011/06/activemq.txt
sudo mv activemq.txt /etc/init.d/activemq
sudo chmod +x /atc/init.d/activemq
sudo update-rc.d activemq defaults
sudo service activemq start</pre>
A questo punto ho scaricato da <a title="REE" href="http://www.rubyenterpriseedition.com/download.html" target="_blank">qui</a> REE e l'ho installato:
<pre>sudo dpkg -i ﻿﻿ruby-enterprise_1.8.7-2011.03_amd64_ubuntu10.04.deb</pre>
dopodichè ho installato <a title="RubyGems" href="http://rubygems.org/" target="_blank">RubyGems</a>. Come dicevo prima non sono riuscito ad utilizzare RVM proprio a causa di problemi con le gemme. Per far funzionare il tutto ho dovuto installare tutte le gemme da root:
<pre>wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.5.tgz
tar xzf  ﻿rubygems-1.8.5.tgz
cd rubygems-1.8.5/
sudo ruby setup.rb
echo "gem: --no-ri --no-rdoc" > ~/.gemrc</pre>
Installato RubyGems bisogna installare le gemme. <strong>ATTENZIONE</strong>: se fin qui ho più o meno seguito le guide che trovate nella webografia, per le gemme ho fatto tutt'altro. Infatti per far funzionare Gitorious, che è scritto con Rails 2.3.x, non è possibile installare le gemme <em>as is</em> dato che molte sono ormai incompatibili con Rails 2. Meglio far fare tutto a Bundler o specificare gemma per gemma la versione da installare. Quindi prima cloniamo il repository di Gitorious:
<pre>sudo -s
git clone git://gitorious.org/gitorious/mainline.git /var/www/gitorious
cd /var/www/gitorious
gem install bundler
bundle install
gem install -b -v 1.1 stomp
gem install rmagick passenger stompserver raspell
gem install -v=0.8.7 rake
passenger-install-apache2-module</pre>
Al termine dell'ultimo passaggio creare il file <em>/etc/apache2/mods-available/passenger.load</em> con quanto suggerito dallo script precedente. Nel mio caso:
<pre>LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.7
PassengerRuby /usr/local/bin/ruby</pre>
Per attivare il modulo:
<pre>a2enmod passenger
a2enmod rewrite
a2enmod ssl
a2enmod expires
service apache2 restart</pre>
Ok, adesso ho copiato i necessari script di avvio:
<pre>cp /var/www/gitorious/doc/templates/ubuntu/git-daemon /etc/init.d/
cp /var/www/gitorious/doc/templates/ubuntu/git-ultrasphinx /etc/init.d/</pre>
In <em>/etc/init.d/git-daemon</em> modificare GIT_DAEMON come segue:
<pre>GIT_DAEMON="/usr/bin/local/ruby /var/www/gitorious/script/git-daemon -d"</pre>
Creare anche <em>/etc/init.d/stomp</em>:
<div class="highlight"><pre><code class="bash"><span class="c">#!/bin/sh</span>
<span class="c"># Start/stop the stompserver</span>
<span class="c">#</span>
<span class="c">### BEGIN INIT INFO</span>
<span class="c"># Provides:          stomp</span>
<span class="c"># Required-Start:    $local_fs $remote_fs $network $syslog</span>
<span class="c"># Required-Stop:</span>
<span class="c"># Default-Start:     2 3 4 5</span>
<span class="c"># Default-Stop:      1</span>
<span class="c"># Short-Description: Stomp</span>
<span class="c"># Description:       Stomp</span>
<span class="c">### END INIT INFO</span>

<span class="nb">test</span> -f /usr/local/bin/stompserver <span class="o">||</span> <span class="nb">exit </span>0

. /lib/lsb/init-functions

<span class="k">case</span> <span class="s2">&quot;$1&quot;</span> in
start<span class="o">)</span>  log_daemon_msg <span class="s2">&quot;Starting stompserver&quot;</span> <span class="s2">&quot;stompserver&quot;</span>
    start-stop-daemon --start --name stompserver --startas /usr/local/bin/stompserver --background --user git
    log_end_msg <span class="nv">$?</span>
    ;;
stop<span class="o">)</span>  log_daemon_msg <span class="s2">&quot;Stopping stompserver&quot;</span> <span class="s2">&quot;stompserver&quot;</span>
    start-stop-daemon --stop --name stompserver
    log_end_msg <span class="nv">$?</span>
    ;;
restart<span class="o">)</span> log_daemon_msg <span class="s2">&quot;Restarting stompserver&quot;</span> <span class="s2">&quot;stompserver&quot;</span>
    start-stop-daemon --stop --retry 5 --name stompserver
    start-stop-daemon --start --name stompserver --startas /usr/local/bin/stompserver --background --user git
    log_end_msg <span class="nv">$?</span>
    ;;
status<span class="o">)</span>
    status_of_proc /usr/local/bin/stompserver stompserver <span class="o">&amp;&amp;</span> <span class="nb">exit </span>0 <span class="o">||</span> <span class="nb">exit</span> <span class="nv">$?</span>
    ;;
*<span class="o">)</span>      log_action_msg <span class="s2">&quot;Usage: /etc/init.d/stomp {start|stop|restart|status}&quot;</span>
    <span class="nb">exit </span>2
    ;;
<span class="k">esac</span>
<span class="nb">exit </span>0
</code></pre>
</div>

e <em>/etc/init.d/git-poller</em>:
<div class="highlight"><pre><code class="bash"><span class="c">#!/bin/sh</span>
<span class="c"># Start/stop the git poller</span>
<span class="c">#</span>
<span class="c">### BEGIN INIT INFO</span>
<span class="c"># Provides:          git-poller</span>
<span class="c"># Required-Start:    stomp</span>
<span class="c"># Required-Stop:</span>
<span class="c"># Default-Start:     2 3 4 5</span>
<span class="c"># Default-Stop:      1</span>
<span class="c"># Short-Description: Gitorious poller</span>
<span class="c"># Description:       Gitorious poller</span>
<span class="c">### END INIT INFO</span>

/bin/su - git -c <span class="s2">&quot;cd /var/www/gitorious;RAILS_ENV=production script/poller $@&quot;</span>
</code></pre>
</div>

Si possono quindi aggiungere tutti all'avvio:

<div class="highlight"><pre><code class="bash">chmod 755 /etc/init.d/git-ultrasphinx /etc/init.d/git-daemon /etc/init.d/stomp /etc/init.d/git-poller
update-rc.d stomp defaults
update-rc.d git-daemon defaults
update-rc.d git-ultrasphinx defaults
update-rc.d git-poller defaults
</code></pre>
</div>


Bisogna creare la configurazione di apache. Gitorious utilizza SSL per il login, quindi i VirtualHost sono 2, io ho creato il file <em>/etc/apache2/sites-available/gitorious</em>:

<div class="highlight"><pre><code class="bash">&lt;VirtualHost *:80&gt;
  ServerName MIODOMINIO
  DocumentRoot /var/www/gitorious/public
&lt;/VirtualHost&gt;
&lt;IfModule mod_ssl.c&gt;
  &lt;VirtualHost _default_:443&gt;
    ServerName MIODOMINIO
    DocumentRoot /var/www/gitorious/public
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    BrowserMatch <span class="s2">&quot;.*MSIE.*&quot;</span> nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
  &lt;/VirtualHost&gt;
&lt;/IfModule&gt;
</code></pre>
</div>


e quindi l'ho attivato:
<pre>a2dissite default
a2ensite gitorious</pre>
Torniamo a Gitorious che abbiamo un po' lasciato indietro. Serve un utente git che sarà il proprietario dell'applicazione:
<pre>adduser --system --home /var/www/gitorious/ --no-create-home --group --shell /bin/bash git
chown -R git:git /var/www/gitorious
su - git
cd /var/www/gitorious
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
mkdir -p tmp/pids repositories tarballs
cp config/database.sample.yml config/database.yml
cp config/gitorious.sample.yml config/gitorious.yml
cp config/broker.yml.example config/broker.yml</pre>
Modificare <em>config/database.yml</em> lasciando soltanto la sezione production e le sue configurazioni. Inserire un utente MySQL con permessi sul database <em>gitorious_production</em> (se non volete creare a mano questo db utilizzate un utente in grado di creare database). Nel file <em>config/gitorious.yml</em> inserite:
<pre>production:
  cookie_secret: "FRASESEGRETISSIMAELUNGHISSIMA"
  repository_base_path: "/var/www/gitorious/repositories"
  gitorious_client_port: 80
  gitorious_client_host: gitorious.dw
  gitorious_host: gitorious.dw
  archive_cache_dir: "/var/www/gitorious/tarballs"
  archive_work_dir: "/tmp/tarballs-work"
  hide_http_clone_urls: true
  is_gitorious_dot_org: false</pre>
Per il valore di <em>cookie_secret</em> utilizzate l'output del comando <em>apg -m 64</em>.
Ho avuto dei problemi con ActiveSupport, del tipo:
<pre>uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)</pre>
come suggerito <a href="http://makandra.com/notes/1051-fixing-uninitialized-constant-activesupport-dependencies-mutex-nameerror" target="_blank">qui</a> li ho superati inserendo <em>require 'thread'</em> in <em>config/boot.rb</em> dopo RAILS_ROOT.

A questo punto si può procedere con la migrazione:
<pre>su - git
cd /var/www/gitorious
export RAILS_ENV=production
rake db:create
rake db:migrate
rake ultrasphinx:bootstrap</pre>
L'ultimo comando dovrebbe restituire un errore ma comunque crea il file di configurazione, che va editato per evitare l'errore. Il file è  <em>config/ultrasphinx/production.conf</em> in cui va sostituito <em>base_tags</em> con <em>tags</em>. Effettuata la sostituizione su può lanciare Sphinx con:
<pre>rake ultrasphinx:index RAILS_ENV=production
rake ultrasphinx:daemon:start RAILS_ENV=production</pre>
Per l'aggiornamento degli indici ho creato il file<em> /etc/cron.d/ultrasphinx</em>:
<pre>* */1 * * *       git     cd /var/www/gitorious && /usr/local/bin/rake ultrasphinx:index RAILS_ENV=production</pre>
Prima di accedere a Gitorious bisogna creare l'utente admin lanciando, come <em>git</em>, il comando:
<pre>env RAILS_ENV=production ruby script/create_admin</pre>
Riavviamo i servizi (ed eventualmente il server per essere sicuri che al riavvio Gitorious funzioni correttamente):
<pre>service git-daemon start
service apache2 restart</pre>
Colleghiamoci al sito e, se tutto è andato bene, iniziamo ad utilizzare Gitorious!

Resta un'ultima cosa da fare per poter pushare correttamente, ovvero creare un link simbolico al file <em>/var/www/gitorious/script/gitorious</em> in una cartella presente nella PATH dell'utente git, io l'ho creato in<em> /usr/local/bin</em>:
<pre>﻿﻿﻿ln -s /var/www/gitorious/script/gitorious /usr/local/bin/</pre>
Senza questo passaggio al momento del push ottenevo un singolare quanto criptico errore da git:
<pre>bash: gitorious: comando non trovato</pre>
<h3>﻿Webografia</h3>
<ul>
	<li><a href="http://www.silly-science.co.uk/2010/12/12/installing-gitorious-on-ubuntu-10-04-howto/">http://www.silly-science.co.uk/2010/12/12/installing-gitorious-on-ubuntu-10-04-howto/</a></li>
	<li><a href="http://www.gitorious.org/gitorious/pages/UbuntuInstallation">http://www.gitorious.org/gitorious/pages/UbuntuInstallation</a></li>
	<li><a href="http://cjohansen.no/en/ruby/setting_up_gitorious_on_your_own_server">http://cjohansen.no/en/ruby/setting_up_gitorious_on_your_own_server</a></li>
</ul>
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/06/01/installazione-di-gitorious-su-ubuntu-server-10-04/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/06/01/installazione-di-gitorious-su-ubuntu-server-10-04</feedburner:origLink></item>
		
		  <item>
  		<title>Prime impressioni su Gnome 3</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/83LkdyjuC9Q/prime-impressioni-su-gnome-3</link>
  		<comments>/2011/05/03/prime-impressioni-su-gnome-3/#comments</comments>
  		<pubDate>2011-05-03T13:57:40+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Riflessioni]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1133</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<a href="http://www.gnome3.org/"><img class="alignleft size-full wp-image-1137" title="Gnome 3" src="/uploads/2011/05/gnome3madeofeasy-e1304280981992.png" alt="" width="200" height="150" /></a>Abbiamo recentemente installato <a title="Fedora 15 beta" href="http://fedoraproject.org/it/get-prerelease" target="_blank">Fedora 15 beta</a> sui nostri pc portatili (Macbook Pro e Dell xps m1330) e per la prima volta abbiamo sbattuto il naso su <a title="Gnome 3" href="http://www.gnome3.org/" target="_blank">Gnome 3</a>. Il motivo dell’espressione colorita è che è innegabile che l'impatto con questa nuova versione sia un po' destabilizzante (le reazioni che abbiamo avuto sono state diverse: chi da una parte ancora non si è deciso ad aggiornare il pc su cui lavora, chi invece ha deciso, prima ancora di avere forse una vera impressione, di cambiare definitivamente) anche se dopo qualche giorno ci si fa l'abitudine e l'esperienza è senza dubbio positiva.

Passati quindi questi giorni d'abitudine ecco che arriva la recensione d'obbligo,per l’occasione scritta a 4 mani con Alessandro :-)
Speriamo vi piaccia l'esperimento...

L’articolo è così diviso:
<ul>
	<li>in 	forma plurale per quel che riguarda giudizi in comune</li>
	<li>in 	forma singolare in corsivo i giudizi personali, preceduti dalle 	nostre iniziali per distinguerli</li>
</ul>
<em><strong>T: </strong>Premetto che i miei giudizi sono quasi sempre relativi a Gnome 3 di default, ho notato che molte cose sono personalizzabili e molto è in movimento a riguardo (fantastica l'idea di utilizzare CSS e JS per la personalizzazione), ma i pacchetti stabili nei repository di Fedora 15 sono ancora pochi quindi non ho provato customizzazioni iper-alfa trovate qua e là.</em>
<h2>Menu' “Attivita'”</h2>
<em><strong><a href="/uploads/2011/05/Schermata-e1304427884509.png"><img class="alignleft size-thumbnail wp-image-1151" title="Menù Attività" src="/uploads/2011/05/Schermata-150x150.png" alt="" width="150" height="150" /></a>T:</strong> Tra tutte le novità di Gnome 3 questa è quella che mi lascia più dubbi, in particolare mi ha lasciato un po’ perplesso il fatto che debba attivare questo menù per vedere il <strong>dock</strong>. Su Mac (e, diciamocelo, Gnome 3 da MacOSX ha preso moooolta ispirazione quindi il paragone vien da sè) sono abituato a tenerlo in basso a scomparsa. È vero che anche su Gnome 3 può essere considerato a scomparsa, ma non mi torna che per andare a cliccare su un’icona del dock (che si trova al centro del lato sinistro dello schermo), io debba, col mouse, andare a colpire l’angolo superiore sinistro per poi scendere nel dock.</em>
<em>In alternativa posso usare il tasto Win/Cmd ma mentalmente, quando parto per fare una cosa col mouse, tendo a farla tutta col mouse; questa mia abitudine comunque non invalida la critica appena fatta al doppio movimento del mouse per raggiungere il dock .</em>
<em>Ho provato anche il pacchetto gnome-shell-extensions-dock che mostra una copia del dock sempre visibile a destra, ma non permette alcuna personalizzazione (tipo l’autoscomparsa) e quindi ho smesso di usarla (anche se comunque fa il suo dovere).</em>
<em>Riguardo alla gestione delle applicazioni nel dock trovo poco pratico che per eliminare una icona debba portarla sul cestino. Trovo che la soluzione di MacOSX (basta trascinare un’icona fuori dal dock) sia più furba. Mi sembra anche limitante (data la mancanza di collegamenti sul desktop e sulle barre) non poter inserire nel dock link a file o cartelle.</em>

<em><strong>A:</strong> Condivido le obiezioni sulla scelta di colpire in alto per poi doversi spostare sotto, ma devo dire che ho visto cose più scomode! Anche io sono per un diciamocelo: diciamocelo colpire l’angolo in alto a sinistra sembra davvero la cosa più naturale per fa succedere quello che accade, ma forse si potrebbe a mio avviso estendere la “zona di sensibilità” a tutto il bordo sinistro dello schermo in modo da trovarsi “subito” sul dock e far sentire Tommaso un po’ più a casa :P</em>

Sempre nel menù “Attività” si trovano la gestione delle <strong>finestre</strong> e dei <strong>desktop</strong> (che a questo punto non sappiamo se si chiamano ancora così). Crediamo che siano una tra le cose meglio riuscite di Gnome 3: l’effetto exposè è molto fluido (con i driver nouveau, anche se rinunciando ad un po’ di fluidità si guadagna molta batteria sull’xps utilizzando i proprietari nvidia, attualmente inusabili invece sul Macbook Pro dato che freezano il sistema dopo una sospensione) e muovere le finestre tra i desktop è estremamente facile e intuitivo. Ottima anche la gestione dei desktop che nascono e muoiono in modo tale da avere sempre e solo un desktop vuoto oltre a quelli in uso. Lo shortcut Ctrl-Alt-&lt;freccia&gt; per muoversi tra i desktop funziona benissimo, forse sarebbe stato utile avere i desktop a matrice e non in linea (o almeno un menù per scegliere come gestirli).

Altra ottima impressione ce l’ha fatta il <strong>motore di ricerca</strong>: competere con Gnome-do non era facile ma a nostro parere ci riesce bene. Non abbiamo ben capito se piano piano memorizza l’associazione tra le ricerche frequenti e ciò che poi effettivamente viene aperto (sospettiamo di no), ma più o meno troviamo sempre quel che cerchiamo, probabilmente ogni applicazione ha una serie di alias (localizzati) con cui viene indicizzata. Infine, ma fondamentale, non è molto intuitivo il movimento con la tastiera tra i risultati di una ricerca: si devono usare i tasti sù/giù anche se d’istinto entrambi useremmo destra/sinistra, auspichiamo di poterci muovere a matrice il più presto possibile.

<em><strong>T:</strong> Mi sono accorto che spesso non mi ricordo il nome dell’applicazione che sto cercando ma al massimo in 2 o 3 tentativi la trovo anche se non ho digitato il nome esatto.</em>

<em><strong>T:</strong> Ultima parte riguarda il pannello <strong>applicazioni</strong>, che mi lascia qualche dubbio. Si parte dalle cose più pratiche: le icone sono troppo grandi e quando si sfogliano i varì menù il movimento degli occhi per cercare le cose è piuttosto ampio. Sarebbe utile quantomeno poter scegliere come visualizzare le icone. Sempre riguardo alle applicazioni i nomi delle stesse spesso sono lunghi e vengono tagliati. Il problema è che non sono riuscito a visualizzare il nome intero, ad esempio fermando il mouse sull’icona. Se ci fossero due programmi con nomi lunghi e uguali in gran parte non saprei quale lanciare...</em>
<em>Per finire penso che, dopo aver cliccato su “Applicazioni”, quando vengono mostrate quelle nel menù “Tutte”, sarebbe furbo mostrare quelle più usate.</em>

<em><strong>A:</strong> Ho sinceramente usato pochissimo il pannello delle applicazioni, anche a causa dell’abitudine in me radicatissima all’utilizzo di gnome-do, che mi aveva portato a non utilizzare nessuna forma di launcher, quindi non mi pronuncio.  Non sono ancora convinto con il mostrare le applicazioni più usate, personalmente se uso qualcosa tanto, allora senza dubbio mi preoccuperò di inserirlo nel dock .</em>
<h2>Pannelli</h2>
<a href="/uploads/2011/05/Schermata-1-e1304427862380.png" rel="prettyPhoto"><img class="alignleft size-thumbnail wp-image-1153" title="I pannelli" src="/uploads/2011/05/Schermata-1-150x150.png" alt="" width="150" height="150" /></a>I pannelli (superiore e inferiore) rompono veramente con il passato.
In quello inferiore vengono mostrate le notifiche che finora non ci sono sembrate male.

<em><strong>T:</strong> A volte però sono un po’ inutili: ad esempio se da Thunderbird clicco su un link che viene aperto in Firefox, prima mi viene mostrato un inutile “Firefox è pronto” seguito da una seconda notifica con il titolo della pagina aperta. Ho inoltre l’impressione che la seconda notifica faccia sparire la prima, che potrebbe non essere molto intelligente se avevo bisogno di leggerla. Le icone delle applicazioni riguardanti le notifiche passate rimangono visualizzate in basso a destra, ma se più notifiche riguardano la stessa applicazione viene visualizzata solo un’icona (che rende quindi difficile capire cosa dicesse una notifica sparita in tutta fretta per l’arrivo di una seconda). Per ora resto dell’idea che le notifiche presenti nel vecchio Gnome o quelle Growl di MacOSX siano un po’ più utili.</em>

Il pannello in alto prende un po’ le funzionalità del pannello di MacOSX, cosa che adoriamo (<em><strong>T:</strong> anche su Gnome 2 ho sempre usato l’estensione del pannello per inglobare il menù delle applicazioni</em>). Attualmente il menù delle applicazioni che abbiamo provato rimane all’interno delle stesse, immaginiamo (e speriamo :P) che piano piano inizierà a spostarsi nel pannello di Gnome... In effetti ora come ora le funzionalità nel pannello in alto sono piuttosto minimali, ma facilmente estensibili con le già citate gnome-shell-extensions (<em><strong>T:</strong> e in quel vuotume la mancanza dei collegamenti e delle applet si fa sentire!</em>).

<a href="/uploads/2011/05/Schermata-2-e1304427845750.png" rel="prettyPhoto"><img class="alignleft size-thumbnail wp-image-1154" title="Calendario" src="/uploads/2011/05/Schermata-2-150x150.png" alt="" width="150" height="150" /></a>Ci sentiamo di elogiare la chiarezza del menù del calendario/data ma:

<em><strong>T:</strong> Peccato però che attualmente sia praticamente inutile dato che non uso Evolution ma Thunderbird. Mi sembra piuttosto assurdo che il calendario possa mostrare solo eventi del calendario di Evolution, spero che ben presto venga modificato questo comportamento. Esiste un modo per fargli visualizzare gli eventi di Lightning (l’estensione calendario per Thunderbird) ma richiede di creare un account in Evolution (e quindi impedisce di poterlo disinstallare) e l’installazione dell’estensione di Thunderbird “Evolution mirror” che però al momento non funziona dato che richiede gnome-python2-evolution, ad oggi non funzionante dato che non supporta il passaggio alle nuove Gtk3 (o almeno questo ho capito da una veloce lettura della mailing-list degli sviluppatori).</em>

<em><strong>A:</strong> Per quanto riguarda il calendario mi sarebbe piaciuto poter aggiungere eventi direttamente dal pop-up senza dover avviare tutto evolution. Non che il pim di gnome non mi piaccia, funziona benissimo con la rubrica di gmail e google calendar e tutto quanto, ma aggiungere/modificare gli eventi dal popup sarebbe davvero carino. </em>

<em><strong><a href="/uploads/2011/05/Schermata-3-e1304427828982.png" rel="prettyPhoto"><img class="alignleft size-thumbnail wp-image-1155" title="Menù utente" src="/uploads/2011/05/Schermata-3-150x150.png" alt="" width="150" height="150" /></a>T:</strong> Il menù dell'utente è ben progettato, ho inserito la possibilità di spegnere direttamente il pc (sempre con una gnome-shell-extension) anziché utilizzare il tasto Alt per modificare "Sospendi" in "Spegni", questa scelta di default non mi è sembrata molto intuitiva.
Il fatto che possa scegliere da quel menù il mio stato globalmente (attualmente solo "Disponibile" o "Non disponibile") mi piace, ma lo trovo un po' fuorviante se le mie connessioni sono spente.
</em>
<h2>Varie</h2>
<em><strong>T:</strong> Ho notato la quasi totale mancanza di possibilità di personalizzare l’aspetto di gnome (a meno di non scriversi un tema). Sono riuscito a modificare qualcosa (ad esempio i font) installando gnome-tweak-tool ma molte cose mancano.</em>

La mancanza dei bottoni di massimizzazione-minimizzazione non si fanno mancare più di tanto (anche se sono reinseribili da gnome-tweak-tool): per ingrandire basta un doppio click sulla barra in alto e minimizzare non ha molto senso data la mancanza del desktop, basta usare Exposè per passare da una finestra all’altra. Riguardo la mancanza del desktop (inteso nel senso standard con icone, file e collegamenti) non ne abbiamo sentito la mancanza ma probabilmente sarà una delle cose che darà più grattacapi agli sviluppatori :-)

Un’ultima osservazione sulla chiusura di alcune applicazioni, in particolare quelle che vengono “minimizzate” alla chiusura (per le altre non abbiamo notato problemi, basta cliccare sulla X). Un esempio lampante è Empathy: quando lo proviamo a chiudere rimane aperto e si vede l’icona in basso a destra. Se nel suo menù (nella barra in alto) scegliamo “Chiudi Empaty”, Empathy non si chiude ma di nuovo si minimizza.... Qualcosa non torna! Per chiuderlo dobbiamo aprirlo e dal suo menù “Conversazione” (ma che cavolo c’entra proprio non lo si capisce....) e premere Esci. L’impressione è che ancora ci sia molta confusione sul chi deve fare cosa e dove deve farlo.

<em><strong>T:</strong> Proprio mentre stavo finendo di scrivere queste frasi mi sono arrivati dei messaggi in Empathy e sono successi vari casini con le notifiche (chat sparite, riapparse, icone strane) tanto che ho dovuto cercare Empathy dal menù per aprirlo direttamente. </em>

<em><strong>A:</strong> I messaggi che hanno causato questi problemi li ho mandati io a Tommaso, l’unico appunto a riguardo che mi sento di fare è che io toglierei del tutto le finestre di conversazione poiché i popup nella barra in basso con le chat in corso li trovo di gran lunga più comodi, usando solo quelli non ci si accorge che, come dice giustamente Tommaso, a volte occorre fare la caccia alla chat per terminare un discorso :P</em>
<h2>Conclusioni</h2>
<em>Alla fine del palo</em> :) quel che possiamo senza dubbio affermare è che la <a title="Gnome Foundation" href="http://foundation.gnome.org/" target="_blank">Gnome Foundation</a> ha il grande merito di aver osato rivoluzionare il concetto di desktop (quelli di KDE prendano spunto...); forse il risultato è ancora un po’ lontano dall’essere raggiunto davvero, ma l’esperienza, per quanto molto diversa dal “tradizionale” Gnome 2, risulta piacevole e, soprattutto, usabile. Forse la forte somiglianza di certe cose con MacOSX farà sorridere gli appassionati della mela, ma se le cose sono fatte bene, perchè non prenderne spunto?
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/05/03/prime-impressioni-su-gnome-3/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/05/03/prime-impressioni-su-gnome-3</feedburner:origLink></item>
		
		  <item>
  		<title>Backup di Zimbra Open Source 7.1.0 con LVM e rsnapshot</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/VPEVV76wqzc/backup-di-zimbra-open-source-7-1-0-con-lvm-e-rsnapshot</link>
  		<comments>/2011/04/21/backup-di-zimbra-open-source-7-1-0-con-lvm-e-rsnapshot/#comments</comments>
  		<pubDate>2011-04-21T15:25:25+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1127</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Chiunque abbia mai fatto il backup di un server di posta sa che l'imperativo è "Ridurre il downtime!".
Ho recentemente modificato lo script di backup che utilizzavo per il server Zimbra (preso da quelli disponibili <a href="http://wiki.zimbra.com/wiki/Open_Source_Edition_Backup_Procedure" target="_blank">qui</a>) in modo da utilizzare gli snapshot di LVM e rsnapshot. Adesso il downtime è limitato al tempo di stop/start di Zimbra e al tempo di snapshot di LVM (circa 2 minuti in totale, di cui pochi istanti di snapshot) e posso con calma effettuare il backup utilizzando rsnapshot che permette di effettuare backup incrementali con uno "spreco" di spazio veramente minimo.

La parte riguardante <strong>rsnapshot</strong> è molto semplice: si deve effettuare il backup della cartella in cui viene montato lo snapshot, ovvero <em>/mnt/tmp_backup/ZimbraBackup/</em>. Il resto della configurazione è standard.

Ecco invece lo script da inserire in <em>/etc/cron.daily/</em>:

<div class="highlight"><pre><code class="bash"><span class="c">#!/bin/bash</span>

<span class="c"># Where the temporary snapshot will be mounted</span>
<span class="nv">TEMPDIR</span><span class="o">=</span><span class="s2">&quot;/mnt/tmp_backup&quot;</span>

<span class="c"># The size of the snapshot volume</span>
<span class="nv">VOLSIZE</span><span class="o">=</span><span class="s2">&quot;10G&quot;</span>
<span class="c"># Dynamic volsize, change the mountpoint to fit your conf</span>
<span class="c">#VOLSIZE=`df -h | grep /opt | awk &#39;{print $4}&#39;`</span>

<span class="c"># what to backup, in my case: /dev/vg0/opt</span>
<span class="nv">VG</span><span class="o">=</span><span class="s2">&quot;vg0&quot;</span>
<span class="nv">LV</span><span class="o">=</span><span class="s2">&quot;opt&quot;</span>

<span class="c"># snapshot name</span>
<span class="nv">LV_SNAP</span><span class="o">=</span><span class="s2">&quot;ZimbraBackup&quot;</span>

<span class="c"># lvcreate and lvremove commands path</span>
<span class="nv">lvcreate_cmd</span><span class="o">=</span><span class="s2">&quot;/sbin/lvcreate&quot;</span>
<span class="nv">lvremove_cmd</span><span class="o">=</span><span class="s2">&quot;/sbin/lvremove&quot;</span>

<span class="c"># Choose the backup</span>
<span class="c">#</span>
<span class="c"># monthly =&gt; first day of month</span>
<span class="c"># weekly =&gt; on sunday</span>
<span class="c"># daily =&gt; daily :)</span>

<span class="nv">BACKUP_TYPE</span><span class="o">=</span><span class="s2">&quot;daily&quot;</span>

<span class="k">if</span> <span class="o">[</span> <span class="sb">`</span>date +%d<span class="sb">`</span> <span class="o">==</span> <span class="s2">&quot;01&quot;</span> <span class="o">]</span>; <span class="k">then</span>
<span class="k"> </span><span class="nv">BACKUP_TYPE</span><span class="o">=</span><span class="s2">&quot;monthly&quot;</span>
<span class="k">elif</span> <span class="o">[</span> <span class="sb">`</span>date +%u<span class="sb">`</span> <span class="o">==</span> <span class="s2">&quot;7&quot;</span> <span class="o">]</span>; <span class="k">then</span>
<span class="k"> </span><span class="nv">BACKUP_TYPE</span><span class="o">=</span><span class="s2">&quot;weekly&quot;</span>
<span class="k">fi</span>

<span class="nb">echo</span> -e <span class="s2">&quot;Backup started at `date`&quot;</span>

<span class="c"># Stop the Zimbra services</span>
<span class="nv">before</span><span class="o">=</span><span class="s2">&quot;$(date +%s)&quot;</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Stopping the Zimbra services...&quot;</span>
/etc/init.d/zimbra stop <span class="o">||</span> <span class="nb">exit</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Creating a snapshot called $LV_SNAP&quot;</span>

<span class="c"># depending on the time it takes to create the backup and the traffic of your server, you may need to increase the 2G value</span>
<span class="nv">$lvcreate_cmd</span> -L<span class="nv">$VOLSIZE</span> -s -n <span class="nv">$LV_SNAP</span> /dev/<span class="nv">$VG</span>/<span class="nv">$LV</span>

<span class="c"># Create a mountpoint to mount the logical volume to</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Creating a mountpoint for the LV...&quot;</span>
mkdir -p <span class="nv">$TEMPDIR</span>/<span class="nv">$LV_SNAP</span>

<span class="c"># Mount the logical volume to the mountpoint</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Mounting the snapshot...&quot;</span>

<span class="c"># WARNING: if you use xfs you MUST add nouuid option here!</span>
mount -o ro,nouuid /dev/<span class="nv">$VG</span>/<span class="nv">$LV_SNAP</span> <span class="nv">$TEMPDIR</span>/<span class="nv">$LV_SNAP</span>/

<span class="c"># Start the Zimbra services</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Restarting the Zimbra services...&quot;</span>
/etc/init.d/zimbra start <span class="o">||</span> <span class="nb">echo</span> -e <span class="s2">&quot;ERROR restarting zimbra&quot;</span>

<span class="c"># Calculates and outputs amount of time the server was down for</span>
<span class="nv">after</span><span class="o">=</span><span class="s2">&quot;$(date +%s)&quot;</span>
<span class="nv">elapsed</span><span class="o">=</span><span class="s2">&quot;$(expr $after - $before)&quot;</span>
<span class="nv">hours</span><span class="o">=</span><span class="k">$((</span><span class="nv">$elapsed</span> <span class="o">/</span> <span class="m">3600</span><span class="k">))</span>
<span class="nv">elapsed</span><span class="o">=</span><span class="k">$((</span><span class="nv">$elapsed</span> <span class="o">-</span> <span class="nv">$hours</span> <span class="o">*</span> <span class="m">3600</span><span class="k">))</span>
<span class="nv">minutes</span><span class="o">=</span><span class="k">$((</span><span class="nv">$elapsed</span> <span class="o">/</span> <span class="m">60</span><span class="k">))</span>
<span class="nv">seconds</span><span class="o">=</span><span class="k">$((</span><span class="nv">$elapsed</span> <span class="o">-</span> <span class="nv">$minutes</span> <span class="o">*</span> <span class="m">60</span><span class="k">))</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Server was down for: $hours hours $minutes minutes $seconds seconds&quot;</span>

<span class="c"># Launch rsnapshot to backup</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Executing $BACKUP_TYPE backup...&quot;</span>
<span class="nb">echo</span> -e <span class="s2">&quot;rsnapshot $BACKUP_TYPE&quot;</span>
rsnapshot <span class="nv">$BACKUP_TYPE</span>

<span class="c"># Unmount /tmp/$lv_zimbra and remove the logical volume</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Unmounting and removing the snapshot.&quot;</span>
umount /dev/<span class="nv">$VG</span>/<span class="nv">$LV_SNAP</span>
<span class="nv">$lvremove_cmd</span> --force /dev/<span class="nv">$VG</span>/<span class="nv">$LV_SNAP</span>
<span class="nb">echo</span> -e <span class="s2">&quot;$lvremove_cmd /dev/$VG/$LV_SNAP&quot;</span>

<span class="c"># Done!</span>
<span class="nb">echo</span> -e <span class="s2">&quot;Backup ended at `date`&quot;</span>
</code></pre>
</div>
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/04/21/backup-di-zimbra-open-source-7-1-0-con-lvm-e-rsnapshot/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/04/21/backup-di-zimbra-open-source-7-1-0-con-lvm-e-rsnapshot</feedburner:origLink></item>
		
		  <item>
  		<title>Realizzare un sistema di monitoraggio con Icinga</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/QB2gZmoBOpU/realizzare-un-sistema-di-monitoraggio-con-icinga</link>
  		<comments>/2011/03/08/realizzare-un-sistema-di-monitoraggio-con-icinga/#comments</comments>
  		<pubDate>2011-03-08T17:45:38+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1108</guid>
  		
  		<description />
  			<content:encoded><![CDATA[In questa breve guida spiegherò come installare Icinga (un fork di Nagios che ha ormai superato il <em>genitore</em>) e Icinga Web su Ubuntu 10.04 server.

Molti passi sono uguali a quelli che ho già descritto nelle due guide sull'installazione di Nagios (<a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/">1</a> e <a href="http://www.tommyblue.it/2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2/">2</a>).
<h2>Operazioni preliminari</h2>
Installare i pacchetti necessari:
<pre>apt-get install apache2 bsd-mailx build-essential libgd2-xpm-dev libjpeg62 libjpeg62-dev libpng12-0 libpng12-0-dev snmp libsnmp-base git-core mysql-server mysql-client libdbi0 libdbi0-dev libdbd-mysql</pre>
Aggiungere utenti e gruppi:
<pre>addgroup --system icinga
adduser --system --no-create-home --home /usr/local/icinga --ingroup icinga --disabled-password icinga
addgroup --system icinga-cmd
usermod -a -G icinga-cmd icinga
usermod -a -G icinga-cmd www-data</pre>
Creare il database:
<pre> #&gt; mysql -u root -p
 mysql&gt; CREATE DATABASE icinga;
 GRANT USAGE ON *.* TO 'icinga'@'localhost' IDENTIFIED BY 'icinga' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;
 GRANT SELECT , INSERT , UPDATE , DELETE ON icinga.* TO 'icinga'@'localhost';
 FLUSH PRIVILEGES ;
 quit</pre>
Scaricare Icinga:
<pre>cd /usr/src
git clone git://git.icinga.org/icinga-core.git
cd icinga-core/
git submodule init
git submodule update
./configure --with-command-group=icinga-cmd --enable-idoutils
make all
make fullinstall
make install-api
cd /usr/local/icinga/etc/
cp idomod.cfg-sample idomod.cfg
cp ido2db.cfg-sample ido2db.cfg</pre>
Editare i due ultimi file per adattarli alle configurazioni del database. Nel file <em>/usr/local/icinga/etc/icinga.cfg</em> scommentare la riga:
<pre>broker_module=/usr/local/icinga/bin/idomod.o config_file=/usr/local/icinga/etc/idomod.cfg</pre>
Creare le tabelle:
<pre> #&gt; cd /path/to/icinga-src/module/idoutils/db/mysql
 #&gt; mysql -u root -p icinga &lt; mysql.sql</pre>
<strong>Edit 15/03/11:</strong>
Ho dovuto modificare il file <em>/usr/local/icinga/etc/objects/commands.cfg</em> perchè il path al comando <em>mail</em> era sbagliato, quindi modificate le definizioni di <em>notify-host-by-email</em> e <em>notify-service-by-email</em> per utilizzare<em> /usr/bin/mail</em> e non <em>/bin/mail</em>.

Per terminare aggiungere Icinga ai servizi di avvio e lanciare Ido2db e Icinga:
<pre>update-rc.d icinga defaults
/etc/init.d/ido2db start
/etc/init.d/icinga restart</pre>
<h2>Plugins</h2>
Scaricare e installare i <a href="http://www.nagiosplugins.org/" target="_blank">plugin di Nagios</a>. Si faccia riferimento alla<a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/" target="_blank"> guida di Nagios</a> per l'installazione, si presti solo attenzione alle differenti opzioni di configurazione:
<pre>./configure --prefix=/usr/local/icinga --with-cgiurl=/icinga/cgi-bin --with-htmurl=/icinga --with-nagios-user=icinga --with-nagios-group=icinga</pre>
<h2>Configurazione dei check</h2>
Per la configurazione degli host e dei servizi potete vedere le mie precedenti guide per Nagios: <a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/">parte 1</a> e <a href="http://www.tommyblue.it/2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2/">parte 2</a>.
<h2>Le interfacce web</h2>
Icinga ha a disposizione due interfacce web: la classica interfaccia CGI e la nuova Icinga Web. Le due installazioni possono convivere tranquillamente.
<h3>Icinga</h3>
Installare i CGI:
<pre>make cgis
make install-cgis
make install-html
make install-webconf</pre>
Creare l'utente e la password per l'accesso:
<pre>htpasswd -c /usr/local/icinga/etc/htpasswd.users icingaadmin</pre>
<h3>Icinga Web</h3>
Installare il necessario:
<pre>apt-get install php5 php5-cli php-pear php5-xmlrpc php5-xsl php5-gd php5-ldap php5-mysql
a2enmod rewrite</pre>
Scaricare e installare Icinga Web:
<pre>cd /usr/src
git clone git://git.icinga.org/icinga-web.git
cd icinga-web
./configure
make install
make install-apache-config</pre>
Creare il database e lo schema:
<pre># mysql -u root -p

mysql&gt; CREATE DATABASE icinga_web;
       GRANT USAGE ON *.* TO 'icinga_web'@'localhost' IDENTIFIED BY 'icinga_web' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;
       GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX ON icinga_web.* TO 'icinga_web'@'localhost';
       quit

# make db-initialize</pre>
E, per finire:
<pre>/etc/init.d/icinga restart
/etc/init.d/apache2 restart</pre>
Se avete utilizzato le impostazioni di default non dovete fare altro, altrimenti date una lettura alla <a title="Installation of the Icinga Web Frontend" href="http://docs.icinga.org/latest/en/icinga-web-scratch.html" target="_blank">guida ufficiale</a>. Riavviate apache e connettetevi al server: <em>http://&lt;hostname&gt;/icinga-web</em>
<h2>Webografia</h2>
<ul>
	<li><a title="Icinga with IDOUtils Quickstart" href="http://docs.icinga.org/latest/en/quickstart-idoutils.html" target="_blank">http://docs.icinga.org/latest/en/quickstart-idoutils.html</a></li>
	<li><a title="Installation of the Icinga Web Frontend" href="http://docs.icinga.org/latest/en/icinga-web-scratch.html" target="_blank">http://docs.icinga.org/latest/en/icinga-web-scratch.html</a></li>
</ul>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/03/08/realizzare-un-sistema-di-monitoraggio-con-icinga/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/03/08/realizzare-un-sistema-di-monitoraggio-con-icinga</feedburner:origLink></item>
		
		  <item>
  		<title>How to build a website with Locomotive CMS from scratch</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/fNZj1A0Vamg/how-to-build-a-website-with-locomotive-cms-from-scratch</link>
  		<comments>/2011/02/28/how-to-build-a-website-with-locomotive-cms-from-scratch/#comments</comments>
  		<pubDate>2011-02-28T01:01:12+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1075</guid>
  		
  		<description />
  			<content:encoded><![CDATA[A few weeks ago I've found <a title="Locomotive CMS" href="http://www.locomotivecms.com/" target="_blank">Locomotive CMS</a>, an open source CMS for Ruby on Rails written by the french guys from <a title="NoCoffee" href="http://www.nocoffee.fr/" target="_blank">NoCoffee</a>. The project is still in beta but after some nights spent on it seemed to me a good piece of code and I decided to use it to serve my portfolio site <a title="Kreations Collective" href="http://www.kreations.it" target="_blank">http://www.kreations.it</a>. In this how-to I'll explain my experience while building it, you can follow these steps to build your own site.

<strong>For italian readers:</strong> questa guida è stata scritta in inglese affinchè possa contribuire alla scarsa documentazione presente.
<h2>Requirements</h2>
For a basic installation follow the <em>official</em> guide: <a href="http://www.locomotivecms.com/support/installation/engine" target="_blank">http://www.locomotivecms.com/support/installation/engine</a>

If you want to use it in production you can follow my <a href="http://www.tommyblue.it/2009/11/14/deploy-di-applicazioni-rails-con-unicorn-e-nginx/" target="_blank">old guide to use Nginx+Unicorn</a> (italian language). However this how-to refers to a local development installation (<em>Engine installation</em> method) because i'm having a lot of problems with the deployment. I'll add a new paragraph when i'll succeed in it :-)

To install MongoDB on Debian-based distribution take a look <a href="http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages" target="_blank">here</a>.

Choose or create a web template (HTML, CSS, Javascripts).

I suggest to install Locomotive on your pc with a theme proposed <a href="http://www.locomotivecms.com/support/themes" target="_blank">here</a>.  Browse pages, templates and models and try to understand how Locomotive  works. I think it's not so easy to understand it if you, like me, are  coming from a long experience with Wordpress, Drupal or Joomla. When you fell just a bit comfortable with it, go on with this how-to. If you need help you can look in the <a href="http://locomotive.vanillaforums.com/" target="_blank">support forum</a> or the <a href="https://github.com/locomotivecms/engine/issues" target="_blank">Github page</a>.
<h2>Pages and Templates</h2>
The main work in the backend while building the website will be done in the <em>Page</em> panel. From there, click the <em>Pages</em> badge and you can see existing pages or add a new page.
Every page except the first inherits from the <em>Home page</em> or one of its children (and so do their templates). This means that we'll write a template in the <em>Home page</em>'s <em>Template</em> section and the other pages will inherit their templates from it. This means that, except for local content, there's only a place where to modify the HTML template. Obviously if you need you can prevent a page to inherit the template and write a new one.

Go back to the <em>Page</em> panel and open the <em>Home Page</em>. There are two sections: <em>General information</em> and  <em>Template</em>.
The <em>General information</em> section's content is well inline-explained, just dwell on <em>Templatized</em>: you can choose if that page is a template. If you activate this option, the page will be a template for a model, ie it can be used to create new content of that model type  (see the <em>Contact page</em> paragraph below for an example).
The <em>Template</em> section is the more important: you can write the HTML template of your site using the <a href="http://www.liquidmarkup.org/">Liquid Templating Language</a> and if you define editable sections, a useful WYSIWYG will appear after the update.
Templates are really a great feature because you can create a complex template and then give the control of the contents to a not-technician who can fill the editable sections with a powerful editor.

So, let's start uploading the needed files: css, javascripts and images. Do it from <em>Settings &gt; Theme files</em>, if you use the <em> images</em>, <em>javascripts</em> and <em>stylesheets</em> folder they will be put in the right place and you can get it with liquid's tags (I'm getting big errors while uploading in production, but everyting works fine in the development environment).
Then copy your HTML template and paste it in the <em>Template</em> section inside the <em>Home page</em>. Before saving it, let's edit it.

Css and javascripts tags must be replaced with the <em>liquid</em> ones. In my case:
<pre>&#123;&#123; 'reset-min' | stylesheet_tag &#125;&#125;
&#123;&#123; '960grid' | stylesheet_tag &#125;&#125;
&#123;&#123; 'style' | stylesheet_tag &#125;&#125;
&#123;&#123; 'nivo-slider' | stylesheet_tag &#125;&#125;

&#123;&#123; 'jquery.min.js' | javascript_tag &#125;&#125;
&#123;&#123; 'jquery.nivo.slider.pack' | javascript_tag &#125;&#125;</pre>
As you can see, if you have used the right folders while uploading, now it's really easy to add them to the template.

The site title can be get from the Locomotive site, do it with:
<pre>&lt;title&gt;&#123;&#123; site.name &#125;&#125;&lt;/title&gt;</pre>
My template has a side menu listing. I can create it using liquid:
<pre>&lt;nav id="main_menu"&gt;
  &lt;ul&gt;
    &lt;li class="&#123;% if page.fullpath == 'index' %&#125;on&#123;% endif %&#125;"&gt;&lt;a href="/"&gt;Home Page&lt;/a&gt;&lt;/li&gt;
    &#123;% nav site, no_wrapper: true %&#125;
  &lt;/ul&gt;
&lt;/nav&gt;</pre>
This will generate a list with every page with the <em>Listed</em> option set as on. The active page will automatically get the <em>on</em> class, so remember to use it.

Before saving the template let's add a <em>block</em>: a block is a part of the template which can be overwritten from the pages which inherits from that template. I'll call it <em>main_content</em> and it will contain the section of the page which changes between the various pages.
<pre>&#123;% block main_content %&#125;
  ...
&#123;% endblock %&#125;</pre>
<h2>Models</h2>
After this basic introduction to liquid templates, let's jump to the models: a model is a custom content type where you can define the fields the content type must have. Are you puzzled? Ok, let's do an example..

I want to create a simple blog section in the site and I want to show the last 3 entries in the footer. So i need to create a <em>blog</em> page to show the posts (with pagination) and in the footer I must show only the last 3 posts' summary.

The first step is to create the model. Go to the <em>Page</em> panel and click on the <em>New model</em> link on the top-right of that page. Insert the model's <em>title</em> and <em>slug</em> (if empty) then choose your custom fields. For my posts I choosed a title (<em>Simple Input</em>), a summary (<em>Text</em>), a content (<em>Text</em>) and a thumbnail (<em>File</em>). Save the model then add a few posts. Jump back to the <em>Home page</em> template and add this into the footer:
<pre>&#123;% for post in contents.posts limit:3 %&#125;
  &lt;article&gt;
    &lt;h2&gt;&#123;&#123; post.title &#125;&#125;&lt;/h2&gt;
    &#123;&#123; post.summary &#125;&#125;
    &lt;a href="/blog/&#123;&#123; post._permalink &#125;&#125;"&gt;Continue reading &amp;raquo;&lt;/a&gt;
  &lt;/article&gt;
&#123;% endfor %&#125;</pre>
The <em>for</em> cycle gets the content of the posts (<em>contents.posts</em>) and show its summary with a link to the full article.  To let the <em>post._permalink</em> work we must create a new page (<em>blog</em>) which will show the posts and a templatized page to contain a single post.

The <em>blog</em> page template will contain:
<pre>&#123;% extends 'parent' %&#125;

&#123;% block main_content %&#125;
 &#123;% paginate contents.posts by 10 %&#125;
   &#123;% for post in paginate.collection %&#125;
     &lt;article&gt;
       &lt;h4&gt;&lt;a href="/blog/&#123;&#123; post._permalink &#125;&#125;"&gt;&#123;&#123; post.title &#125;&#125;&lt;/a&gt;&lt;/h4&gt;
       &lt;summary&gt;
         &#123;&#123; post.summary &#125;&#125; &lt;a href="/blog/&#123;&#123; post._permalink &#125;&#125;"&gt;Continua &amp;raquo;&lt;/a&gt;
       &lt;/summary&gt;
     &lt;/article&gt;
   &#123;% endfor %&#125;
   &#123;&#123; paginate | default_pagination: 'previous_label:Recent', 'next_label:Older' &#125;&#125;
 &#123;% endpaginate %&#125;
&#123;% endblock %&#125;</pre>
This will show the last 10 entries and the links to go backward and forward. The order can be changed from the post model, <em>Edit model &gt; Advanced options &gt; Order by</em> select menu.

For a single post let's create a new templatized page with the <em>blog</em> page as parent and with <em>posts</em> as <em>Content type</em>. The template will be:
<pre>&#123;% extends 'parent' %&#125;

&#123;% block main %&#125;
 &lt;article&gt;
   &lt;h2&gt;&#123;&#123; post.title &#125;&#125;&lt;/h2&gt;
   &#123;&#123; post.body &#125;&#125;
 &lt;/article&gt;
&#123;% endblock %&#125;</pre>
<h2>Editable content</h2>
As mentioned above it's possible to declare editable content: this will give you the possibility to edit part of a page with a handy editor. As usual let's make an example.
Add a new page and use this code as template:
<pre>&#123;% extends 'parent' %&#125;

&#123;% block main_content %&#125;
 &#123;% editable_long_text 'page_content' %&#125;
 blabla
 &#123;% endeditable_long_text %&#125;
&#123;% endblock %&#125;</pre>
Save the page and, et voilà, you'll see the WYSIWIG appear under the <em>Main content </em>tab. Edit the page content directly from there.
<h2>Contact page and API</h2>
I want to add a page from which I can be contacted by visitors. This is pretty simple: add a new <em>messages</em> model with the custom field you need (in my case: <em>Name, Email</em> and <em>Message</em>) then activate the <em>Advanced options &gt; API enabled</em> option. Choose the accounts to be notified and save.
This will create a model which can be populated from inside a page and an email message will be sent to the selected accounts when this message is posted.

To finish, let's put this code into the contact page template:
<pre>&#123;% extends 'parent' %&#125;

&#123;% block main_content %&#125;
&lt;div class="text"&gt;
 &#123;% editable_long_text 'main_content' %&#125;
   bla bla
 &#123;% endeditable_long_text %&#125;
&lt;/div&gt;

&lt;form id="contactform" name="contact" action="&#123;&#123; contents.messages.api.create &#125;&#125;" method="post"&gt;
 &lt;p&gt;
  &lt;label for="name"&gt;Nome&lt;/label&gt;
  &lt;input type="text" id=name name="content[name]" placeholder="First and last name" required tabindex="1" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
  &lt;label for="email"&gt;Email&lt;/label&gt;
  &lt;input type="text" id=email name="content[email]" placeholder="example@domain.com" required tabindex="2" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
  &lt;label for="comment"&gt;Il tuo messaggio&lt;/label&gt;
  &lt;textarea name="content[message]" id="comment" tabindex="3" required&gt;&lt;/textarea&gt;
 &lt;/p&gt;
 &lt;p class="action"&gt;
  &lt;input name="submit" type="submit" id="submit" tabindex="4" value="Send Message" /&gt;
 &lt;/p&gt;
&lt;/form&gt;

&lt;script type="text/javascript"&gt;
 $(document).ready(function() &#123;
  var form = $('form[name=contact]');

  form.submit(function(e) &#123;
   e.stopPropagation();
   e.preventDefault();

   $.post(form.attr('action'),
   form.serializeArray(),
   function(data) &#123;
    if (data.errors == null) &#123;
     alert("Thank you ! Your message have been received");
     form[0].reset();
    &#125; else &#123;
     alert("We are sorry but we were unable to treat your message. Please try later.");
    &#125;, "json");
  &#125;);
 &#125;);
&lt;/script&gt;
&#123;% endblock %&#125;</pre>
Eventually you can write some javascript checks.
<h2>Conclusions</h2>
With this little guide I've covered the few things you should know to set up a basic portfolio. There're a lot of other arguments to cover, surely I'll write again when I'll be more prepared.
Currently all this guide is about self-teaching, so please insert a comment to this post if I made a mistake or if exists a better way to do something. As an example I admit i havo no idea what the <em>Assests</em> panel and the <em>Settings &gt; Theme files &gt; Snippets</em> are.... Or how to edit images while uploading, I don't know if this is possible, but ImageMagick is a requisite so it should... :-)

As mentioned before, you can see the result of my work here: <a title="Kreations" href="http://www.kreations.it" target="_blank">http://www.kreations.it</a>
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/02/28/how-to-build-a-website-with-locomotive-cms-from-scratch/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/02/28/how-to-build-a-website-with-locomotive-cms-from-scratch</feedburner:origLink></item>
		
		  <item>
  		<title>Realizzare un dominio con Samba 3 come Primary Domain Controller</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/o1cSqmdgWTA/realizzare-un-dominio-con-samba-3-come-pdc</link>
  		<comments>/2011/02/14/realizzare-un-dominio-con-samba-3-come-pdc/#comments</comments>
  		<pubDate>2011-02-14T00:10:57+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1063</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Questa guida può essere vista come un aggiornamento della vecchia guida <a title="Realizzare un dominio Windows con Linux: Samba come PDC" href="2008/02/06/realizzare-un-dominio-windows-con-linux-samba-come-pdc/"><em>Realizzare un dominio Windows con Linux: Samba come PDC</em></a>, ma la procedura è cambiata sostanzialmente, soprattutto per l'aggiornamento del server LDAP. Ho testato il tutto su Ubuntu 8.04 e 8.10.

Si può "ciecamente" seguire i vari passaggi per ottenere un dominio funzionante in pochi minuti, volendo invece approfondire si può leggere i due link principali che ho seguito: OpenLDAP è stato installato seguendo <a href="http://help.ubuntu-it.org/10.04/ubuntu/serverguide/it/openldap-server.html" target="_blank">questa guida</a> e configurato per l'autenticazione seguendo quest'<a href="https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html#openldap-auth-config" target="_blank">altra guida</a>. Al termine dell'articolo ho comunque riportato tutta una serie di link che ho visitato.

Prima di iniziare scegliete il nome del dominio. Può essere un semplice <em>TOMMYBLUE</em> oppure un più complesso <em>BASE.TOMMYBLUE.IT</em>. Non cambia molto, basta "tradurre" correttamente il tutto in <em>ldappese</em>, quindi <em>TOMMYBLUE</em> sarà <em>dc=tommyblue</em> mentre <em>BASE.TOMMYBLUE.IT</em> diventa <em>dc=base,dc=tommyblue,dc=it</em>. Io per semplicità ho usato soltanto <em>DOMAIN</em>, fate le opportune sostituzioni. Scegliete anche una password e sostituitela dove io ho messo <em>PASSWORD</em>.
<h2>Installazione di SLAPD</h2>
Si inizia installando i pacchetti necessari:
<pre>sudo apt-get install slapd ldap-utils</pre>
E inserendo alcuni schemi base:
<pre>sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif</pre>
Creiamo poi un file <em>backend.ldif</em> con:
<pre>dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb

dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=DOMAIN
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=DOMAIN
olcRootPW: PASSWORD
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=DOMAIN" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=DOMAIN" write by * read</pre>
E inseriamolo nel db:
<pre>sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.ldif</pre>
Creiamo <em>frontend.ldif</em>:
<pre>dn: dc=DOMAIN
objectClass: top
objectClass: dcObject
objectclass: organization
o: MyDomain
dc: DOMAIN
description: My Domain's LDAP

dn: cn=admin,dc=DOMAIN
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: PASSWORD

dn: ou=People,dc=DOMAIN
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=DOMAIN
objectClass: organizationalUnit
ou: Groups

dn: uid=john,ou=People,dc=DOMAIN
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 10000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@mymaildomain.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress:
initials: JD

dn: cn=example,ou=Groups,dc=DOMAIN
objectClass: posixGroup
cn: example
gidNumber: 10000</pre>
e inseriamolo nel db:
<pre>sudo ldapadd -x -D cn=admin,dc=DOMAIN -W -f frontend.ldif</pre>
Aggiungiamo degli indici per velocizzare le query, creiamo il file <em>uid_index.ldif</em>:
<pre>dn: olcDatabase={1}hdb,cn=config
add: olcDbIndex
olcDbIndex: uid eq,pres,sub</pre>
E inseriamoli:
<pre>sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f uid_index.ldif</pre>
È necessario anche convertire gli schema al nuovo formato, creiamo quindi il file <em>schema_convert.conf</em>:
<pre>include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema</pre>
Creiamo una directory temporanea in cui salvare l'output:
<pre>mkdir -p ./tmp/ldif_output</pre>
E convertiamo il file schema in LDIF:
<pre>slapcat -f schema_convert.conf -F ./tmp/ldif_output -n0 -s "cn={5}dyngroup,cn=schema,cn=config" &gt; ./tmp/cn=dyngroup.ldif</pre>
Il file <em>./tmp/cn\=dyngroup.ldif</em> va modificato in questo modo:
<pre>dn: cn=dyngroup,cn=schema,cn=config
...
cn: dyngroup</pre>
E rimosse le seguenti righe dalla fine del file:
<pre>structuralObjectClass: olcSchemaConfig
entryUUID: 10dae0ea-0760-102d-80d3-f9366b7f7757
creatorsName: cn=config
createTimestamp: 20080826021140Z
entryCSN: 20080826021140.791425Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20080826021140Z</pre>
Infine inseriamo gli schema nel db:
<pre>sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ./tmp/cn\=dyngroup.ldif</pre>
Con questo comando possiamo verificare il tutto:
<pre>sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn</pre>
<h2>Autenticazione LDAP</h2>
Come sempre installiamo il necessario:
<pre>sudo apt-get install libnss-ldap</pre>
In fase di configurazione dobbiamo rispondere:
<pre>ldap://127.0.0.1:389/
dc=DOMAIN
3
yes
no
cn=admin,dc=DOMAIN
PASSWORD</pre>
Configuriamo anche le autenticazioni NSS e PAM:
<pre>sudo auth-client-config -t nss -p lac_ldap
sudo pam-auth-update</pre>
Con <em>getent</em> possiamo verificare il funzionamento dell'autenticazione. Il sistema infatti adesso ha unito i gruppi e gli utenti su ldap a quelli in <em>/etc/passwd </em>e <em>/etc/group</em>:
<pre>~$ getent passwd

...
john:x:10000:10000:John Doe:/home/john:/bin/bash

~$ getent group

...
example:*:10000:</pre>
Se non vedete l'utente <em>john</em> o il gruppo <em>example</em>, avete sbagliato qualcosa :)
<h2>Samba</h2>
Installiamo i pacchetti:
<pre>sudo apt-get install samba samba-doc smbldap-tools</pre>
Inseriamo lo schema samba:
<pre>sudo cp /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz /etc/ldap/schema/
sudo gzip -d /etc/ldap/schema/samba.schema.gz</pre>
Creiamo il file <em>samba_schema_convert.conf</em>:
<pre>include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema
include /etc/ldap/schema/samba.schema</pre>
E convertiamo gli schema:
<pre>slapcat -f samba_schema_convert.conf -F ./tmp/ldif_output -n0 -s "cn={12}samba,cn=schema,cn=config" &gt; ./tmp/cn=samba.ldif</pre>
Modifichiamo il file <em>./tmp/cn\=samba.ldif</em> sistemando i seguenti attributi:
<pre>dn: cn=samba,cn=schema,cn=config
...
cn: samba</pre>
e rimuovendo le seguenti righe dalla fine del file:
<pre>structuralObjectClass: olcSchemaConfig
entryUUID: b53b75ca-083f-102d-9fff-2f64fd123c95
creatorsName: cn=config
createTimestamp: 20080827045234Z
entryCSN: 20080827045234.341425Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20080827045234Z</pre>
Inseriamo il tutto nel db:
<pre>sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ./tmp/cn\=samba.ldif</pre>
Aggiungiamo gli indici, creiamo <em>samba_indexes.ldif</em>:
<pre>dn: olcDatabase={1}hdb,cn=config
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: loginShell eq
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbIndex: sambaSID eq
olcDbIndex: sambaPrimaryGroupSID eq
olcDbIndex: sambaGroupType eq
olcDbIndex: sambaSIDList eq
olcDbIndex: sambaDomainName eq
olcDbIndex: default sub</pre>
Inseriamoli:
<pre>sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f samba_indexes.ldif</pre>
<h2>smbldap-tools</h2>
Gli <em>smbldap-tools</em> sono degli ottimi script per gestire il tutto, io comunque per la gestione del dominio consiglio l'utilizzo di LAM ma con <em>smbldap-tools</em> si può popolare velocemente LDAP con i dati necessari e Samba li utilizzerà per aggiungere le macchine che si uniscono al dominio.
Iniziamo quindi configurandoli:
<pre>sudo gzip -d /usr/share/doc/smbldap-tools/configure.pl.gz
sudo perl /usr/share/doc/smbldap-tools/configure.pl</pre>
Dopo l'ultimo comando vi verranno fatte varie domande che servono a configurare i file che riporto qui di seguito, quindi dategli uno sguardo per capire cosa dovete rispondere.

<em>/etc/smbldap-tools/smbldap_bind.conf</em>:
<pre>slaveDN="cn=admin,dc=DOMAIN"
slavePw="PASSWORD"
masterDN="cn=admin,dc=DOMAIN"
masterPw="PASSWORD"</pre>
<em>/etc/smbldap-tools/smbldap.conf</em>:
<pre>SID="S-1-5-21-395106984-1667043562-2069293566" (il SID è unico del vostro server, questo è il mio!)
sambaDomain="DOMAIN"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
verify=""
cafile=""
clientcert=""
clientkey=""
suffix="dc=DOMAIN"
usersdn="ou=People,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=DOMAIN,${suffix}"
scope="sub"
hash_encrypt="SSHA"
crypt_salt_format=""
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="120"
userSmbHome=""
userProfile=""
userHomeDrive="H:"
userScript="logon.cmd"
mailDomain="mymaildomain.com"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"</pre>
A questo punto configuriamo anche samba con il suo file <em>/etc/samba/smb.conf</em>. Riporto direttamente l'output del comando <em>testparm</em> che verifica il ruolo del server Samba e poi stampa il dump del file <em>smb.conf</em>:
<pre>Load smb config files from /etc/samba/smb.conf
rlimit_max: rlimit_max (1024) below minimum Windows limit (16384)
Processing section "[netlogon]"
WARNING: The "share modes" option is deprecated
Processing section "[profiles]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions

[global]
        dos charset = 850
        unix charset = ISO8859-1
        workgroup = DOMAIN
        server string = %h server (Samba, Ubuntu)
        map to guest = Bad User
        obey pam restrictions = Yes
        passdb backend = ldapsam:ldap://127.0.0.1
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        log level = 3 passdb:5 auth:10 winbind:2
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        smb ports = 139 445
        name resolve order = wins host dns bcast
        time server = Yes
        deadtime = 10
        socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
        load printers = No
        show add printer wizard = No
        add machine script = sudo /usr/sbin/smbldap-useradd -t 0 -w "%u"
        logon script = logon.cmd
        logon path =
        logon drive = H:
        logon home =
        domain logons = Yes
        os level = 65
        preferred master = Yes
        domain master = Yes
        dns proxy = No
        wins support = Yes
        ldap admin dn = cn=admin,dc=DOMAIN
        ldap group suffix = ou=Groups
        ldap idmap suffix = ou=Idmap
        ldap machine suffix = ou=Computers
        ldap passwd sync = yes
        ldap suffix = dc=DOMAIN
        ldap ssl = no
        ldap user suffix = ou=People
        usershare allow guests = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap backend = ldap:ldap://127.0.0.1
        idmap uid = 10000-20000
        idmap gid = 10000-20000
        template shell = /bin/bash
        winbind enum users = Yes
        winbind enum groups = Yes
        nt acl support = No
        case sensitive = No
        dont descend = /proc,/dev,/etc,/lib,/lost+found,/initrd

[netlogon]
        comment = Network Logon Service
        path = /srv/samba/netlogon
        guest ok = Yes
        share modes = No

[profiles]
        comment = Users profiles
        path = /srv/samba/profiles
        create mask = 0600
        directory mask = 0700
        profile acls = Yes
        browseable = No
        browsable = No</pre>
A questo punto popoliamo LDAP:
<pre>sudo smbldap-populate</pre>
Se tutto è andato bene il vostro albero LDAP dovrebbe esser più o meno così:

<a href="/uploads/2011/02/ldap-populate.png"><img class="alignnone size-full wp-image-1068" title="Albero LDAP popolato" src="/uploads/2011/02/ldap-populate.png" alt="" width="251" height="473" /></a>

Prima di terminare creiamo la cartella <em>netlogon</em>:
<pre>sudo mkdir -p /srv/samba/netlogon
sudo touch /srv/samba/netlogon/logon.cmd</pre>
Il file <em>logon.cmd</em> può contenere le istruzioni che volete che i pc Windows eseguano all'accesso dell'utente, ad esempio per montare delle condivisioni o settare qualche paramentro.

Riavviamo Samba e impostiamo la password di root:
<pre>sudo stop smbd
sudo start smbd
sudo smbpasswd -w PASSWORD</pre>
Verifichiamo il mappaggio dei gruppi Samba nei gruppi LDAP con il comando <em>net</em>:
<pre>~$ sudo net groupmap list

Domain Admins (S-1-5-21-395106984-1667043562-2069293566-512) -&gt; Domain Admins
Domain Users (S-1-5-21-395106984-1667043562-2069293566-513) -&gt; Domain Users
Domain Guests (S-1-5-21-395106984-1667043562-2069293566-514) -&gt; Domain Guests
Domain Computers (S-1-5-21-395106984-1667043562-2069293566-515) -&gt; Domain Computers
Administrators (S-1-5-32-544) -&gt; Administrators
Account Operators (S-1-5-32-548) -&gt; Account Operators
Print Operators (S-1-5-32-550) -&gt; Print Operators
Backup Operators (S-1-5-32-551) -&gt; Backup Operators
Replicators (S-1-5-32-552) -&gt; Replicators</pre>
Attualmente l'utente <em>Domain Admin</em> è <em>root</em>, è comodo avere l'alias in <em>Administrator</em>:
<pre>echo "root = Administrator" &gt; /etc/samba/smbusers</pre>
Abbiamo terminato, possiamo adesso aggiungere il primo pc al dominio!
<h2>Aggiungere un pc Windows al dominio</h2>
In generale si può seguire la <a href="http://support.microsoft.com/?kbid=295017" target="_blank">guida ufficiale Microsoft</a>

Accedere al pc, cliccare col tasto destro del mouse su <em>Risorse del computer</em> e poi su <em>Proprietà</em>. Selezionare la scheda <em>Nome computer</em> e premere su <em>Cambia</em>.
Spuntare <em>Membro di Dominio</em> e inserire il nome del dominio <em>DOMAIN</em>.
Alla richiesta inserire username <em>root</em> (o <em>Administrator</em>) e la relativa password.
<h2>Risoluzione dei problemi</h2>
In caso di errore nell'unione al dominio:
<ul>
	<li>Aprire l'editor delle policy di Sicurezza Locale <em>Start-&gt;Pannello di controllo-&gt;Strumenti di Aministrazione-&gt;Criteri di protezione locali-&gt;Criteri locali-&gt;opzioni di protezione</em></li>
	<li>Disabilitare la voce <em>Domain member: Digitally encrypt or sign secure channel (always)</em> (<em>_Membro di dominio: aggiunta crittografia of irma digitale ai dati del canale protetto (sempre)</em>)</li>
	<li>Disabilitare la voce <em>Domain member: Disable machine account password changes</em> (<em>Controller di dominio: rifiuta cambio password account computer</em>)</li>
	<li>Disabilitare la voce <em>Domain member: Require strong (Windows 2000 or later) session key</em> (<em>Membro di dominio: richiesta chiave di sessione avanzata (Windows 2000 o versioni successive)</em>)</li>
	<li>Scaricare il file <em>WinXP_SignOrSeal.reg</em> (qui di seguito) ed eseguirlo per modificare il registro di sistema:</li>
</ul>
<pre>Windows Registry Editor Version 5.00

;
; This registry key is needed for a Windows XP Client to join
; and logon to a Samba domain. Note: Samba 2.2.3a contained
; this key in a broken format which did nothing to the registry -
; however XP reported "registry key imported". If in doubt
; check the key by hand with regedit.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters]
"requiresignorseal"=dword:00000000</pre>
<h2>Funzioni di base</h2>
Qui di seguito riporto alcuni comandi di base per la gestione del dominio, consiglio comunque l'utilizzo di LAM (ldap-account-manager) che semplifica il tutto.. e parecchio :)
<ul>
	<li>Per aggiungere un nuovo utente a LDAP con attributi Samba, digitare quanto segue, sostituendo "NOME_UTENTE" con un nome utente reale:</li>
</ul>
<pre>sudo smbldap-useradd -a -P NOME_UTENTE</pre>
L'opzione -a aggiunge gli attributi Samba, -P chiama l'utilità smbldap-passwd dopo aver creato l'utente consentendo di inserire la password per l'utente.
<ul>
	<li>Per rimuovere un utente dalla directory:</li>
</ul>
<pre>sudo smbldap-userdel NOME_UTENTE</pre>
L'utilità smbldap-userdel è dotata anche di un'opzione -r per rimuovere la directory home dell'utente.
<ul>
	<li>Per aggiungere un gruppo, usare smbldap-groupadd, sostituendo "NOME_GRUPPO" con il nome di un gruppo esistente:</li>
</ul>
<pre>sudo smbldap-groupadd -a NOME_GRUPPO</pre>
Come per smbldap-useradd, l'opzione -a aggiunge gli attributi Samba.
<ul>
	<li>Per aggiungere un utente a un gruppo, usare smbldap-groupmod:</li>
</ul>
<pre>sudo smbldap-groupmod -m NOME_UTENTE NOME_GRUPPO</pre>
Assicurarsi di sostituire NOME_UTENTE con un utente reale. Inoltre, con l'opzione -m è possibile aggiungere più di un utente alla volta, elencandoli come valori separati da virgola.
<ul>
	<li>smbldap-groupmod può essere usato anche per rimuovere un utente da un gruppo:</li>
</ul>
<pre>sudo smbldap-groupmod -x NOME_UTENTE NOME_GRPPO</pre>
<ul>
	<li>L'utilità smbldap-useradd può anche aggiungere degli account macchina:</li>
</ul>
<pre>sudo smbldap-useradd -t 0 -w NOME_MACCHINA</pre>
Sostituire NOME_MACCHINA con il nome della workstation. L'opzione -t 0 crea un account macchina immediatamente, -w indica di creare l'utente come account macchina. Notare che l'opzione add machine script in <em>/etc/samba/smb.conf</em> è stata modificata per usare <em>smbldap-useradd</em>.
<h2>Webografia</h2>
<ul>
	<li><a href="http://help.ubuntu-it.org/10.04/ubuntu/serverguide/it/samba-ldap.html" target="_blank">http://help.ubuntu-it.org/10.04/ubuntu/serverguide/it/samba-ldap.html</a></li>
	<li><a href="http://help.ubuntu-it.org/10.04/ubuntu/serverguide/it/samba-dc.html" target="_blank">http://help.ubuntu-it.org/10.04/ubuntu/serverguide/it/samba-dc.html</a></li>
	<li><a href="https://help.ubuntu.com/10.04/serverguide/C/samba-dc.html" target="_blank">https://help.ubuntu.com/10.04/serverguide/C/samba-dc.html</a></li>
	<li><a href="https://help.ubuntu.com/10.04/serverguide/C/samba-ldap.html" target="_blank">https://help.ubuntu.com/10.04/serverguide/C/samba-ldap.html</a></li>
	<li><a href="http://it.fon.wikia.com/wiki/Samba_pdc" target="_blank">http://it.fon.wikia.com/wiki/Samba_pdc</a></li>
	<li><a href="http://www.areanetworking.it/installazione-di-samba-come-pdc-con-ldap-backend.html" target="_blank">http://www.areanetworking.it/installazione-di-samba-come-pdc-con-ldap-backend.html</a></li>
	<li><a href="http://www.finex.org/configurare-samba-su-ubuntu-come-pdc.html" target="_blank">http://www.finex.org/configurare-samba-su-ubuntu-come-pdc.html</a></li>
	<li><a href="http://www.pluto.it/files/journal/pj0605/samba3pdc.html" target="_blank">http://www.pluto.it/files/journal/pj0605/samba3pdc.html</a></li>
	<li><a href="http://www.openskill.info/infobox.php?ID=552" target="_blank">http://www.openskill.info/infobox.php?ID=552</a></li>
	<li><a href="http://wiki.novell.com/index.php/OES_as_PDC" target="_blank">http://wiki.novell.com/index.php/OES_as_PDC</a></li>
	<li><a href="http://www.pascal-hacker.de/info/it/sw/ubuntu/pdc.htm" target="_blank">http://www.pascal-hacker.de/info/it/sw/ubuntu/pdc.htm</a></li>
	<li><a href="http://tuxnetworks.blogspot.com/2010/07/howto-samba-ldap-on-1004-lucid-short.html" target="_blank">http://tuxnetworks.blogspot.com/2010/07/howto-samba-ldap-on-1004-lucid-short.html</a></li>
</ul>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/02/14/realizzare-un-dominio-con-samba-3-come-pdc/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/02/14/realizzare-un-dominio-con-samba-3-come-pdc</feedburner:origLink></item>
		
		  <item>
  		<title>Rsnapshot Nagios plugin</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/Wy9uXulyTP4/rsnapshot-nagios-plugin</link>
  		<comments>/2011/01/31/rsnapshot-nagios-plugin/#comments</comments>
  		<pubDate>2011-01-31T18:21:45+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1055</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Ho pubblicato oggi su <a title="GitHub" href="https://github.com/" target="_blank">GitHub</a> la prima versione di un plugin per Nagios 3 (ma dovrebbe funzionare anche con la versione 2) che controlla lo stato dei backup di <a href="http://rsnapshot.org/" target="_blank">rsnapshot</a>. Si tratta di uno script ruby pensato per controllare lo stato dei backup giornalieri, non è quindi utilissimo per chi usa anche i backup orari (ma con poche modifiche si può adattare).

È sufficiente configurare rsnapshot per salvare i log in <em>/var/log/rsnapshot.log</em> e lanciare lo script. Se ci sono backup multipli (ad esempio la domenica quando c'è sia il giornaliero che il settimanale) lo script avvisa con lo stato di <em>WARNING</em> o <em>ERROR</em> se uno dei backup è in quello stato.

Per scaricare lo script potete utilizzare la <a href="https://github.com/tommyblue/Rsnapshot-Nagios-Plugin" target="_blank">pagina su GitHub</a> o su su <a href="http://exchange.nagios.org/directory/Plugins/Backup-and-Recovery/rsnapshot" target="_blank">Nagios Exchange</a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2011/01/31/rsnapshot-nagios-plugin/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2011/01/31/rsnapshot-nagios-plugin</feedburner:origLink></item>
		
		  <item>
  		<title>Versionare directory vuote con GIT</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/usVcOkKl-OE/versionare-directory-vuote-con-git</link>
  		<comments>/2010/11/26/versionare-directory-vuote-con-git/#comments</comments>
  		<pubDate>2010-11-26T20:27:26+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1051</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Tip della sera, che mi è utile quando devo versionare progetti Rails con GIT che, come noto, non tiene traccia delle directory vuote. Per farlo è necessario piazzare un placeholder:
<pre>for i in `find . -type d -empty`; do touch $i/.gitignore; done</pre>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/11/26/versionare-directory-vuote-con-git/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/11/26/versionare-directory-vuote-con-git</feedburner:origLink></item>
		
		  <item>
  		<title>Configurare su Linux la tastiera come su MacOSX</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/k9ViYG-TXhY/configurare-su-linux-la-tastiera-come-su-macosx</link>
  		<comments>/2010/11/24/configurare-su-linux-la-tastiera-come-su-macosx/#comments</comments>
  		<pubDate>2010-11-24T19:12:56+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1044</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Saltando spesso da Mac a Fedora ho sempre odiato veder cambiare il comportamento della tastiera. Riassumo quindi i pochi passaggi necessari a riprodurre su Linux (quasi) lo stesso comportamento della tastiera in Mac.

Innanzitutto il layout. La mia tastiera è "Internazionale Inglese", ovvero, oltre alla disposizione USA, ha il tasto <strong>`~</strong> a sinistra della<strong> z</strong> e il tasto <strong>§±</strong> a sinistra dell'<strong>1</strong>.
Per ottenere questo layout ho impostato (in Gnome da <em>Sistema &gt; Preferenze &gt; Tastiera</em>) la tastiera USA e creato nella mia home il file <strong>.xmodmaprc</strong> con questo contenuto:
<pre>keycode 94 = grave asciitilde grave asciitilde dead_grave dead_horn
keycode 49 = section plusminus section plusminus section plusminus</pre>
Sempre dal menù di configurazione della tastiera , pannello Disposizioni, tasto Opzioni, ho selezionato:
<ul>
	<li>Comportamento tasto Alt/Win =&gt; Control è applicato ai tasti Win</li>
	<li>Opzioni varie di compatibilità =&gt; Apple Keyboard alluminio</li>
	<li>Posizione tasto Compose =&gt; Alt destro</li>
</ul>
Quest'ultima cosa è l'unica che veramente mi scoccia dato che su Mac viene usato l'alt sinistro, ma con Linux non sembra essere possibile.

Per terminare ho implementato un piccolo script che modifica la luminosità della tastiera. È composto da 3 file (devono tutti essere eseguibili):

<strong>modify_backlight</strong>
<pre>#!/bin/bash
echo $1 &gt; /sys/devices/platform/applesmc.768/leds/smc\:\:kbd_backlight/brightness</pre>
<strong>brightness_up</strong>
<div id="_mcePaste">
<pre>#!/bin/bash
declare -i VAL
declare -i NEW_VAL
declare -i NEW_VAL_PERC
VAL=`cat /sys/devices/platform/applesmc.768/leds/smc\:\:kbd_backlight/brightness`
NEW_VAL=$VAL+50
if [ $VAL -ge 250 ]; then
<span style="white-space: pre;">	</span>NEW_VAL=255
fi
NEW_VAL_PERC=NEW_VAL*100/255
notify-send -u low -t 500 -i /usr/share/icons/gnome-colors-common/scalable/notifications/notification-keyboard-brightness-high.svg "Keyboard brightness" "Increasing keyboard backlight brightness to $NEW_VAL_PERC%"
/usr/bin/sudo /home/tommyblue/bin/modify_backlight $NEW_VAL</pre>
</div>
<strong>brightness_down</strong>
<pre>#!/bin/bash
declare -i VAL
declare -i NEW_VAL
declare -i NEW_VAL_PERC
VAL=`cat /sys/devices/platform/applesmc.768/leds/smc\:\:kbd_backlight/brightness`
NEW_VAL=$VAL-50
if [ $VAL -le 8 ]; then
<span style="white-space: pre;">	</span>NEW_VAL=0
fi
NEW_VAL_PERC=NEW_VAL*100/255
notify-send -u low -t 500 -i /usr/share/icons/gnome-colors-common/scalable/notifications/notification-keyboard-brightness-low.svg "Keyboard brightness" "Decreasing keyboard backlight brightness to $NEW_VAL_PERC%"
/usr/bin/sudo /home/tommyblue/bin/modify_backlight $NEW_VAL</pre>
Quindi per modificare la luminosità con i tasti F5 e F6 basta aprire <em>Sistema &gt; Preferenze &gt; Scorciatoie da tastiera</em> e aggiungere due scorciatoie personalizzate che vadano a richiamare i due script <strong>brightness_up</strong> e <strong>brightness_down</strong>. Dato che gli script vanno a modificare dei file di root, bisogna anche inserire in /etc/sudoers la seguente riga:
<pre>tommyblue ALL=NOPASSWD:/home/tommyblue/bin/modify_backlight</pre>
Ovviamente utente e path devono essere opportunamente modificate.
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/11/24/configurare-su-linux-la-tastiera-come-su-macosx/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/11/24/configurare-su-linux-la-tastiera-come-su-macosx</feedburner:origLink></item>
		
		  <item>
  		<title>Linux Day 2010 Arezzo</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/nGmwqV-AewE/linux-day-2010-arezzo</link>
  		<comments>/2010/10/24/linux-day-2010-arezzo/#comments</comments>
  		<pubDate>2010-10-24T00:18:11+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1038</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-medium wp-image-1039" title="Linux Day 2010" src="/uploads/2010/10/log0ld2k10-185x300.gif" alt="" width="185" height="300" />Oggi ho partecipato al <a href="http://www.linuxdayarezzo.it">Linux Day ad Arezzo</a> con il talk <em><strong>"Sviluppo di applicazioni web con Ruby On Rails 3"</strong></em>.

Distribuisco qui le slides proiettate durante il talk: <a href="/uploads/2010/10/LD2010.pdf">download</a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/10/24/linux-day-2010-arezzo/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/10/24/linux-day-2010-arezzo</feedburner:origLink></item>
		
		  <item>
  		<title>Sostituire un disco in un Raid 1 con mdadm</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/ptb3q5zo_jc/sostituire-un-disco-in-un-raid-1-con-mdadm</link>
  		<comments>/2010/09/28/sostituire-un-disco-in-un-raid-1-con-mdadm/#comments</comments>
  		<pubDate>2010-09-28T16:16:31+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1026</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Lo devo fare da anni, finalmente prendo appunti per una cosa che mi capita di fare almeno un paio di volte l'anno e che, puntualmente, mi scordo come si fa :-)

Il punto è questo: sostituire un disco in un array Raid 1 quando si rompe. Riporto gli appunti presi qualche anno fa <a href="http://lilik.it/wiki/doku.php?id=raidsoftware" target="_blank">sulla wiki del LILiK</a>.

La situazione di un raid 1 con un disco rotto è più o meno questa:
<pre>~# cat /proc/mdstat

Personalities : [raid1]
md1 : active raid1 sda2[0] sdb2[1](F)
      1951808 blocks [2/1] [U_]

md2 : active raid1 sda3[0] sdb3[1](F)
      13671232 blocks [2/1] [U_]

md0 : active raid1 sda1[0] sdb1[1](F)
      96256 blocks [2/1] [U_]

unused devices: &lt;none&gt;</pre>
Si deve quindi rimuovere il disco dal raid:
<pre>mdadm /dev/md0 --fail /dev/hdb1 --remove /dev/hdb1
mdadm /dev/md1 --fail /dev/hdb2 --remove /dev/hdb2
mdadm /dev/md2 --fail /dev/hdb3 --remove /dev/hdb3</pre>
La situazione è quindi:
<pre>~# cat /proc/mdstat

Personalities : [raid1] 
md1 : active raid1 sda2[0]
      1951808 blocks [2/1] [U_]  

md2 : active raid1 sda3[0]
      13671232 blocks [2/1] [U_]  

md0 : active raid1 sda1[0]
      96256 blocks [2/1] [U_]  

unused devices: &lt;none&gt;</pre>
Si può quindi spengere la macchina e sostituire il disco.

Al riavvio bisogna creare sul nuovo disco lo stesso schema di partizioni presente su quello esistente. Questa procedura, molto semplice, può diventare rognosa se il nuovo disco è più piccolo (anche di poco) del vecchio. Consiglio quindi, quando si crea un sistema con partizioni in raid 1, di lasciare sempre un po' di spazio libero alla fine del disco per essere maggiormente sicuri di non moccolare poi in futuro :)

Ricreiamo le partizioni:
<pre>sfdisk -d /dev/sda | sfdisk /dev/sdb</pre>

<strong>ATTENZIONE:</strong> Se <strong>sfdisk</strong> si rifiutasse di scrivere le partizioni per problemi con i cilindri, provate ad usare l'opzione <em>--Linux</em> come descritto <a href="/2012/04/26/sostituire-un-disco-in-un-raid-software/">qui</a>. <em>(update 26/04/2012)</em>
<br /><br />
Se tutto è andato bene inseriamo le nuove partizioni nel raid:
<pre>mdadm /dev/md0 --add /dev/sdb1
mdadm /dev/md1 --add /dev/sdb2
mdadm /dev/md2 --add /dev/sdb3</pre>
L'ordine non conta, ma vi consiglio di farlo in ordine crescente di grandezza delle partizioni, cosicchè le partizioni più piccole si riallineino subito.
Adesso basta aspettare:
<pre>~# cat /proc/mdstat

Personalities : [raid1]
md1 : active raid1 sdb2[2] sda2[0]
      1951808 blocks [2/1] [U_]
      [=&gt;...................] recovery = 6.2% (123008/1951808) finish=2.4min speed=12300K/sec

md2 : active raid1 sdb3[2] sda3[0]
      13671232 blocks [2/1] [U_]
      resync=DELAYED

md0 : active raid1 sdb1[1] sda1[0]
     96256 blocks [2/2] [UU]

unused devices: &lt;none&gt;</pre>
Per finire bisogna reinstallare il grub nell'MBR del nuovo disco. Nei nuovi s.o. dovrebbe bastare:
<pre>grub-install /dev/sdb</pre>
altrimenti:
<pre>grub&gt; root (hd1,0)
grub&gt; setup (hd1)</pre>
]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/09/28/sostituire-un-disco-in-un-raid-1-con-mdadm/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/09/28/sostituire-un-disco-in-un-raid-1-con-mdadm</feedburner:origLink></item>
		
		  <item>
  		<title>Le magie di RVM</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/ngw2flt6u4E/le-magie-di-rvm</link>
  		<comments>/2010/09/22/le-magie-di-rvm/#comments</comments>
  		<pubDate>2010-09-22T02:43:34+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=1007</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-1017" title="RVM" src="/uploads/2010/09/rvm-logo.png" alt="" width="230" height="220" />Come <a href="http://www.tommyblue.it/2010/05/07/utilizzare-piu-versioni-di-ruby-con-rvm/">avevo scritto un po' di tempo fa</a>, <strong>RVM</strong>, ovvero <em>Ruby Version Manager</em>, è un'applicazione che permette di avere più versioni di Ruby nello stesso sistema.
Beh, in verità non ho detto tutto, anzi, ho detto molto poco...

Con RVM è infatti possibile gestire <em>automagicamente</em> non solo più versioni di Ruby nel sistema, ma anche versioni e ambienti diversi per ogni applicazione!

<em>NB: gran parte di quello che descriverò lo potete trovare <a href="http://sirupsen.com/get-started-right-with-rvm/">qui</a>, lo riprendo per ampliare un po' il discorso e per avere, come al solito, un memoria ausiliaria a portata di mano.</em>

L'eccezionale strumento che RVM mette a disposizione sono le <strong>gemset</strong>, ovvero degli ambienti personalizzabili che è non solo possibile usare in ogni momento, ma è anche possibile associarle ad uno specifico progetto utilizzando l'apposito file <em>.rvmrc</em>

Entriamo nel pratico. Una gemset, in questo caso <em>MyProject</em>, si crea con:
<pre>rvm gemset create MyProject</pre>
e si utilizza con:
<pre>rvm use 1.9.2@MyProject</pre>
o, in breve:
<pre>rvm 1.9.2@MyProject</pre>
In questo caso ho creato la gemset avendo prima selezionato ruby 1.9.2 (anch'esso installato con RVM). Si noti che la gemset di default si chiama <em>global</em> e sarà quindi possibile riutilizzarla con:
<pre>rvm 1.9.2@global</pre>
In questo nuovo ambiente non vi sono gemme installate e si può quindi installarci soltanto quelle necessarie al progetto in questione. La lista di tali gemme potrà poi essere esportata e reimportata:
<pre>rvm gemset export MyProject.gems
rvm gemset import MyProject.gems</pre>
La procedura è comoda anche per creare un set standard di gemme e importarlo in ogni nuovo progetto creato. Se fosse necessario è possibile eliminare tutte le gemme di un ambiente con:
<pre>rvm gemset empty</pre>
Esiste anche un comando per creare e usare immediatamente una nuova gemset:
<pre>rvm use 1.9.2@MyProject --create</pre>
Può essere anche definita la gemset <em>globale</em> e di <em>default</em>. La prima verrà applicata ad ogni nuova versione di ruby installata, la seconda in ogni nuova gemset. I file in questione sono, rispettivamente, <em>~/.rvm/gemsets/global.gems</em> e <em>~/.rvm/gemsets/default.gems</em>.

Per finire arriva la vera perla: il file <em>rvmrc</em>.
Ve ne sono tre versioni: quello globale, quello dell'utente e quello del progetto.
Mentre le prime due possono essere utili per la gestione delle opzioni di compilazione di ruby e delle gemme (date un occhio <a href="http://rvm.beginrescueend.com/workflow/rvmrc/">qui</a> per maggiori dettagli), il terzo è sicuramente il più interessante e consiste in un file <em>.rvmrc</em> contenente, ad esempio:
<pre>rvm 1.8.6@project</pre>
Ogni volta che si entrerà nella cartella contenente il file (con <em>cd </em>da terminale) verrà impostata la gemset selezionata nel file! Vien da sè che si può inserire in un eventuale <a href="http://en.wikipedia.org/wiki/Source_Code_Management">SCM</a> associato al progetto i file <em>.rvmrc</em> e <em>MyProject.gems</em> per avere la certezza che tutti i collaboratori abbiano lo stesso ambiente di sviluppo.

Esiste anche uno shortcut che crea il file <em>.rvmrc</em> al momento della creazione della gemset:
<pre>rvm --create --rvmrc 1.8.6@project</pre>
Un'ultima "chicca" è l'autocompletamento del comando RVM, che è attivabile inserendo nel file dell'ambiente di bash (ad esempio <em>.bashrc</em> o <em>.bash_profile</em>):
<pre>[[ -r $rvm_path/scripts/completion ]] &amp;&amp; . $rvm_path/scripts/completion</pre>
ovviamente adeguando <em>$rvm_path</em> alle vostre esigienze. Una spiegazione più accurata la trovate qui: <a href="http://rvm.beginrescueend.com/workflow/completion/">http://rvm.beginrescueend.com/workflow/completion/</a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/09/22/le-magie-di-rvm/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/09/22/le-magie-di-rvm</feedburner:origLink></item>
		
		  <item>
  		<title>Configurare i check passivi in Nagios per l'integrazione con Munin</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/3Rg-935dRQM/configurare-i-check-passivi-in-nagios-per-l-integrazione-con-munin</link>
  		<comments>/2010/09/16/configurare-i-check-passivi-in-nagios-per-l-integrazione-con-munin/#comments</comments>
  		<pubDate>2010-09-16T17:51:16+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=990</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Continuo la serie di guide sulla configurazione di Nagios spiegando come attivare i check passivi con <a href="http://www.nagios.org/download/addons" target="_blank">NSCA</a> e come usare Munin per avvertire Nagios di ciò che non va'.

Intanto ricordo i link alla prima e alla seconda parte della guida:
<ul>
	<li><a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/">Parte 1</a></li>
	<li><a href="http://www.tommyblue.it/2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2/">Parte 2</a></li>
</ul>
Tornando a Nagios e Munin: l'uso dei check passivi può tornare utile se si va ad installare Nagios in una rete in cui è già presente Munin che, per chi non lo conoscesse, è un software che crea grafici di andamento di una lunga serie di servizi o aspetti dei server (anch'esso configurabile con agenti su vari server e un'applicazione centralizzata per la raccolta dei dati).
Se Munin non fosse già installato si può valutare una configurazione Nagios-centrica con i check effettuati da NRPE e i grafici fatti con <a href="http://nagiosgraph.sourceforge.net/" target="_blank">NagiosGraph</a>.

Nel mio caso era già presente Munin e ho quindi optato per la configurazione dei check passivi.<!--more-->
<h2>Configurazione del server (Nagios e nsca)</h2>
Si comincia come sempre installando i pacchetti necessari:
<pre>apt-get install libmcrypt-dev xinetd</pre>
Quindi si scarica NSCA dalla <a href="http://www.nagios.org/download/addons" target="_blank">pagina degli addon di Nagios</a>, si scompatta, si compila e si installa:
<pre>tar xzf nsca-2.7.2.tar.gz
cd nsca-2.7.2/
./configure prefix=/usr/local/nagios --with-nsca-user=nagios --with-nsca-grp=nagcmd
make all
cp -a src/nsca /usr/local/nagios/bin/
cp sample-config/nsca.cfg /usr/local/nagios/etc/
chown nagios:nagcmd /usr/local/nagios/etc/nsca.cfg
chmod g+r /usr/local/nagios/etc/nsca.cfg
cp sample-config/nsca.xinetd /etc/xinetd.d/nsca</pre>
Bisogna anche aggiungere al file <em>/etc/services</em> il servizio NSCA con la riga:
<pre>nsca    5667/tcp    # NSCA</pre>
Nel file <em>/etc/xinetd.d/nsca</em> bisogna modificare il parametro <em>only_from</em> per consentire l'accesso al server in cui gira Munin, poi possiamo riavviare xinetd.
<h2>Configurazione del client (send_nsca e Munin)</h2>
Nel client da cui arriveranno i check (ovvero dove gira Munin) bisogna ugualmente scaricare il pacchetto NSCA e compilarlo. Differisce l'installazione del binario che in questo caso è <strong>send_nsca</strong> e può essere posizionato dove si vuole (stessa cosa vale per il suo file di configurazione). Dato che nel mio caso Munin e Nagios sono sullo stesso server ho usato la directory di Nagios per ospitare questi file:
<pre>cp -a src/send_nsca /usr/local/nagios/bin/
cp sample-config/send_nsca.cfg /usr/local/nagios/etc/</pre>
Se i due software sono su server diversi potete impostare un metodo di cifratura nel file <em>send_nsca.cfg</em> e impostare una password (che deve essere la stessa sul server e sul client).

<strong>Proviamo adesso se <em>send_nsca</em> funziona.</strong> I check passivi consistono in una riga contenente:
<pre>HOSTNAME[tab]SERVIZIO[tab]CODICE[tab]DESCRIZIONE</pre>
quindi per fare un test possiamo creare un file con il contenuto:
<pre>hostAcaso   pippo   0   OK</pre>
e fare un test di connessione con:
<pre>/usr/local/nagios/bin/send_nsca localhost -c /usr/local/nagios/etc/send_nsca.cfg &lt; test
1 data packet(s) sent to host successfully.</pre>
Nei log di Nagios troveremo:
<pre>nagios: Warning:  Passive check result was received for service 'pippo' on host 'hostAcaso', but the host could not be found!</pre>
Funziona! Non fatevi spaventare dal <em>warning</em>: Nagios ha ricevuto il check ma non ha nessun host corrispondente nella sua configurazione. Niente di male, glielo spiegheremo più tardi.

Possiamo quindi configurare Nagios per accettare i check passivi. Per farlo andiamo nel server e inseriamo nel file <em>etc/objects/templates.cfg</em> il template per un servizio che accetta sono check passivi:
<pre>define service{
 name                            passive-service
 use                             generic-service
 active_checks_enabled           0
 passive_checks_enabled          1
 flap_detection_enabled          0
 register                        0
 is_volatile                     0
 check_period                    24x7
 max_check_attempts              1
 normal_check_interval           5
 retry_check_interval            1
 check_freshness                 0
 contact_groups                  admins
 notification_options            w,u,c,r
 stalking_options                w,c,u
 notification_interval           120
 check_command                   check_dummy!0
}</pre>
Inseriamo poi nel file <em>etc/objects/commands.cfg</em> la definizione del comando <em>check_dummy</em>:
<pre>define command{
 command_name    check_dummy
 command_line    $USER1$/check_dummy $ARG1$
}</pre>
Fatto questo possiamo inserire un check di prova in un host:
<pre>define service{
 use                             passive-service
 host_name                       hostCheEsiste
 service_description             TestMessage
}</pre>
Una volta riavviato Nagios vedremo questo servizio in stato pending. Modificando il file di prima con:
<pre>hostCheEsiste    TestMessage    0     Messaggio di OK</pre>
ed eseguendo nuovamente:
<pre>/usr/local/nagios/bin/send_nsca localhost -c /usr/local/nagios/etc/send_nsca.cfg &lt; test</pre>
possiamo mettere il servizio in stato di OK.

Per finire dobbiamo dire a Munin di chiamare Nagios quando qualcosa non va. Per farlo dobbiamo modificare il file <em>munin.conf</em> inserendo:
<pre>contacts nagios
contact.nagios.command /usr/local/nagios/bin/send_nsca -H localhost -c /usr/local/nagios/etc/send_nsca.cfg</pre>
Modificate le path secondo la vostra configurazione e inserite nel file <em>send_nsca.cfg</em> l'eventuale password per comunicare con NSCA.
<h2>Ma come funzionano in dettaglio gli avvertimenti di Munin?</h2>
Munin si basa su plugin e ognuno di essi ha dei limiti. Per vederli basta lanciare (in questo caso interrogo il plugin <strong>cpu</strong>):
<pre>munin-run cpu config</pre>
Nella risposta si possono individuare i limiti:
<pre>system.warning 60
system.critical 100</pre>
Tali limiti possono essere monitorati da munin-limits, un eseguibile che, per essere lanciato automaticamente, va inserito in crontab. Di base ne trovate una configurazione in <em>/etc/cron.d/munin</em> (se non c'è createlo). Io l'ho modificato così:
<pre>*/5 * * * *     munin if [ -x /usr/share/munin/munin-limits ]; then /usr/share/munin/munin-limits --force --contact nagios --contact old-nagios; fi</pre>
Quindi ogni 5 minuti fa il check e contatta Nagios per passargli il risultato.

L'ultima cosa da fare è adattare i limiti di ogni plugin secondo le proprie esigienze. Si possono definire in <em>munin.conf</em> per ogni host:
<pre>df._mapper_sda1_vm_root.warning      0:90
df._mapper_sda1_vm_root.critical     0:95
df.notify_alias     Disk usage</pre>
La logica con cui vengono definiti i limiti è un po' cervellotica e dipende molto dal tipo di plugin. In questo caso ho usato <strong>df</strong> che controlla l'uso del disco.
Il limite di warning 0:90 viene superato se il limite è al di fuori di questo range (il range è 0:100). Ma a sua volta il limite critico è al di fuori del range 0:95. Il risultato è che il plugin entra in <strong>warning</strong> se la partizione è occupata tra il 90% e il 94% e in <strong>critical</strong> da 95% in sù.
Vi lascio divertire con gli altri plugin :)
<h2>Inseriamo in Nagios questi check</h2>
Ho già mostrato prima come inserire un check passivo in un host, ovvero:
<pre>define service{
 use                             passive-service
 host_name                       hostCheEsiste
 service_description             TestMessage
}
</pre>
Per accettare un check passivo valido da Munin bisogna modificare <strong>service_description</strong> affinchè sia uguale al nome del servizio che definisce il plugin di Munin. Dato che hanno nomi non facilmente individuabili e che a volte contengono caratteri incompatibili con Nagios (ad esempio %) una cosa furba è rinominarli in <em>munin.conf</em> con <strong>.notify_alias</strong> (guardate qualche riga più in sù nel caso del <strong>df</strong>) e usare quell'alias in Nagios.

A questo punto la teoria è finita e non rimane altro da fare che iniziare a scrivere le definizioni dei check in Nagios e le configurazioni dei plugin in Munin, buon lavoro!]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/09/16/configurare-i-check-passivi-in-nagios-per-l-integrazione-con-munin/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/09/16/configurare-i-check-passivi-in-nagios-per-l-integrazione-con-munin</feedburner:origLink></item>
		
		  <item>
  		<title>Accedere a Redmine con le credenziali di Zimbra</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/Ei7GEPRjOo4/accedere-a-redmine-con-le-credenziali-di-zimbra</link>
  		<comments>/2010/09/01/accedere-a-redmine-con-le-credenziali-di-zimbra/#comments</comments>
  		<pubDate>2010-09-01T11:10:44+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=977</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Ultimamente ho abbandonato Trac per passare al più evoluto <a href="http://www.redmine.org/" target="_blank">Redmine</a>, un software per la gestione dei progetti scritto con Ruby On Rails. Tra le possibilità offerte c'è anche quella di integrare l'accesso all'applicazione con un albero LDAP esistente. Nel mio caso mi è stato utile integrarlo con l'LDAP di Zimbra.

I passaggi sono piuttosto facili:
intanto bisogna collegarsi all'amministrazione di Zimbra e creare un utente nel dominio principale (nel mio caso <em>redmine</em>). Personalmente ho disattivato tutte le opzioni (posta, rubrica, documenti, ecc.) per questo utente, tanto serve solamente per il binding a LDAP.
Una volta creato possiamo provare che questo utente possa fare ricerche nell'albero:
<pre>ldapsearch -b ou=people,dc=tommyblue,dc=it -h zimbra.tommyblue.it -p 389 -D uid=redmine,ou=people,dc=tommyblue,dc=it -w s3cr3t uid</pre>
Se la ricerca funziona avete finito con Zimbra e potete passare a Redmine. Qui bisogna andare in Autenticazione LDAP e inserire i dati in questo modo:
<ul>
	<li><strong>Nome:</strong> Zimbra (è solo descrittivo)</li>
	<li><strong>Host</strong>: zimbra.tommyblue.it (l'host con Zimbra)</li>
	<li><strong>Porta</strong>: 389</li>
	<li><strong>Utente</strong>: uid=redmine,ou=people,dc=tommyblue,dc=it</li>
	<li><strong>Password</strong>: s3cr3t</li>
	<li><strong>DN Base</strong>: ou=people,dc=tommyblue,dc=it</li>
	<li><strong>Creazione utente "al volo"</strong>: no</li>
	<li><strong>Utente</strong>: uid</li>
	<li><strong>Nome</strong>: givenName</li>
	<li><strong>Cognome</strong>: sn</li>
	<li><strong>Email</strong>: mail</li>
</ul>
Ecco uno screenshot per rendere il tutto più chiaro:

<a href="/uploads/2010/09/Redmine-Zimbra-237x300.png" rel="prettyPhoto"><img class="aligncenter size-medium wp-image-979" title="Redmine-Zimbra" src="/uploads/2010/09/Redmine-Zimbra-237x300.png" alt="" width="237" height="300" /></a>

Per finire dovete creare un utente in Redmine selezionando come Modalità di Autenticazione quella appena creata e non quella interna.

Ovviamente è possibile replicare il procedimento per qualunque albero LDAP abbiate a disposizione.]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/09/01/accedere-a-redmine-con-le-credenziali-di-zimbra/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/09/01/accedere-a-redmine-con-le-credenziali-di-zimbra</feedburner:origLink></item>
		
		  <item>
  		<title>Fotografia Macro "Low-cost"</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/65aJroOq0VI/fotografia-macro-low-cost</link>
  		<comments>/2010/06/14/fotografia-macro-low-cost/#comments</comments>
  		<pubDate>2010-06-14T00:43:17+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Tempo Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=947</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Da circa 6 mesi ho realizzato il desiderio di acquistare una reflex digitale, una <a href="http://www.europe-nikon.com/it_IT/products/product_details.page?ParamValue=Digital%20Cameras&amp;Subnav1Param=SLR&amp;Subnav2Param=Consumer&amp;Subnav3Param=0&amp;RunQuery=l3&amp;ID=1821" target="_blank">Nikon D3000</a> e, da buon neofita della fotografia, sto provando un po' di tutto.
Ultimamente ho esplorato il mondo delle fotografie macro entrandoci non dalla porta principale ma da quella di servizio. Ovvero ho evitato di spendere una cifra esorbitante per un obiettivo macro (tipo <a href="http://www.europe-nikon.com/it_IT/products/product_details.page?ParamValue=NIKKOR%20Lenses&amp;Subnav1Param=Auto%20Focus%20Lenses&amp;Subnav2Param=0&amp;Subnav3Param=0&amp;RunQuery=l2&amp;ID=870" target="_blank">questo</a>) e mi sono "accontentato" di provare con gli obiettivi invertiti (dopo aver letto <a href="http://robertodacci.wordpress.com/2007/09/21/test-del-zoom-nikkor-af-s-vr-dx-55-200mm-f4-56g-if-ed/" target="_blank">questo</a> articolo).

Questa tecnica implica il montaggio di un obiettivo al contrario e si può fare in due modi: montando un obiettivo al contrario direttamente sul corpo macchina oppure montando normalmente un obiettivo e poi mondandoci sopra un altro obiettivo al contrario.
Per realizzare queste tecniche si possono usare anelli appositi o accrocchi più o meno artigianali; io ho acquistato un anello ad inversione per l'obiettivo singolo (10€) e ho attaccato 2 anelli <a href="http://www.tuttofoto.com/Catalogo.abl?cmd=md&amp;act=itemDetailCart&amp;id_articolo=1481312" target="_blank">Cokin serie P</a> per ottenere una doppia filettatura maschio e aggangiare due obiettivi tra loro.

In entrambi i casi bisogna (ad esempio con un pezzetto di carta) tenere aperto il diaframma dell'obiettivo rovesciato altrimenti non entra luce a sufficienza per scatti "rapidi" (necessari se si fotografa qualcosa che non sta assolutamente fermo). Il contro è che l'area di messa a fuoco è veramente stretta, specialmente con i due obiettivi accoppiati (credetemi, è <strong>VERAMENTE</strong> stretta!). Ho letto che vi sono alcune tecniche per limitare questo effetto, dovrò fare qualche prova...

Utilizzando un solo obiettivo si ottengono risultati piuttosto buoni e si può fotografare anche a mano, con i due obiettivi accoppiati bisogna quasi obbligatoriamente utilizzare il cavalletto, ma l'ingrandimento è veramente incredibile! Per la messa a fuoco, dopo un primo abbozzo, muovo la testa leggermente avanti e indietro e mi aiuto con gli scatti multipli.

Per concludere ecco una serie di foto fatte ad una colonia di formiche, la prima è fatta con un 200mm per rendere meglio l'idea di quanto sia potente questa tecnica (basta fare un contronto con l'ultima foto). Per altre foto potete dare uno sguardo al <a href="http://www.flickr.com/photos/tommasovisconti/sets/72157624218519888/">set su Flickr</a>.

<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/Anello-inversione.jpg' rel="prettyPhoto[]" title='Anello di inversione'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/Anello-inversione-150x150.jpg" class="aligncenter" alt="Anello di inversione" title="Anello di inversione" /></a>
<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/Cokin-serie-P.jpg' rel="prettyPhoto[]" title='Cokin serie P'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/Cokin-serie-P-150x150.jpg" class="aligncenter" alt="Cokin serie P" title="Cokin serie P" /></a>
<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/100_0015.jpg' rel="prettyPhoto[]" title='I due obiettivi montati sulla macchina'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/100_0015-150x150.jpg" class="aligncenter" alt="I due obiettivi montati sulla macchina" title="I due obiettivi montati sulla macchina" /></a>
<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/55-200.jpg' rel="prettyPhoto[]" title='55-200mm f/4-5.6 AF-S VR DX NIKKOR'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/55-200-150x150.jpg" class="aligncenter" alt="55-200mm f/4-5.6 AF-S VR DX NIKKOR" title="55-200mm f/4-5.6 AF-S VR DX NIKKOR" /></a>
<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/DSC_0085.jpg' rel="prettyPhoto[]" title='AF-S DX NIKKOR 35mm f/1.8G rovesciato'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/DSC_0085-150x150.jpg" class="aligncenter" alt="AF-S DX NIKKOR 35mm f/1.8G rovesciato" title="AF-S DX NIKKOR 35mm f/1.8G rovesciato" /></a>
<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/DSC_0113.jpg' rel="prettyPhoto[]" title='18-55mm f/3.5-5.6G AF-S VR DX NIKKOR rovesciato'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/DSC_0113-150x150.jpg" class="aligncenter" alt="18-55mm f/3.5-5.6G AF-S VR DX NIKKOR rovesciato" title="18-55mm f/3.5-5.6G AF-S VR DX NIKKOR rovesciato" /></a>
<a href='http://www.tommyblue.it/wp-content/uploads/2010/06/DSC_0071.jpg' rel="prettyPhoto[]" title='55-200mm f/4-5.6 AF-S VR DX NIKKOR + AF-S DX NIKKOR 35mm f/1.8G rovesciato'><img width="150" height="150" src="http://www.tommyblue.it/wp-content/uploads/2010/06/DSC_0071-150x150.jpg" class="aligncenter" alt="55-200mm f/4-5.6 AF-S VR DX NIKKOR + AF-S DX NIKKOR 35mm f/1.8G rovesciato" title="55-200mm f/4-5.6 AF-S VR DX NIKKOR + AF-S DX NIKKOR 35mm f/1.8G rovesciato" /></a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/06/14/fotografia-macro-low-cost/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/06/14/fotografia-macro-low-cost</feedburner:origLink></item>
		
		  <item>
  		<title>Endian Firewall su ALIX</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/4ShGXfZYdh4/endian-firewall-su-alix</link>
  		<comments>/2010/05/25/endian-firewall-su-alix/#comments</comments>
  		<pubDate>2010-05-25T23:37:25+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=936</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<a href="/uploads/2010/05/EFW.jpg"><img class="alignleft size-thumbnail wp-image-939" title="Endian Firewall" src="/uploads/2010/05/EFW-150x150.jpg" alt="" width="150" height="150" /></a>Lo spippolo di <a href="http://www.tommyblue.it/2010/05/24/stasera-si-spippola/">ieri</a> ha dato i suoi frutti e sono riuscito a installare correttamente E<a href="http://www.endian.com/en/community/" target="_blank">ndian Firewall</a> sul mio embedded <a href="http://pcengines.ch/alix6e1.htm" target="_blank">ALIX 6e1</a> (qui di fianco, se ci cliccate, ne vedrete uno screenshot).

Di base non ci sarebbe niente di strano dato che le ALIX sono <em>x86-compatible</em>, però non fanno boot da usb (e se anche lo facessero, non sono riuscito a rendere bootabile Endian su una penna usb...).

C'è quindi da fare un arzigogolo un po' particolare: è necessario un pc a cui staccare gli hard disk e a cui attaccare la Compact Flash con il suo lettorino USB. A questo punto se si avvia da cdrom la iso di Endian, il s.o. trova solo la compact flash e la prende per il suo hard disk (<em>sda</em>), installandocisi.
Al termine basta, prima del primo riavvio, staccare la compact flash e attaccarla alla mobo ALIX. Sarà possibile proseguire la configurazione via web all'indirizzo ip indicato in fase di installazione.
<strong>NB: Se volete accedere al s.o. via seriale, ditelo all'installer durante uno dei passaggi dell'installazione.</strong>

Piuttosto facile, vero?
E infatti lo spippolo di ieri è durato troppo poco e al termine mi sono preso il tempo di provare qualche player di video HTML 5 utilizzando, per l'occasione, un video di pochi secondi realizzato al nuovo firewall mentre faceva il suo duro lavoro.

Se il vostro browser lo supporta, buona visione!

[video src="/uploads/2010/05/Alix.m4v"] ]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/05/25/endian-firewall-su-alix/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/05/25/endian-firewall-su-alix</feedburner:origLink></item>
		
		  <item>
  		<title>Stasera: si spippola!</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/tG45t1_FANw/stasera-si-spippola</link>
  		<comments>/2010/05/24/stasera-si-spippola/#comments</comments>
  		<pubDate>2010-05-24T22:05:51+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Tempo Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=931</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Con traslochi e contro-traslochi più o meno finiti posso finalmente dedicare una serata allo <strong>spippolo in libertà</strong>. Obiettivo della serata: installare <a href="http://www.endian.com/en/community/" target="_blank">Endian Firewall Community Ed.</a> su una macchina ALIX (quella usata per <a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/">l'installazione di Nagios</a>).
<p style="text-align: center;"><img class="aligncenter size-full wp-image-932" title="Spippolo libero!" src="/uploads/2010/05/spippolo.jpg" alt="" width="400" height="268" /></p>
Nella foto qui sopra potete notare il <em>caos ordinato</em> sulla mia scrivania all'inizio della serata, chissà alla fine... :-)]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/05/24/stasera-si-spippola/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/05/24/stasera-si-spippola</feedburner:origLink></item>
		
		  <item>
  		<title>Liberiamoci di IE (almeno la v.6)</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/_ajy0AnGyEE/liberiamoci-di-ie-almeno-la-v-6</link>
  		<comments>/2010/05/11/liberiamoci-di-ie-almeno-la-v-6/#comments</comments>
  		<pubDate>2010-05-11T16:00:40+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Sito]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=925</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<a href="http://www.freethefoxes.com"><img class="alignleft size-full wp-image-926" title="Free the Foxes" src="/uploads/2010/05/Free-the-foxies.png" alt="" width="325" height="117" /></a>Ho sempre avuto un po' il dente avvelenato con Internet Explorer che troppe volte mi ha fatto inutilmente perdere ore e ore a causa del suo non saper fare il browser.

Eppure ho sempre evitato di bloccare l'accesso al sito a chi (stolto!) utilizza ancora <em>l'oggetto del male</em> (ben il 21,3% dei visitatori...).

Oggi però ho scoperto <a href="http://www.freethefoxes.com" target="_blank">Free the Foxes</a>, un JS molto carino e personalizzabile che invita i possessori di browser <em>non compatibili</em> a scaricarne uno migliore.
Da questo momento, quindi, chi visita questo sito utilizzando IE 6 e 7 (rispettivamente il 5,8% e il 3,4%) riceverà un avvertimento.

E il vostro browser? Controllate cliccando <a href="Javascript:ftf.check()">qui!</a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/05/11/liberiamoci-di-ie-almeno-la-v-6/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/05/11/liberiamoci-di-ie-almeno-la-v-6</feedburner:origLink></item>
		
		  <item>
  		<title>Utilizzare più versioni di Ruby con RVM</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/lq0K2-DC_so/utilizzare-piu-versioni-di-ruby-con-rvm</link>
  		<comments>/2010/05/07/utilizzare-piu-versioni-di-ruby-con-rvm/#comments</comments>
  		<pubDate>2010-05-07T15:04:43+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=922</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Con Ruby Version Manager è possibile avere più versioni (o addirittura <em>patchlevel</em>) di Ruby installate ed effettuare velocemente lo switch tra una e l'altra.

Supponendo che abbiate già installato Rubygems, installare RVM è praticamente immediato:
<pre>~# gem install rvm
~# rvm-install</pre>
A questo punto si può installare una qualsiasi versione di Ruby con:
<pre>~# rvm install 1.9.2-head</pre>
e switchare tra le versioni con:
<pre>~# rvm use 1.9.2-head
~# ruby -v
ruby 1.9.2dev (2010-05-07 trunk 27656) [x86_64-darwin10.3.0]
~# rvm use default
~# ruby -v
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]</pre>
Attenzione che ogni nuova installazione ha le sue gemme, quindi sarà necessario installare quelle richieste, nel mio caso, volendo utilizzare Ruby 1.9.2 per provare Rails 3:
<pre>~# rvm use 1.9.2-head
~# gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n
~# gem install rails --pre</pre>
<strong>Leggi anche:</strong> <a href="http://www.tommyblue.it/2010/09/22/le-magie-di-rvm/"><em>Le magie di RVM</em></a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/05/07/utilizzare-piu-versioni-di-ruby-con-rvm/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/05/07/utilizzare-piu-versioni-di-ruby-con-rvm</feedburner:origLink></item>
		
		  <item>
  		<title>25 Aprile</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/NTEgZHO2qnQ/25-aprile</link>
  		<comments>/2010/04/25/25-aprile/#comments</comments>
  		<pubDate>2010-04-25T11:06:40+02:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Riflessioni]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=919</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<p style="text-align: center;"><em>Dimenticare significa perdere l’eredità di una lotta che è ancora
inconclusa. Non dimenticare obbliga a comprendere, a smascherare, a
continuare quella lotta. Per combattere questo nuovo fascismo non ci
saranno i vostri nonni, o i padri dei vostri nonni. Affrontarlo
toccherà a voi </em></p>
<p style="text-align: center;">Partigiano Ennio Sardelli “Fuoco”</p>

<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/UGiFA_EsQu4&hl=it_IT&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/UGiFA_EsQu4&hl=it_IT&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/04/25/25-aprile/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/04/25/25-aprile</feedburner:origLink></item>
		
		  <item>
  		<title>Il senso della settimana</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/mJa8d5AKHvs/il-senso-della-settimana</link>
  		<comments>/2010/03/19/il-senso-della-settimana/#comments</comments>
  		<pubDate>2010-03-19T11:06:44+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Riflessioni]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=910</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-911" title="Siesta!" src="/uploads/2010/03/siesta.jpg" alt="" width="350" height="317" />Ormai da un po' di tempo ho quasi completamente perso il <em>senso della settimana</em>.

Intendo che i miei tempi non funzionano in base alla sequenza <em>lun-ven=lavoro</em> e <em>sab-dom=riposo</em>, ma più in base ad una sequenza semicasuale.

Spesso infatti lavoro (o studio) il sabato e la domenica e ho dei giorni liberi durante la settimana. Ieri, ad esempio, ho passato un ottimo pomeriggio passeggiando per Monte Morello (era giovedì) e probabilmente passerò la domenica davanti alla <em>shell.</em>

Non fosse che è un casino far coincidere i propri impegni con quelli del resto del mondo, questa <em>traslazione</em> risulta molto interessante per i giorni liberi: quasi sempre il luogo in cui si va a bivaccare è praticamente vuoto e soprattutto si può scegliere il giorno di <em>ferie</em> in maniera più libera (evitando, ad esempio, la famosissima coppia <em>unica domenica libera del mese &lt;=&gt; peggiore tempesta tropicale del secolo</em>).]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/03/19/il-senso-della-settimana/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/03/19/il-senso-della-settimana</feedburner:origLink></item>
		
		  <item>
  		<title>Abilitare l'accesso SSH su ESXi 4</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/mmSNy1842PE/abilitare-laccesso-ssh-su-esxi-4</link>
  		<comments>/2010/02/19/abilitare-laccesso-ssh-su-esxi-4/#comments</comments>
  		<pubDate>2010-02-19T12:32:28+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=893</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Di default <a title="VMWare ESXi" href="http://www.vmware.com/products/esxi/" target="_blank">VMWare ESXi</a> non permette l'accesso SSH ma solo con la console vSphere. È però molto comodo accedervi in SSH, ad esempio per fare una copia delle macchine virtuali o automatizzare altre operazioni.

Su ESXi versione 4, per abilitare il server SSH basta effettuare questi passaggi:
<ol>
	<li>Premere Alt+F1</li>
	<li>Digitare <em>unsupported</em> (non vedrete nulla a schermo)</li>
	<li>Verrà chiesta la password di root</li>
	<li>Una volta entrati editare il file <em>/etc/inetd.conf</em> (usando <em>vi</em> o un altro editor)</li>
	<li>Decommentare le riche riguardanti SSH (ovvero togliere il cancelletto <em>#</em>). Ci sono due righe riguardanti SSH, una per TCPv4 e una per TCPv6</li>
	<li>Lanciare <em>services.sh restart</em></li>
</ol>
Se dopo questi passaggi ancora non è possibile accedere bisogne identificare il PID di inetd (con <em>ps aux | grep inetd</em>) e poi riavviarlo con <em>kill -HUP &lt;pid&gt;</em>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/02/19/abilitare-laccesso-ssh-su-esxi-4/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/02/19/abilitare-laccesso-ssh-su-esxi-4</feedburner:origLink></item>
		
		  <item>
  		<title>Costruirsi un sistema di monitoraggio "casalingo" con Nagios – parte 2</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/HpCX94WR610/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2</link>
  		<comments>/2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2/#comments</comments>
  		<pubDate>2010-02-17T15:01:37+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=853</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/"><strong>Leggi la prima parte della guida</strong></a>

In questa seconda parte della guida illustrerò alcune <strong>configurazioni di base</strong> per i check di <a title="Nagios" href="http://www.nagios.org/" target="_blank">Nagios</a> e l'uso dell'addon <strong>NRPE</strong> per check locali su sistemi remoti.
<h3>La struttura</h3>
In questa guida prenderò in considerazione la struttura qui si seguito che permette di illustrare vari tipi di configurazione:
<p style="text-align: center;"><img class="aligncenter size-full wp-image-860" title="Schema Nagios" src="/uploads/2010/02/schema-nagios.jpg" alt="" width="450" height="454" /></p>
Una panoramica sugli host e i servizi:
<ul>
	<li>Host A, server Linux con:
<ul>
	<li>Server HTTP Apache</li>
	<li>VMWare Server con una macchina virtuale E con un server Zimbra</li>
</ul>
</li>
	<li>Host B, server Linux con:
<ul>
	<li>Server HTTP Apache</li>
	<li>Server MySQL</li>
</ul>
</li>
</ul>
Quindi E dipende da C che a sua volta dipende da A. Invece D dipende da B.
Entrambi i server Apache rispondono sulle porte 80 e 443, l'interfaccia di amministrazione di VMWare Server risponde sulla porta 8333 (con SSL).
La macchina virtuale Zimbra fornisce i servizi SMTP, POP3 e le interfaccie di webmail e amministrazione (porta 7071).
Infine nella macchina B il server MySQL risponde solo sull'interfaccia locale, non è quindi possibile accedervi dall'esterno.

<!--more-->Negli esempi successivi gli elementi <strong>A</strong>, <strong>C</strong> ed <strong>E</strong> saranno del cliente <em>Company A</em> (dominio <em>company-a.com</em>) e <strong>B</strong> e <strong>D</strong> saranno del cliente <em>Company B</em> con dominio <em>company-b.com</em>.
I nomi host saranno i seguenti:
<ul>
	<li><em>A =&gt; web.company-a.com
</em></li>
	<li><em>C (macchina virtuale) =&gt; mail.company-a.com
</em></li>
	<li><em>B =&gt; web.company-b.com</em></li>
</ul>
Per un maggior dettaglio nella spiegazione delle singole configurazioni tenete sempre sott'occhio la guida ufficiale alla pagina <a href="http://nagios.sourceforge.net/docs/3_0/objectdefinitions.html" target="_blank"><strong>Object Definitions</strong></a>.
<h3>Organizzazione dei file</h3>
Una volta installato Nagios seguendo la <a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/">prima parte della guida</a>, troverete tutte le configurazioni in <em>/usr/local/nagios/etc</em>. Il file che <em>comanda</em> è <em>nagios.cfg</em> il quale poi richiama tutti gli altri. È quindi possibile, e consigliabile, creare una gerarchia di file che possa poi più facilmente permettere di gestire tutte le configurazioni (senza <em>perdersi</em> per strada i vari pezzi).
Nel file <em>nagios.cfg</em> ci sono due direttive inerenti questo aspetto e sono <em>cfg_file</em> e <em>cfg_dir</em>. La prima indica direttamente un file da cui leggere ulteriori configurazioni, la seconda indica intere directory da cui saranno inclusi tutti i file che terminano con <em>.cfg</em>. Io consiglio di intervenire usando questa seconda direttiva, le cartelle che ho creato sono:
<pre>cfg_dir=/usr/local/nagios/etc/personalized_objects
cfg_dir=/usr/local/nagios/etc/servers
cfg_dir=/usr/local/nagios/etc/groups</pre>
Oltre alle due cartelle con le configurazioni dei server e dei gruppi, ho aggiunto una cartella in cui inserirò i <em>template</em> personalizzati, ad esempio con <em>timeperiods</em> o <em>contact groups</em> diversi da quelli standard.
<h3>Gruppi di host e servizi</h3>
È possibile definire dei gruppi di host (ad esempio a seconda dell'azienda di appartenenza o del tipo di hardware) e dei gruppi di servizi (server di posta, server web, ecc.). Personalmente inserisco queste configurazioni nella cartella <em>groups</em>.

Esempi di configurazione sono i seguenti:
<pre>define hostgroup{
    hostgroup_name     companyA-servers
    alias              Company A Servers
    members            mail.company-a.com,web.company-a.com
}
define hostgroup{
    hostgroup_name     companyB-servers
    alias              Company B Servers
    members            web.company-b.com
}
define servicegroup{
    servicegroup_name  web-servers
    alias              Web Servers
    members            web.company-a.com,HTTP,web.company-b.com,HTTP
}</pre>
In entrambi i casi gli host indicati in <em>members</em> devono ricalcare il nome con cui quegli host sono definiti (attributo <em>host_name</em>). Nel caso dei servizi, oltre al nome dell'host, deve essere indicato il nome del servizio (anche in questo caso deve essere uguale a quello inserito in <em>service_description</em>).
<h3>Definizione degli host</h3>
Iniziamo con la configurazione dei server. I file <em>web.company-a.com.cfg</em>, <em>web.company-b.com.cfg</em> e <em>mail.company-a.com.cfg</em> verranno creati nella cartella <em>servers</em>. Non c'è molto da spiegare, inserisco dei commenti direttamente nelle configurazioni:

<em><strong>web.company-a.com.cfg</strong></em>
<pre>define host {
    use             linux-server   ;   Template da cui ereditare
    host_name       web.company-a.com   ;   L'host name è ciò che viene usato per identificare l'host negli altri file
    alias           CompanyA Web Server
    address         1.2.3.4
    hostgroups      comapanyA-servers   ;   Come in hostgroup, tale configurazione può essere alternativa o in aggiunta
}</pre>
<em><strong>web.company-b.com.cfg</strong></em>
<pre>define host {
    use             linux-server
    host_name       web.company-b.com
    alias           CompanyB Web Server
    address         1.2.3.5
    hostgroups      comapanyB-servers
}</pre>
<em><strong>mail.company-a.com.cfg</strong></em>
<pre>define host {
    use             linux-server
    host_name       mail.company-a.com
    alias           CompanyA Web Server
    address         1.2.3.6
    hostgroups      comapanyA-servers
    parents         web.company-a.com   ;   L'host da cui questo host dipende
}</pre>
<h3>Definizione dei servizi</h3>
La definizione dei servizi è direttamente collegata ai plugin, ovvero usano questi ultimi per effettuare i check. In verità il valore dell'attributo <em>check_command</em>, anche se in genere ricalca il nome del plugin (i plugin sono nella cartella <em>libexec</em>), non lo indica direttamente ma ha una corrispondenza nel valore dell'attributo <em>command_name</em> nella definizione di un comando (file <em>etc/objects/commands.cfg</em>).

<em><strong>mail.company-a.com.cfg</strong></em>
<pre>define service {
 use                     generic-service
 host_name               mail.company-a.com
 service_description     SMTP
 check_command           check_smtp!-t 5
}
define service {
 use                     generic-service
 host_name               mail.company-a.com
 service_description     IMAP
 check_command           check_imap!-t 5
}
define service {
 use                     generic-service
 host_name               mail.company-a.com
 service_description     POP3
 check_command           check_pop!-t 5
}</pre>
Nella direttiva <em>check_command</em> viene indicato il tipo di comando da eseguire. Dopo il punto esclamativo vengono indicati gli argomenti. Se date uno sguardo a <em>etc/objects/commands.cfg</em> vedrete che gli argomenti vengono passati al plugin con <em>$ARG1$, $ARG2$, ecc</em>. In alcuni è presente soltanto un argomento, quindi nella definizione del servizio, dopo il punto esclamativo, devono essere indicati tutti gli argomenti (tipo <em>./check_dummy -t pippo -x pluto</em>) mentre in altri comandi sono presenti più argomenti, spesso associati ad una specifica opzione (tipo <em>./check_dummy -t </em><em>$ARG1$</em><em> -x </em><em>$ARG2$</em>). Nella definizione del servizio, più argomenti possono essere indicati con più punti esclamativi (tipo <em>check_dummy!pippo!pluto</em>). Per avere più informazioni su un plugin lanciatelo con <em>libexec/check_dummy --help</em>.

Un esempio di check un po' più complesso può essere, ad esempio, quello necessario per controllare se l'interfaccia di amministrazione di Zimbra sta girando correttamente (HTTPS sulla porta 7071):

<em><strong>mail.company-a.com.cfg</strong></em>
<pre>define service{
 use                             generic-service
 host_name                       mail.comapany-a.com
 service_description             ZimbraAdmin
 check_command                   check_http!"-H mail.company-a.com -p 7071 -w 5 -c 15 --ssl"
}</pre>
Com'è facile intuire, con <em>check_http</em> è possibile quindi monitorare ogni singolo sito presente su un server web.

Ecco gli altri file necessari per la nostra configurazione:

<em><strong>web.company-a.com.cfg</strong></em>
<pre>define service{
 use                             generic-service
 host_name                       web.company-a.com
 service_description             HTTP
 check_command                   check_http   ;   Semplice check sulla porta 80
}</pre>
<pre>define service{
 use                             generic-service
 host_name                       web.company-a.com
 service_description             VMWareAdmin
 check_command                   check_http!"-H web.company-a.com -p 8333 -w 5 -c 15 --ssl"
}</pre>
<em><strong>web.company-b.com.cfg</strong></em>
<pre>define service{
 use                             generic-service
 host_name                       web.company-b.com
 service_description             HTTP
 check_command                   check_http
}</pre>
<h3>NRPE</h3>
L'ultima cosa che rimane da controllare è lo stato del server MySQL. Dato che il servizio risponde soltanto sull'interfaccia locale non è possibile controllarne direttamente lo stato dal server Nagios. L'addon<em> NRPE </em>fa proprio questo: installato sulla macchina da controllare, esegue dei check locali quando interrogato da Nagios.Il plugin da usare sul server è <em>check_nrpe</em> e l'argomento da passargli è il nome del check definito nel client, il quale a sua volta dovrà associare questo nome ad un check locale (quindi sul client dobbiamo installare i plugin).

Su entrambe le macchine va compilato  l'addon:
<pre>tar xzf nrpe-2.12.tar.gz
cd nrpe-2.12/
./configure --enable-ssl
make all</pre>
A questo punto l'installazione tra host e client differisce. Per l'installazione nel client dei plugin seguite la <a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/" target="_blank">prima parte della guida</a>.

<strong>Host</strong>
<pre>make install-plugin</pre>
e quindi bisogna creare il template del comando:

<em><strong>commands.cfg</strong></em>
<pre>define command {
 command_name    check_nrpe
 command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}</pre>
<strong>Client</strong>

Se non è installato, installate <em>xinetd</em>:
<pre>apt-get install xinetd</pre>
Installate quindi il demone
<pre>make install-daemon
make install-daemon-config
make install-xinetd</pre>
Aggiungete NRPE al file <em>/etc/services</em>:
<pre>nrpe 5666/tcp # NRPE</pre>
Aggiungete l'ip del server Nagios al file <em>/etc/xinetd.d/nrpe</em> (in questo caso un fittizio <em>4.3.2.1</em>):
<pre>only_from = 127.0.0.1 4.3.2.1</pre>
Infine riavviate il server xinetd e controllate che NRPE sia in ascolto:
<pre>~# /etc/init.d/xinetd restart
~# netstat -at | grep nrpe
tcp        0      0 *:nrpe                  *:*                     LISTEN</pre>
A questo punto si può testare il servizio in locale con:
<pre>~# /usr/local/nagios/libexec/check_nrpe -H localhost
NRPE v2.12</pre>
<strong>Controllare MySQL</strong>

Arriviamo al nostro obiettivo: controllare che il server MySQL stia correttamente girando. Creiamo un utente MySQL non privilegiato:
<pre>mysql&gt; CREATE USER 'nagiosCheck'@'localhost' IDENTIFIED BY 'some_pass';</pre>
Il check, lanciato da linea di comando, sarà il seguente:
<pre>~# /usr/local/nagios/libexec/check_mysql -u nagiosCheck -p some_pass
Uptime: 1061012  Threads: 2  Questions: 192277  Slow queries: 0  Opens: 198  Flush tables: 1  Open tables: 64  Queries per second avg: 0.181</pre>
Inseriamo quindi tale check in <em>/usr/local/nagios/etc/nrpe.cfg</em>:
<pre>command[check_mysql]=/usr/local/nagios/libexec/check_mysql -u nagiosCheck -p some_pass</pre>
Da notare che nel server Nagios il nome dell'argomento da passare a <em>check_nrpe </em>sarà <em>check_mysql</em> come definito tra le parentesi quadre.
A questo punto dal server Nagios si può testare il check remoto:
<pre>~# /usr/local/nagios/libexec/check_nrpe -H tomcat.mydomain.com -c check_mysql
Uptime: 1061534  Threads: 2  Questions: 192280  Slow queries: 0  Opens: 198  Flush tables: 1  Open tables: 64  Queries per second avg: 0.181</pre>
Se è tutto ok non resta che inserirlo tra i servizi dell'host <strong>B</strong>:

<em><strong>web.company-b.com.cfg</strong></em>
<pre>define service{
 use                             generic-service
 host_name                       web.company-b.com
 service_description             MySQL
 check_command                   check_nrpe!check_mysql
}</pre>
E questo conclude la configurazione della nostra rete di test. Nella prossima <em>puntata</em> spiegherò come configurare dei server <em>slave</em> per effettuare check passivi, necessari, ad esempio, in configurazioni di rete complesse in cui il server <em>master</em> non può direttamente raggiungere gli host da controllare (se l'host da controllare è all'interno di una LAN, per dirne una).

<a href="http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/"><strong>Leggi la prima parte della guida</strong></a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2</feedburner:origLink></item>
		
		  <item>
  		<title>Costruirsi un sistema di monitoraggio "casalingo" con Nagios - parte 1</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/oLqp29Q_KGk/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1</link>
  		<comments>/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/#comments</comments>
  		<pubDate>2010-02-12T20:49:08+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=812</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-813" title="Embedded PC" src="/uploads/2010/02/embedded.jpg" alt="" width="300" height="254" />Se, come me, avete vari server a giro per il mondo a cui fare da baby-sitter, probabilmente avrete sentito la necessità di avere tutto sotto controllo e di scoprire (e magari risolvere) i problemi non appena si presentano.

Dopo aver configurato sistemi di monitoraggio per alcune P.A. e aziende, mi sono deciso a farlo anche per i miei server e descriverò in queste pagine ciò che ho fatto o sto ancora facendo.

Dividerò questa guida in più parti, per renderla più leggibile e per poter facilmente aggiungere nuove parti via via che incremento le funzionalità del sistema.

Questa prima parte descrive l'<strong>hardware</strong> scelto, l'<strong>installazione del sistema operativo</strong> e l'<strong>installazione base di <a title="Nagios" href="http://www.nagios.org/" target="_blank">Nagios</a></strong>.
<!--more-->
<h3>Hardware</h3>
La scelta dell'hardware è caduta su un <em>embedded</em> acquistato (per circa 80€) su <a title="PC Engines" href="http://www.pcengines.ch" target="_blank">pcengines.ch</a> ampiamente in grado di fornire la <strong>potenza</strong> necessaria allo scopo e con <strong>consumi</strong> estremamente limitati.

Nello specifico ecco le caratteristiche principali:
<div id="_mcePaste">
<ul>
	<li><strong>CPU</strong>: 500 MHz AMD Geode LX800</li>
	<li><strong>DRAM</strong>: 256 MB DDR DRAM</li>
	<li><strong>Storage</strong>: CompactFlash socket</li>
	<li><strong>Power</strong>: DC jack or passive POE, min. 7V to max. 20V</li>
	<li><strong>Expansion</strong>: 2 miniPCI slots, dual USB port</li>
	<li><strong>Connectivity</strong>: 2 Ethernet channels (Via VT6105M 10/100)</li>
</ul>
</div>
Oltre alla scheda ho acquistato anche il case (damn! non avevano quello rosa shocking!) e l'alimentatore.

Costo complessivo <strong>101,31€</strong> così distribuiti:
<ul>
	<li><strong>Scheda</strong>: 72,23 €</li>
	<li><strong>Case</strong>: 6,63 €</li>
	<li><strong>Alimentatore</strong>: 4,05 €</li>
	<li><strong>Spedizione</strong>: 18,40 €</li>
</ul>
A questo è necessario aggiungere una memoria <strong>CompactFlash</strong> (io ne ho usata una da 2GB), un <strong>lettore/scrittore di tali memorie</strong> e un <strong>adattatore seriale&lt;=&gt;USB</strong> (o soltanto un cavo seriale se avete una porta adatta). Attenzione al cavo seriale che deve essere RS-232 altrimenti la connessione non funziona.
<h3>Sistema operativo</h3>
Il sistema operativo scelto è <a title="Debian Voyage" href="http://linux.voyage.hk/" target="_blank">Debian Voyage</a>, una versione di Debian ottimizzata per le piattaforme <strong>embedded x86</strong>. La sua installazione sulla CompactFlash è estremamente semplice e veloce (per i dettagli vi rimando alla <a title="Wiki di Debian Voyage" href="http://wiki.voyage.hk/dokuwiki/doku.php?id=installation" target="_blank">pagina wiki dedicata</a>).
Una volta installato si può montare la memoria nella mainboard e agganciare il pc via seriale. Per visualizzare la console remota si può usare il software <strong>screen</strong>:
<pre>screen /dev/ttyUSB0 38400</pre>
Si può quindi alimentare la scheda e osservare il boot. Per accedere la prima volta a voyager usare l'utente <em>root </em>con password <em>voyage</em>.
Consiglio di configurare subito la rete con un ip statico (usate <em>/etc/network/interfaces</em>) e installare <em>openssh-server</em> che permetterà di lavorare in remoto con la console preferita.

Per prepararsi all'installazione di Nagios dobbiamo fare un po' di cose:
<pre>apt-get install locales dialog build-essential apache2 libapache2-mod-php5 mailx postfix
addgroup --system nagios
adduser --system --no-create-home --home /usr/local/nagios --ingroup nagios --disabled-password nagios
addgroup --system nagcmd
usermod -a -G nagcmd nagios
usermod -a -G nagcmd www-data</pre>
Configuriamo <a title="Postfix" href="http://www.postfix.org" target="_blank">Postfix</a> con i parametri corretti per la nostra connessione e inseriamo in <em>/etc/aliases</em> l'alias per l'utente root:
<pre>postmaster: root
nagios: root
root: io@mio-dominio.com</pre>
e aggiorniamo:
<pre>newaliases
</pre>
Anzichè <a title="Apache" href="http://www.apache.org" target="_blank">Apache</a> (un po' oneroso in termini di memoria consumata) volevo usare <a title="Nginx" href="http://nginx.org/" target="_blank">Nginx</a> ma per configurarlo per fornire pagine <a title="PHP" href="http://www.php.net" target="_blank">PHP</a> è necessario lavorarci un po', quindi lascio questa configurazione per il futuro (considererò anche l'eventuale uso di <a title="Lighttpd" href="http://www.lighttpd.net/" target="_blank">Lighttpd</a>).
<h3>Nagios</h3>
Si può quindi iniziare a installare il software di monitoraggio, ovviamente <a title="Nagios" href="http://www.nagios.org/" target="_blank">Nagios</a>. Per alcuni check potrebbero essere necessari alcuni pacchetti, eccone alcuni tra i più comuni:
<pre>apt-get install libgd2-xpm libgd2-xpm-dev libpng3 libpng3-dev libjpeg62 libjpeg-dev zlib1g zlib1g-dev libnet-snmp-perl snmp libssl-dev libpq-dev libmysqlclient15-dev smbclient qstat fping libradiusclient-ng-dev libldap2-dev</pre>
Scarichiamo <a title="Download Nagios Core" href="http://www.nagios.org/download/core/" target="_blank">Nagios Core</a> in <em>/usr/src</em> e compiliamolo:
<pre>tar xzf nagios-3.2.0.tar.gz
cd nagios-3.2.0/
./configure --prefix=/usr/local/nagios --with-command-group=nagcmd --with-httpd-conf=/etc/apache2/conf.d/
make all
make install
make install-init
make install-commandmode
make install-config
make install-webconf</pre>
Per ulteriori informazioni seguite la <a title="Guida a Nagios" href="http://nagios.sourceforge.net/docs/3_0/quickstart.html" target="_blank">guida ufficiale</a>.
Compiliamo e installiamo anche i plugin, scaricati da <a title="Download Nagios Plugins" href="http://www.nagios.org/download/plugins/" target="_blank">qui</a>:
<pre>tar xzf nagios-plugin-1.4.14.tar.gz
cd nagios-plugin-1.4.14
./configure  --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-group=nagios
make
make install</pre>
Creiamo adesso la password per l'accesso a Nagios:
<pre>htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin</pre>
Se cambiate il nome utente sostituite tutte le occorrenze di <em>nagiosadmin</em> col nuovo utente nel file <em>/usr/local/nagios/etc/cgi.cfg</em>.
Aggiungiamo Nagios all'avvio del sistema:
<pre>update-rc.d nagios defaults</pre>
e iniziamo la configurazione. Una volta terminato, prima di lanciare o riavviare Nagios, possiamo verificare la correttezza della configurazione con:
<pre>/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
</pre>
La prima parte della guida termina qui, nella prossima vedremo come configurare i check di base e i controlli remoti con <a title="Nagios NRPE" href="http://www.nagios.org/download/addons/" target="_blank">Nagios NRPE</a>.

<a href="http://www.tommyblue.it/2010/02/17/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-2/"><strong>Leggi la seconda parte della guida</strong></a>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/02/12/costruirsi-un-sistema-di-monitoraggio-casalingo-con-nagios-parte-1</feedburner:origLink></item>
		
		  <item>
  		<title>Convertire un'immagine di Virtualbox in una per VMWare con QEMU su Mac</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/BJcK1ciEpJw/convertire-unimmagine-di-virtualbox-in-una-per-vmware-con-qemu-su-mac</link>
  		<comments>/2010/02/05/convertire-unimmagine-di-virtualbox-in-una-per-vmware-con-qemu-su-mac/#comments</comments>
  		<pubDate>2010-02-05T12:39:13+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=804</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<a href="/uploads/2010/02/qemu.gif"><img class="alignleft size-full wp-image-805" title="QEMU" src="/uploads/2010/02/qemu.gif" alt="" width="84" height="81" /></a>Può capitare di avere un'immagine di un s.o. virtuale in formato <em>vdi</em> (<a href="http://www.virtualbox.org/">VirtualBox</a>) e di doverla trasformare in un'immagine che possa funzionare con <a href="http://www.vmware.com/">VMWare</a> (<em>vmdk</em>), il tutto su <em>Mac OS X</em>.

La soluzione esiste ed è interessante che comporti l'uso di un terzo software di emulazione: <a href="http://www.kju-app.org/">QEMU</a> :-)

L'utility che ci serve è <strong>qemu-img</strong> che nell'installazione Mac si trova in <em>/Applications/Q.app/Contents/MacOS/qemu-img</em>

La conversione è molto semplice e non richiede troppo tempo:
<pre>cd /Applications/Q.app/Contents/MacOS/
./qemu-img convert /path2virtualbox/img2convert.vdi  /path2vmware/converted_img.vmdk</pre>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/02/05/convertire-unimmagine-di-virtualbox-in-una-per-vmware-con-qemu-su-mac/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/02/05/convertire-unimmagine-di-virtualbox-in-una-per-vmware-con-qemu-su-mac</feedburner:origLink></item>
		
		  <item>
  		<title>Il gioco dell'8</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/DFOPaXtuTq8/il-gioco-dell8</link>
  		<comments>/2010/01/23/il-gioco-dell8/#comments</comments>
  		<pubDate>2010-01-23T16:18:00+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Software Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=795</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Con <a href="http://blogs.gnome.org/cosimoc/" target="_blank">Cosimo</a> abbiamo terminato e consegnato le tesine riguardanti il gioco dell'8 e l'apprendimento con reti neurali per il corso di Intelligenza Artificiale del prof. Soda, le allego quindi per futura memoria:
<ul>
	<li><a href="/uploads/2010/01/Tesina_otto_v1.1.pdf">Tesina sul gioco dell'8</a></li>
	<li><a href="/uploads/2010/01/Tesina_diabetes_v1.0.pdf">Tesina apprendimento - dataset diabetes</a></li>
</ul>]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/01/23/il-gioco-dell8/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/01/23/il-gioco-dell8</feedburner:origLink></item>
		
		  <item>
  		<title>Eliminare le righe di commento con Vim</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/K6dQOfd2vqc/eliminare-le-righe-di-commento-con-vim</link>
  		<comments>/2010/01/21/eliminare-le-righe-di-commento-con-vim/#comments</comments>
  		<pubDate>2010-01-21T11:23:29+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[How-To]]></category>
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Memoria usiliaria]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=789</guid>
  		
  		<description />
  			<content:encoded><![CDATA[Muovendo i miei primi passi nelle <em>regular expressions</em> ho cercato la regexp per eliminare le righe di commento da un file, ovviamente con <em>Vim</em>. Il risultato è questo:
<pre>:g/^\s*#.*/d</pre>
mi resta da capire perché questa seconda regexp non funziona:
<pre>:g/^[# ]+.*/d</pre>
<img class="size-full wp-image-790 aligncenter" title="Regexp" src="/uploads/2010/01/regexp.jpg" alt="" width="180" height="240" />]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/01/21/eliminare-le-righe-di-commento-con-vim/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/01/21/eliminare-le-righe-di-commento-con-vim</feedburner:origLink></item>
		
		  <item>
  		<title>Browsers Trip</title>

  		<link>http://feedproxy.google.com/~r/tommyblue/~3/JJ-XKVq7K0U/browsers-trip</link>
  		<comments>/2010/01/20/browsers-trip/#comments</comments>
  		<pubDate>2010-01-20T01:43:36+01:00</pubDate>
  		<dc:creator>Tommaso Visconti</dc:creator>
		
  		
  		<category><![CDATA[Informatica]]></category>
  		
  		<category><![CDATA[Riflessioni]]></category>
  		
  		<category><![CDATA[Tempo Libero]]></category>
  		


  		
  		<guid isPermaLink="false">http://www.tommyblue.it/?p=784</guid>
  		
  		<description />
  			<content:encoded><![CDATA[<img class="alignleft size-full wp-image-785" title="Mozilla Firefox, Google Chrome, Apple Safari" src="/uploads/2010/01/browsers.jpg" alt="" width="222" height="102" />Dedico una riflessione al mio eterno viaggio nella scelta del <strong>browser</strong> definitivo, sempre che sceglierne solo uno sia un vantaggio.
Non sarà una classifica perché non sarei in grado di farla, ma più un elenco di pregi e difetti dei tre browser in esame: <strong><a href="http://www.mozilla-europe.org/it/firefox/" target="_blank">Mozilla Firefox</a></strong>, <strong><a href="http://www.apple.com/it/safari/" target="_blank">Apple Safari</a></strong> e <strong><a href="http://www.google.com/chrome/?hl=it" target="_blank">Google Chrome</a></strong>.

Ma veniamo ai fatti!<!--more-->
<h3>Apple Safari</h3>
Non c'ho mai avuto troppa confidenza. Per tutti un browser veloce, a me è sempre sembrato lento. Forse è solo una questione di feeling, ma per quanto, periodicamente, ci riprovi, non riesco a usarlo più di tanto (la stessa cosa mi succede con <em>Mail</em>). In particolare non riesco a trovarmi bene con le password salvate (troppo "incastrate" con quelle di sistema) e gli shortcut, che sono troppo cervellotici (direi una caratteristica di casa Cupertino). Anche la barra degli strumenti non mi convince: personalizzabile ma solo fino a un certo punto.
<strong>A quando le estensioni?
</strong>Sebbene il giudizio sembri totalmente negativo, <strong>Safari in un certo qualmodo mi intriga</strong> e so che il mio giudizio non è definitivo.
<h3>Google Chrome</h3>
<strong>Veloce e pratico.</strong> A Google sanno (s)fruttare l'esperienza fatta dagli altri (che tutto sommato è un pregio): vi trovo quasi tutte le cose che mi piacciono di Firefox. Non mi sono trovato troppo bene con i preferiti e la gestione dei download, perdipiù, ancora in beta, spesso crasha (riesce comunque sempre a recuperare i tab aperti). L'attuale (e temporanea) mancanza di estensioni mi limita troppo, motivo per cui è stato, per ora, messo nel cassetto.
<h3>Mozilla Firefox</h3>
Il vero motivo per cui nasce quest'articolo, punto di inizio e fine: usato per anni, l'ho "abbandonato" qualche settimana per testare gli altri browsers.
La scelta di cambiare è stata causata dalla sua <strong>lentezza nel caricarsi</strong>, sicuramente derivante da anni di lavoro in cui gliene ho fatte di tutti i colori, tra estensioni, <em>about:config</em> e altro.
Ma prima o poi, si sa, si torna a casa e così è stato anche stavolta: in queste settimane ho continuato comunque a usare Firefox per fini lavorativi, in particolare a "causa" delle estensioni <a href="http://getfirebug.com/" target="_blank">Firebug</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/60" target="_blank">WebDeveloper</a> e <a href="http://www.colorzilla.com/" target="_blank">ColorZilla</a>, ma dopo la fallita ricerca di alternative a estensioni come Delicious, la libera aggiunta di motori di ricerca e il tanto agognato <em>feeling</em>, sono tornato ad usarlo in pianta stabile, comunque con un occhio sempre puntato sui "rivali".
Per chi non lo avesse ancora fatto, consiglio anche l'uso del suo figlioletto <a href="http://flock.com/" target="_blank">Flock</a>.
<h3>Quindi?</h3>
Niente. Queste sono le mie impressioni, nel giudizio pesa sicuramente la scelta del sistema operativo<a href="http://www.apple.com/macosx/" target="_blank"> Mac OSX "Snow Leopard"</a>. Su Linux, oltre a non avere Safari, Chrome avrebbe dato sicuramente un'impressione migliore.
Invito chiunque voglia ad aggiungere i propri pareri su questi e altri browser]]></content:encoded>
  			<wfw:commentRss>http://www.tommyblue.it//2010/01/20/browsers-trip/feed/</wfw:commentRss>

  		<slash:comments>0</slash:comments>
  		<feedburner:origLink>http://www.tommyblue.it/2010/01/20/browsers-trip</feedburner:origLink></item>
		
	</channel>
</rss>
