tag:blogger.com,1999:blog-83476083619509132202024-02-08T19:25:21.475+01:00IP over Avian CarriersCome non fare a meno della tecnologia anche durante una catastrofe.Anonymoushttp://www.blogger.com/profile/18294921292385208983noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-8347608361950913220.post-77594508226058633512012-11-15T13:17:00.002+01:002013-07-02T10:44:50.240+02:00Python 3.3 and pyvenv, a (hackish) solution<b>EDIT: it seems to be a bug in debian experimental</b>, if you install python3.3 from the upstream tarball, you will not find this issue, the resolution of this bug is tracked in both <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=695758">Debian BTS</a> and <a href="http://bugs.python.org/issue16480">python BTS</a> .<br />
<br />
<b>EDIT2</b>: I could confirm that in debian unstable as of July 2013 is<b> fixed. </b>In this case you will be done with:<br />
<br />
<br />
<pre><span style="background-color: #d9d2e9;">$ pyvenv-3.3 ~/.pyvenv-3.3
$ . ~/.pyvenv-3.3/bin/activate
(.pyvenv-3.3)$ curl -O http://python-distribute.org/distribute_setup.py
(.pyvenv-3.3)$ python distribute_setup.py
(.pyvenv-3.3)$ easy_install pip</span></pre>
<pre><span style="background-color: #d9d2e9;">
</span></pre>
<pre><span style="background-color: #d9d2e9;">
</span></pre>
<br />
<br />
In the <a href="http://ipoveraviancarriers.blogspot.it/2012/11/python-33-and-virtualenv.html">previous blog post</a> I got stuck in properly creating a virtualenv in python 3.3, now I came with this hacky script, which naively wraps pyvenv-3.3 and create a couple of missing links which makes everything works fine. In fact I saw that virtualenvs created with virtualenv .27 tools makes links from directories in <virtualenv>/local/{bin,lib,include} to <virtualenv>, those links are missing in venv created by pyvenv-3.3.<br />
<br />
<h4>
So here it is the hackish wrapper script:</h4>
<pre><span style="background-color: #ead1dc;">
#!/bin/sh
VENV_PATH="$1"
PROGRAM="$(basename $0)"
if [ -z "${VENV_PATH}" ]; then
echo "Usage:" 1>&2
echo "${PROGRAM} VENV_PATH" 1>&2
exit 1
fi
shift 1
echo pyvenv-3.3 "${VENV_PATH}" "${@}"
pyvenv-3.3 "${VENV_PATH}" "${@}"
mkdir -p "${VENV_PATH}/local"
for dir in lib bin include ; do
ln -vs ../${dir} "${VENV_PATH}/local/${dir}"
done
</span>
</pre>
Save this script somewhere in your PATH (e.g. /usr/local/bin/mk_pyvenv or maybe ~/bin/mk_pyvenv) and then issue:
<br />
<br />
<pre><span style="background-color: #d9d2e9;">$ mk_pyvenv ~/.pyvenv-3.3
$ . ~/.pyvenv-3.3/bin/activate
(.pyvenv-3.3)$ curl -O http://python-distribute.org/distribute_setup.py
(.pyvenv-3.3)$ python distribute_setup.py
(.pyvenv-3.3)$ easy_install pip</span>
</pre>
<h4>
And now you finally have a working virtualenv with python-3.3 VENV!</h4>
Anonymoushttp://www.blogger.com/profile/18294921292385208983noreply@blogger.com0tag:blogger.com,1999:blog-8347608361950913220.post-30247427358752395212012-11-14T00:42:00.000+01:002012-12-19T17:11:25.023+01:00python 3.3 and virtualenv<h2>
</h2>
<h3>
Tech
</h3>
As in <a href="http://www.python.org/dev/peps/pep-0405/#creating-virtual-environments">pep-0405</a> Python 3 new virtualenv specs are now <a href="http://docs.python.org/3/library/venv.html#module-venv">implemented in Python 3.3</a>.<br />
<br />
<h3>
Install python3.3 and venv it </h3>
<h3>
</h3>
Python 3.3 has those bleeding edge venvs, lets try them and bleed!<br />
<br />
<span style="background-color: #ead1dc;"><br /></span>
<br />
<pre><span style="background-color: #ead1dc;">#!/bin/sh
# please add the source if needed
# it could need a package from experimental
set -e # exit in case of errors
if grep -vqs "experimental main" ; then
echo "deb http://ftp.de.debian.org/debian/ experimental main" | \
sudo tee -a /etc/apt/sources.list > /dev/null
fi
sudo apt-get install python3.3
pyvenv-3.3 .pyvenv-3.3
. .pyvenv-3.3/bin/activate </span></pre>
<pre> </pre>
<pre> </pre>
<h3>
Install pyglet </h3>
<pre><span style="background-color: #ead1dc;"># pip install pyglet # if lucky and in the future
# maybe check for something >= 1.2 on <a href="http://www.pyglet.org/download.html#unstable">http://www.pyglet.org/download.html#unstable</a>
wget <a href="http://pyglet.googlecode.com/files/pyglet-1.2alpha1.tar.gz">http://pyglet.googlecode.com/files/pyglet-1.2alpha1.tar.gz</a>
cd pyglet-1.2alpha11
python setup.py install</span></pre>
<pre> </pre>
<h3>
Install pip </h3>
<pre><span style="background-color: #ead1dc;">curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py
</span></pre>
I dreamed now for<br />
<span style="background-color: #ead1dc;"></span>
<br />
<pre><span style="background-color: #ead1dc;">easy_install pip</span></pre>
<pre> </pre>
but I had to do that uglyness below, I'm missing a prefix probably (I hope!)<br />
<span style="background-color: #ead1dc;"><br /></span>
<br />
<pre><span style="background-color: #ead1dc;">mv .pyvenv-3.3/local/lib/python3.3/dist-packages/ .pyvenv-3.3/lib/
easy_install-3.3 pip</span>
</pre>
<h3>
Is there something wrong here?
</h3>
Anonymoushttp://www.blogger.com/profile/18294921292385208983noreply@blogger.com0tag:blogger.com,1999:blog-8347608361950913220.post-46582542962769385272012-10-15T11:12:00.000+02:002012-10-15T11:19:46.664+02:00Python: "source" a shell script and read variablesIt comes handy to "source" a shell script and read variables from there in python, maybe to share configuration between different scripts.<br />
<br />
Here is my* take:<br />
<pre><code>
<span style="background-color: #cccccc;">from subprocess import Popen, PIPE
from os import environ
def source(script, update=True, clean=True):
"""
Source variables from a shell script
import them in the environment (if update==True)
and report only the script variables (if clean==True)
"""
global environ
if clean:
environ_back = dict(environ)
environ.clear()
pipe = Popen(". %s; env" % script, stdout=PIPE, shell=True)
data = pipe.communicate()[0]
env = dict((line.split("=", 1) for line in data.splitlines()))
if clean:
# remove unwanted minimal vars
env.pop('LINES', None)
env.pop('COLUMNS', None)
environ = dict(environ_back)
if update:
environ.update(env)
return env</span>
</code></pre>
<br />
Also available as a github <a href="https://gist.github.com/3891614">gist</a>. <br />
<br />
<span style="font-size: x-small;">* Heavily inspired from this <a href="http://pythonwise.blogspot.it/2010/04/sourcing-shell-script.html">pythonwise blog post</a></span><br />
<br />
<br />
<br />
<a href="http://pythonwise.blogspot.it/2010/04/sourcing-shell-script.html"></a>Anonymoushttp://www.blogger.com/profile/18294921292385208983noreply@blogger.com0tag:blogger.com,1999:blog-8347608361950913220.post-45077717095280665992011-01-03T10:24:00.000+01:002011-01-03T10:24:58.937+01:00VDE Virtual NetworkingUna delle cose veramente utili e divertenti della virtualizzazione è la possibilità di fare facilmente dei test dove altrimenti sarebbe scomodo, lento o troppo costoso farli su delle macchine vere.<br />
<br />
Già da tempo esistono software come <a href="http://wiki.qemu.org/">QEmu</a> o <a href="http://www.virtualbox.org/">VirtualBox</a> che virtualizzano un intero computer, compreso bus PCI con schede audio, video e di rete; da meno tempo invece si trovano virtualizzazioni meno "spinte" come il progetto <a href="http://virtualsquare.org/">Virtual Square</a>, che si propone come aggregatore di progetti di virtualizzazioni parziali, di singoli componenti o funzionalità.<br />
<br />
Una virtualizzazione meno spinta ha la possibilità di essere più veloce o meglio integrata con software e sistemi non virtualizzati, con meno layer; permette anche di usarne un singolo componente in altri contesti.<br />
<br />
Questa brevissimo accenno a Virtual Square serve solo per poter introdurre un loro progetto: <a href="http://vde.sourceforge.net/">VDE</a>, reti virtuali. Invece che macchine intere, "semplici" componenti per interconnettere macchine reali e virtuali con nodi e cavi virtuali.<br />
<br />
Gli switch di VDE sono switch a tutti gli effetti, con console di management via socket, e supportano tagged VLAN e cavi virtuali per interconnetterli tra loro, verso switch virtuali su macchine remote (tramite tunnel cifrati) e verso interfacce TUN sulla macchina reale.<br />
<br />
Vediamo per esempio come simulare un server DHCP che serva due sottoreti differenti con alcune macchine virtuali, degli switch virtuali e un router virtuale (dhcp relay).<br />
<br />
Creo una nuova interfaccia tap con permessi per il mio utente:<br />
<br />
<pre style="background-color: #cccccc; font-family: "Courier New",Courier,monospace;">$ sudo tunctl -u marco
Set 'tap0' persistent and owned by uid 1000 </pre><br />
Lancio tre switch virtuali, di cui il primo lo aggancio alla tap0 appena creata:<br />
<br />
<div style="background-color: #cccccc;">$ vde_switch --unix /var/tmp/vde1.s --mgmt /var/tmp/vde1.m --tap tap0 --daemon </div><div style="background-color: #cccccc;">$ vde_switch --unix /var/tmp/vde2.s --mgmt /var/tmp/vde2.m --daemon </div><div style="background-color: #cccccc;">$ vde_switch --unix /var/tmp/vde3.s --mgmt /var/tmp/vde3.m --daemon </div><br />
Lancio una macchina virtuale KVM (qemu con supporto hardware per la virtualizzazione) con due schede di rete collegate agli switch (fondamentale specificare i mac address) <br />
<br />
<div style="background-color: #cccccc;">$ kvm -hda hda-qemu.qcow -m 512 -net nic,macaddr=00:11:22:33:44:55,vlan=0 -net nic,macaddr=00:11:22:33:44:56,vlan=1 -net vde,sock=/var/tmp/vde1.s,vlan=0 -net vde,sock=/var/tmp/vde2.s,vlan=1 </div><br />
Lancio un paio di macchine virtuali con una debian live da cdrom, ognuna collegata ad un diverso switch: <br />
<br />
<div style="background-color: #cccccc;">$ kvm -cdrom debian-live-squeeze-i386-standard.iso -net vde,sock=/var/tmp/vde1.s -net nic,macaddr=00:11:22:33:44:10</div><div style="background-color: #cccccc;">$ kvm -cdrom debian-live-squeeze-i386-standard.iso -net vde,sock=/var/tmp/vde3.s -net nic,macaddr=00:11:22:33:44:11 </div><br />
Collego tra loro lo switch 2 e 3 (per fare test con le vlan per esempio): <br />
<br />
<div style="background-color: #cccccc;">$ dpipe vde_plug /var/tmp/vde2.s = vde_plug /var/tmp/vde3.s & </div><br />
Mi collego all'interfaccia di management dello switch 2 e doò alcuni comandi: <br />
<br />
<div style="background-color: #cccccc;">$ unixterm /var/tmp/vde2.m</div><br />
<pre style="background-color: #cccccc; font-family: "Courier New",Courier,monospace;">VDE switch V.2.2.3
(C) Virtual Square Team (coord. R. Davoli) 2005,2006,2007 - GPLv2
vde$ port/allprint
0000 DATA END WITH '.'
Port 0001 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
Current User: marco Access Control: (User: NONE - Group: NONE)
IN: pkts 2 bytes 168
OUT: pkts 0 bytes 0
-- endpoint ID 0003 module unix prog : QEMU user=marco PID=10452 SOCK=/var/tmp/vde2.s/.10452-00000
Port 0002 untagged_vlan=0000 ACTIVE - Unnamed Allocatable
Current User: marco Access Control: (User: NONE - Group: NONE)
IN: pkts 0 bytes 0
OUT: pkts 2 bytes 168
-- endpoint ID 0008 module unix prog : vde_plug: user=marco PID=10461 SOCK=/var/tmp/vde2.s/.10461-00000
.
1000 Success
vde$ help
0000 DATA END WITH '.'
COMMAND PATH SYNTAX HELP
------------ -------------- ------------
ds ============ DATA SOCKET MENU
ds/showinfo show ds info
help [arg] Help (limited to arg when specified)
... omesso ...
vde$ vlan/create 42
1000 Success
vde$ port/setvlan 1 42
1000 Success
vde$ port/setvlan 2 42
1000 Success</pre><br />
Collego uno switch (stupido) layer 3 allo switch 1 e 3:<br />
<br />
<pre style="background-color: #cccccc; font-family: "Courier New",Courier,monospace;">$ vde_l3 -v /var/tmp/vde1.s:10.0.8.1/255.255.255.0 -v /var/tmp/vde3.s:10.0.1.1/255.255.255.0 -M /var/tmp/vde_l3.m</pre><br />
Senza fare un tutorial preciso e lungo sul dhcp diciamo che l'host virtuale con le due schede di rete necessita di un server dhcp (collegato eventualmente al dns) configurato per servire due subnet diverse pur rimanendo esso su una sola delle due subnet (metti due subnet /24, il dhcp avrà la scheda di rete configurata su una delle due, non un network /16).<br />
<br />
Putroppo il router virtuale (switch "layer 3") dovremo eliminarlo perché per ora non supporta il dhcp-relay e dunque deve essere sostituito con una macchina virtuale con due schede di rete che abbia installato il pacchetto dhcp-relay e forwarding tra le interfacce abilitato.<br />
<br />
<br />
Lascio la configurazione DHCP e DNS in /dev/null, magari la aggiungerò qui sotto più avanti.Anonymoushttp://www.blogger.com/profile/18294921292385208983noreply@blogger.com0tag:blogger.com,1999:blog-8347608361950913220.post-490570876974851532010-12-02T08:59:00.000+01:002010-12-02T08:59:22.099+01:00L'Arte della Programmazione su Unix<h3><span class="mw-headline">Tratte da "<a class="external text" href="http://www.faqs.org/docs/artu/index.html" rel="nofollow" title="http://www.faqs.org/docs/artu/index.html">The Art of Unix Programming</a>" (traduzione libera): </span></h3><a href="" id="Regola_0:_Keep_it_simple.2C_stupid.21_.28KISS.29" name="Regola_0:_Keep_it_simple.2C_stupid.21_.28KISS.29"></a><h4><span class="editsection"></span> <span class="mw-headline">Regola 0: Keep it simple, stupid! (<a class="external text" href="http://www.faqs.org/docs/artu/ch01s07.html" rel="nofollow" title="http://www.faqs.org/docs/artu/ch01s07.html">KISS</a>) </span></h4><ol><li> <b>Regola di Modularità</b>: Scrivi parti semplici connesse da interfacce pulite. </li>
<li> <b>Regola di Chiarezza</b>: La chiarezza è meglio della ingegnosità. </li>
<li> <b>Regola di Componibilità</b>: Progetta i programmi per essere connessi ad altri programmi. </li>
<li> <b>Regola di Separazione</b>: Separa le specifiche dalle meccaniche, le interfacce dai motori. </li>
<li> <b>Regola di Semplicità</b>: Progetta verso la semplicità e aggiungi complessità solo dove necessario. </li>
<li> <b>Regola di Parsimonia</b>: Scrivi un programma grosso solo quando è chiaro con evidenza che nient'altro può farcela. </li>
<li> <b>Regola di Trasparenza</b>: Progetta per la visibilità per rendere il dubug e l'ispezione più semplice. </li>
<li> <b>Regola di Robustezza:</b>: La Robustezza è figlia della traparenza e della semplicità. </li>
<li> <b>Regola di Incapsulamento</b>: Raggruppa la conoscenza nei dati in modo che la logica possa essere stupida e robusta. </li>
<li> <b>Regola di Minor Sorpresa</b>: Nel progettare le interfacce, fai sempre la cosa meno sorprendente. </li>
<li> <b>Regola del Silenzio</b>: Quanto un programma non ha nulla da dire, non dovrebbe dire nulla. </li>
<li> <b>Regola del Rimedio</b>: Quando si deve crashare, meglio farlo rumorosamente e il prima possibile. </li>
<li> <b>Regola Economica</b>: Il tempo del programmatore è costoso, preferiscigli il tempo macchina. </li>
<li> <b>Regola di Generazione</b>: Evita le modifiche manuali; scrivi programmi che scrivano programmi quando possibile. </li>
<li> <b>Regola di Ottimizzazione</b>: Crea un prototipo prima di raffinare. Fallo funzionare prima di ottimizzare.</li>
<li> <b>Regola della Diversità</b>: Diffida di tutte le dichiarazioni dell'esistenza di "un unico vero modo". </li>
<li> <b>Regola di Estensibilità</b>: Progetta per il futuro, perché arriverà prima di quanto ti possa immaginare. </li>
</ol>Anonymoushttp://www.blogger.com/profile/18294921292385208983noreply@blogger.com0Friuli-Venezia Giulia, Italy45.958787640356391 12.650756835937545.481448140356392 11.7169188359375 46.43612714035639 13.5845948359375