<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Pietro Bertera's Blog</title><link href="https://www.bertera.it/" rel="alternate"></link><link href="https://www.bertera.it/feeds/all.atom.xml" rel="self"></link><id>https://www.bertera.it/</id><updated>2020-09-24T20:25:00+02:00</updated><entry><title>Kubernetes semaphore Validating Webhook</title><link href="https://www.bertera.it/kubernetes-semaphore-validating-webhook.html" rel="alternate"></link><published>2020-09-24T20:25:00+02:00</published><updated>2020-09-24T20:25:00+02:00</updated><author><name>Pietro</name></author><id>tag:www.bertera.it,2020-09-24:kubernetes-semaphore-validating-webhook.html</id><summary type="html">&lt;p&gt;After more than 2 years a new post!&lt;/p&gt;
&lt;p&gt;In the path of learning Kubernetes &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/"&gt;Dynamic Admission Control&lt;/a&gt; I wrote a small webhook to be used as a semaphore to deny certains operations on k8s objects with a specific label.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pbertera/k8s-semaphore"&gt;k8s-semaphore&lt;/a&gt; is a quick and dirty &lt;a href="https://webpy.org/"&gt;web.py&lt;/a&gt; app implementing the webhook, can be deployed on any Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;Here is a self-explaining usage of the admission controller:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF | oc apply -f -&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: v1&lt;/span&gt;
&lt;span class="s"&gt;kind: Pod&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  annotations:&lt;/span&gt;
&lt;span class="s"&gt;    bertera.it/k8s-semaphore: red&lt;/span&gt;
&lt;span class="s"&gt;  name: k8s-semaphore-test&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  containers:&lt;/span&gt;
&lt;span class="s"&gt;  - name: test&lt;/span&gt;
&lt;span class="s"&gt;    image: alpine&lt;/span&gt;
&lt;span class="s"&gt;    # Just spin &amp;amp; wait forever&lt;/span&gt;
&lt;span class="s"&gt;    command: [ &amp;quot;/bin/bash&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;--&amp;quot; ]&lt;/span&gt;
&lt;span class="s"&gt;    args: [ &amp;quot;while true; do sleep 30; done;&amp;quot; ]&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

$ oc get pod &lt;span class="nb"&gt;test&lt;/span&gt;
NAME     READY   STATUS    RESTARTS   AGE
&lt;span class="nb"&gt;test&lt;/span&gt;     &lt;span class="m"&gt;1&lt;/span&gt;/1     Running   &lt;span class="m"&gt;0&lt;/span&gt;          29m

$ oc delete &lt;span class="nb"&gt;test&lt;/span&gt;
Error from server: admission webhook &lt;span class="s2"&gt;&amp;quot;k8s-semaphore.k8s-semaphore.svc&amp;quot;&lt;/span&gt; denied the request: Resource &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;kind: Pod, version: v1, group: &lt;span class="o"&gt;)&lt;/span&gt; is annotated with bertera.it/k8s-semaphore, cannot be removed

$ oc annotate pod &lt;span class="nb"&gt;test&lt;/span&gt; bertera.it/k8s-semaphore-
pod/test annotated

$ oc delete pod &lt;span class="nb"&gt;test&lt;/span&gt;
pod &lt;span class="s2"&gt;&amp;quot;test&amp;quot;&lt;/span&gt; deleted
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The label name and value can be modified via the environemt variables &lt;code&gt;SEMAPHORE_ANNOTATION&lt;/code&gt; and &lt;code&gt;SEMAPHORE_RED&lt;/code&gt;. Depending on the definition of the &lt;code&gt;ValidatingWebhookConfiguration&lt;/code&gt; the admission controller can be applied to any Kubernetes resource and verbs.&lt;/p&gt;
&lt;p&gt;Look at the &lt;a href="https://github.com/pbertera/k8s-semaphore/blob/master/manifest.yaml"&gt;manifest.yaml&lt;/a&gt; for an example deployment and &lt;code&gt;ValidatingWebhookConfiguration&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hint: &lt;a href="https://github.com/pbertera/ocp-webhook-cert-manager"&gt;OpenShift Webhook Certificate Manager&lt;/a&gt; can help deploying the Webhook certificate on OpenShift.&lt;/p&gt;</summary><category term="Kubernetes"></category><category term="OpenShift"></category></entry><entry><title>Introducing dcw: a Poor Man PaaS tool</title><link href="https://www.bertera.it/introducing-dcw-a-poor-man-paas-tool.html" rel="alternate"></link><published>2017-03-28T22:25:00+02:00</published><updated>2017-03-28T22:25:00+02:00</updated><author><name>Pietro</name></author><id>tag:www.bertera.it,2017-03-28:introducing-dcw-a-poor-man-paas-tool.html</id><summary type="html">&lt;p&gt;Dcw (Docker Compose Wrapper) is very small and dirty Bash script wrapping the &lt;a href="https://docs.docker.com/compose/"&gt;&lt;code&gt;docker-compose&lt;/code&gt;&lt;/a&gt; command. The meaning of such wrapper is to expose some &lt;code&gt;docker-compose&lt;/code&gt; &lt;a href="https://docs.docker.com/compose/reference/"&gt;operations&lt;/a&gt;  and a set of well defined commands on the host machine.&lt;/p&gt;
&lt;p&gt;The typical use-case is an SSH command executed via the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file, in this way you can provide provide some &lt;code&gt;docker-compose&lt;/code&gt; commands that can be execute with some specific &lt;code&gt;docker-compose&lt;/code&gt; config files.&lt;/p&gt;
&lt;h2&gt;The containers pool&lt;/h2&gt;
&lt;p&gt;A pool is defined via a &lt;code&gt;docker-compose&lt;/code&gt; YAML config file. The name of the config file defines the pool name.&lt;/p&gt;
&lt;p&gt;All the YAML config files must reside into the folder defined via the &lt;code&gt;dc_confd&lt;/code&gt; variable.&lt;/p&gt;
&lt;p&gt;Once you created the config file you are ready to use &lt;code&gt;dcw&lt;/code&gt; as an SSH command.&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;First of all you have to clone the &lt;a href="https://github.com/pbertera/dcw"&gt;git repo&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /opt
$ git clone https://github.com/pbertera/dcw
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The git repository contains a ready to use &lt;code&gt;docker-compose&lt;/code&gt; config file named &lt;code&gt;nginx.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This file defines a pool of 3 &lt;a href="https://www.nginx.com"&gt;NGINX&lt;/a&gt; containers, each container exposes an HTTP and HTTPS port and defines some data volumes, please refer to the &lt;a href="https://docs.docker.com/compose/"&gt;&lt;code&gt;docker-compose&lt;/code&gt;&lt;/a&gt; documentation for the file syntax.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;nginx.yaml&lt;/code&gt; defines also a label named &lt;code&gt;management.command.shell&lt;/code&gt; with value &lt;code&gt;docker exec -it nginx1 /bin/bash&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Configuring &lt;code&gt;dcw&lt;/code&gt; is quite simple: you have to properly configure the following variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dc_confd&lt;/strong&gt;: the directory conatining all the docker-compose YAML files (in this case &lt;code&gt;/opt/dcw&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dc_denied_commands&lt;/strong&gt;: (optional) a regex defining all the not allowed &lt;code&gt;docker-compose&lt;/code&gt;, default &lt;code&gt;^kill|^rm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;In case you want to have the &lt;a href="https://slack.com/"&gt;Slack&lt;/a&gt; or &lt;a href="https://www.hipchat.com/"&gt;HipChat&lt;/a&gt; integration all the other needed vars.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now you are ready to use dcw into the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file: edit the &lt;code&gt;authorized_keys&lt;/code&gt; in order to use the &lt;code&gt;dcw&lt;/code&gt; script as an SSH command associated with an SSH public key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;command=&amp;quot;/opt/dcw/dcw&amp;quot;,no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1 [..] == pietro@hank
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;At this point everything should be ready and you can start using the tool: connect to the remote host using the proper SSH key and user:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ssh pietro.bertera@server &lt;span class="nb"&gt;help&lt;/span&gt;
INFO: SSH Original command: &lt;span class="nb"&gt;help&lt;/span&gt;
Usage:

ssh user@remote-host &amp;lt;pool&lt;span class="p"&gt;|&lt;/span&gt;command&amp;gt; &amp;lt;args&amp;gt;

Examples:

Run the docker-compose ps over the ldap service pool:
    ssh user@remote-host pool ldap ps

Start the service ldap1 from the ldap pool:
    ssh user@remote-host pool ldap start ldap1

Execute the &lt;span class="nb"&gt;command&lt;/span&gt; defined into the label &lt;span class="s1"&gt;&amp;#39;management.command&amp;#39;&lt;/span&gt; of the ldap1 container:
    ssh user@remote-host &lt;span class="nb"&gt;command&lt;/span&gt; ldap1 shell

List all the available commands into the container ldap1:
    ssh user@remote-host &lt;span class="nb"&gt;command&lt;/span&gt; ldap1 &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;List all the containers in the &lt;code&gt;nginx&lt;/code&gt; pool:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ssh pietro.bertera@server pool nginx ps
INFO: SSH Original command: pool nginx ps
INFO: executing docker-compose ps on nginx
 Name               Command                State                         Ports                     
--------------------------------------------------------------------------------------------------
nginx1   /entrypoint.sh nginx -g da ...   Exit &lt;span class="m"&gt;137&lt;/span&gt;   &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10081-&amp;gt;443/tcp, &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10080-&amp;gt;80/tcp 
nginx2   /entrypoint.sh nginx -g da ...   Exit &lt;span class="m"&gt;137&lt;/span&gt;   &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10083-&amp;gt;443/tcp, &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10082-&amp;gt;80/tcp 
nginx3   /entrypoint.sh nginx -g da ...   Exit &lt;span class="m"&gt;137&lt;/span&gt;   &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10085-&amp;gt;443/tcp, &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10084-&amp;gt;80/tcp 
nginx4   /entrypoint.sh nginx -g da ...   Exit &lt;span class="m"&gt;137&lt;/span&gt;   &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10087-&amp;gt;443/tcp, &lt;span class="m"&gt;0&lt;/span&gt;.0.0.0:10086-&amp;gt;80/tcp 
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Start the container &lt;code&gt;nginx1&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ssh pietro.bertera@server pool nginx up -d nginx1
INFO: SSH Original command: pool nginx up -d nginx1
INFO: executing docker-compose up -d nginx1 on nginx
Creating network &lt;span class="s2"&gt;&amp;quot;nginx_default&amp;quot;&lt;/span&gt; with the default driver
Creating nginx1
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Execute the command defined by the &lt;code&gt;management.command.shell&lt;/code&gt; Docker label executing the command &lt;code&gt;docker exec -it nginx1 /bin/bash&lt;/code&gt; on the host, in this case the &lt;code&gt;-t&lt;/code&gt; SSH option is needed in order to allocate a pseudo terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ssh -t pietro.bertera@server &lt;span class="nb"&gt;command&lt;/span&gt; nginx1 shell
INFO: SSH Original command: &lt;span class="nb"&gt;command&lt;/span&gt; nginx1 shell
INFO: executing &lt;span class="nb"&gt;command&lt;/span&gt; from label management.command.shell into container nginx1
root@23047d54e97b:/#
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you configured also the &lt;a href="https://slack.com/"&gt;Slack&lt;/a&gt; or &lt;a href="https://www.hipchat.com/"&gt;HipChat&lt;/a&gt; integration all the command will be logged on Slack or HipChat too.&lt;/p&gt;
&lt;h2&gt;Security&lt;/h2&gt;
&lt;p&gt;This tool doesn't provide any security feature, so should be used only to provide a simplified way to start/stop containers and execute commands to trusted users only.&lt;/p&gt;
&lt;p&gt;For any suggestion, improvement or idea feel free to contact me.&lt;/p&gt;</summary><category term="Docker"></category><category term="Bash"></category><category term="SSH"></category></entry><entry><title>A DNS server with Batteries Included with PowerDNS, Docker and Python</title><link href="https://www.bertera.it/a-dns-server-with-batteries-included-with-powerdns-docker-and-python.html" rel="alternate"></link><published>2016-09-06T03:25:00+02:00</published><updated>2016-09-06T03:25:00+02:00</updated><author><name>Pietro</name></author><id>tag:www.bertera.it,2016-09-06:a-dns-server-with-batteries-included-with-powerdns-docker-and-python.html</id><summary type="html">&lt;p&gt;If you have to frequently create, destroy and re-configure DNS zones for testing purposes you will agree that manually editing a Bind &lt;a href="http://www.zytrax.com/books/dns/ch6/mydomain.html"&gt;zone file&lt;/a&gt; is an annoying and error-prone task.&lt;/p&gt;
&lt;p&gt;In order to make this job simpler I worked on &lt;a href="https://hub.docker.com/r/pbertera/pdns/"&gt;this&lt;/a&gt; Docker container: the container instantiate a &lt;a href="https://www.powerdns.com/"&gt;PowerDNS&lt;/a&gt; and provides an easy-to-use &lt;a href="https://github.com/pbertera/PowerDNS-CLI"&gt;CLI script&lt;/a&gt; interacting with the REST API.&lt;/p&gt;
&lt;h2&gt;How to use:&lt;/h2&gt;
&lt;p&gt;Inspired by the illuminating &lt;a href="https://twitter.com/jessfraz"&gt;@jessfraz&lt;/a&gt; &lt;a href="https://blog.jessfraz.com/post/docker-containers-on-the-desktop/"&gt;post&lt;/a&gt; about containerizing everything, I added to my &lt;a href="https://github.com/pbertera/dotfiles/blob/master/.dockerfunc"&gt;.dockerfunc&lt;/a&gt; some helper functions: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pdns&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pdns
    &lt;span class="k"&gt;if&lt;/span&gt; is_running &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        bailout &lt;span class="s2"&gt;&amp;quot;Container &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt; is already running&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    del_stopped &lt;span class="nv"&gt;$name&lt;/span&gt;

    docker run -it --name &lt;span class="nv"&gt;$name&lt;/span&gt; -e &lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MySecretKey -e &lt;span class="nv"&gt;WEB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8081&lt;/span&gt; -v &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PDNS_DB&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:/data/pdns.db -p &lt;span class="m"&gt;8081&lt;/span&gt;:8081 -p &lt;span class="m"&gt;53&lt;/span&gt;:53 -p &lt;span class="m"&gt;53&lt;/span&gt;:53/udp pbertera/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

pdns.py&lt;span class="o"&gt;(){&lt;/span&gt;
    relies_on pdns
    docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it pdns pdns.py &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;em&gt;NOTE:&lt;/em&gt; for the first run you will need to create an empty database file: &lt;code&gt;touch ${PDNS_DB}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then I can start the container:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;hank-2:~ pietro$ pdns
pdns
Error: near line 3: table domains already exists
Error: near line 13: index name_index already exists
Error: near line 16: table records already exists
Error: near line 31: index rec_name_index already exists
Error: near line 32: index nametype_index already exists
Error: near line 33: index domain_id already exists
Error: near line 34: index orderindex already exists
Error: near line 37: table supermasters already exists
Error: near line 43: index ip_nameserver_pk already exists
Error: near line 46: table comments already exists
Error: near line 57: index comments_domain_id_index already exists
Error: near line 58: index comments_nametype_index already exists
Error: near line 59: index comments_order_idx already exists
Error: near line 62: table domainmetadata already exists
Error: near line 70: index domainmetaidindex already exists
Error: near line 73: table cryptokeys already exists
Error: near line 82: index domainidindex already exists
Error: near line 85: table tsigkeys already exists
Error: near line 92: index namealgoindex already exists
Imported schema structure
Sep 06 01:24:36 Reading random entropy from &amp;#39;/dev/urandom&amp;#39;
Sep 06 01:24:36 Loading &amp;#39;/usr/lib/x86_64-linux-gnu/pdns/libgsqlite3backend.so&amp;#39;
Sep 06 01:24:36 This is a standalone pdns
Sep 06 01:24:36 Listening on controlsocket in &amp;#39;/var/run/pdns.controlsocket&amp;#39;
Sep 06 01:24:36 UDP server bound to 0.0.0.0:53
Sep 06 01:24:36 Unable to enable timestamp reporting for socket
Sep 06 01:24:36 UDPv6 server bound to [::]:53
Sep 06 01:24:36 TCP server bound to 0.0.0.0:53
Sep 06 01:24:36 TCPv6 server bound to [::]:53
Sep 06 01:24:36 PowerDNS Authoritative Server 4.0.0-alpha2 (C) 2001-2016 PowerDNS.COM BV
Sep 06 01:24:36 Using 64-bits mode. Built using gcc 5.3.1 20160330.
Sep 06 01:24:36 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Sep 06 01:24:36 Listening for HTTP requests on 0.0.0.0:8081
Sep 06 01:24:36 Creating backend connection for TCP
Sep 06 01:24:36 About to create 3 backend threads for UDP
Sep 06 01:24:36 Done launching threads, ready to distribute questions
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now PowerDNS is running and listening on the port &lt;code&gt;8081&lt;/code&gt; for the REST API and the port &lt;code&gt;53&lt;/code&gt; UDP and TCP for the DNS queries, the database is permanently stored into the SQLite DB file &lt;code&gt;${PDNS_DB}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Using the command &lt;code&gt;pdns.py&lt;/code&gt; you can manage the zones:&lt;/p&gt;
&lt;h3&gt;Creating a zone:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;hank-2:~ pietro$ pdns.py --zone example.com. --zoneType MASTER --nameserver ns.example.com.  add_zone
2016-09-06 01:57:09,938 pdns         INFO     DNS Zone &amp;#39;example.com.&amp;#39; Successfully Added...
hank-2:~ pietro$ pdns.py --zone example.com. --recordType A --name ns.example.com. --content 172.16.18.15 add_record
2016-09-06 01:58:04,316 pdns         INFO     DNS Record &amp;#39;ns.example.com.&amp;#39; Successfully Added/Updated
&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;Digging the zone:&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;hank-2&lt;/span&gt;&lt;span class="o"&gt;:~&lt;/span&gt; &lt;span class="nt"&gt;pietro&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="nt"&gt;dig&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;localhost&lt;/span&gt; &lt;span class="nt"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt;

&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;DiG&lt;/span&gt; &lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-P1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;localhost&lt;/span&gt; &lt;span class="nt"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt; &lt;span class="nt"&gt;servers&lt;/span&gt; &lt;span class="nt"&gt;found&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;global&lt;/span&gt; &lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;cmd&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;Got&lt;/span&gt; &lt;span class="nt"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;-&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;HEADER&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;opcode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;QUERY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;NOERROR&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;57709&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;qr&lt;/span&gt; &lt;span class="nt"&gt;aa&lt;/span&gt; &lt;span class="nt"&gt;rd&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;QUERY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ANSWER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;AUTHORITY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ADDITIONAL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;recursion&lt;/span&gt; &lt;span class="nt"&gt;requested&lt;/span&gt; &lt;span class="nt"&gt;but&lt;/span&gt; &lt;span class="nt"&gt;not&lt;/span&gt; &lt;span class="nt"&gt;available&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;QUESTION&lt;/span&gt; &lt;span class="nt"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;           &lt;span class="nt"&gt;IN&lt;/span&gt;  &lt;span class="nt"&gt;NS&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;ANSWER&lt;/span&gt; &lt;span class="nt"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;        &lt;span class="nt"&gt;3600&lt;/span&gt;    &lt;span class="nt"&gt;IN&lt;/span&gt;  &lt;span class="nt"&gt;NS&lt;/span&gt;  &lt;span class="nt"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;Query&lt;/span&gt; &lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;16&lt;/span&gt; &lt;span class="nt"&gt;msec&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;SERVER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;53&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;WHEN&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Tue&lt;/span&gt; &lt;span class="nt"&gt;Sep&lt;/span&gt;  &lt;span class="nt"&gt;6&lt;/span&gt; &lt;span class="nt"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;18&lt;/span&gt; &lt;span class="nt"&gt;2016&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;MSG&lt;/span&gt; &lt;span class="nt"&gt;SIZE&lt;/span&gt;  &lt;span class="nt"&gt;rcvd&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;46&lt;/span&gt;

&lt;span class="nt"&gt;hank-2&lt;/span&gt;&lt;span class="o"&gt;:~&lt;/span&gt; &lt;span class="nt"&gt;pietro&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="nt"&gt;dig&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;localhost&lt;/span&gt; &lt;span class="nt"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt; 

&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;DiG&lt;/span&gt; &lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-P1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;localhost&lt;/span&gt; &lt;span class="nt"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt; &lt;span class="nt"&gt;servers&lt;/span&gt; &lt;span class="nt"&gt;found&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;global&lt;/span&gt; &lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;cmd&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;Got&lt;/span&gt; &lt;span class="nt"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;-&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;HEADER&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;-&lt;/span&gt; &lt;span class="nt"&gt;opcode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;QUERY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;NOERROR&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;49682&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;qr&lt;/span&gt; &lt;span class="nt"&gt;aa&lt;/span&gt; &lt;span class="nt"&gt;rd&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;QUERY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ANSWER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;AUTHORITY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ADDITIONAL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;recursion&lt;/span&gt; &lt;span class="nt"&gt;requested&lt;/span&gt; &lt;span class="nt"&gt;but&lt;/span&gt; &lt;span class="nt"&gt;not&lt;/span&gt; &lt;span class="nt"&gt;available&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;QUESTION&lt;/span&gt; &lt;span class="nt"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;            &lt;span class="nt"&gt;IN&lt;/span&gt;  &lt;span class="nt"&gt;A&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;ANSWER&lt;/span&gt; &lt;span class="nt"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="nt"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;     &lt;span class="nt"&gt;3600&lt;/span&gt;    &lt;span class="nt"&gt;IN&lt;/span&gt;  &lt;span class="nt"&gt;A&lt;/span&gt;   &lt;span class="nt"&gt;172&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;16&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;18&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;15&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;Query&lt;/span&gt; &lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;13&lt;/span&gt; &lt;span class="nt"&gt;msec&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;SERVER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;53&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;WHEN&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Tue&lt;/span&gt; &lt;span class="nt"&gt;Sep&lt;/span&gt;  &lt;span class="nt"&gt;6&lt;/span&gt; &lt;span class="nt"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;58&lt;/span&gt; &lt;span class="nt"&gt;2016&lt;/span&gt;
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;MSG&lt;/span&gt; &lt;span class="nt"&gt;SIZE&lt;/span&gt;  &lt;span class="nt"&gt;rcvd&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;48&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Credits&lt;/h2&gt;
&lt;p&gt;All the credits to &lt;a href="http://everythingshouldbevirtual.com/"&gt;Larry Smith Jr.&lt;/a&gt; for the original pdns.py script and &lt;a href="https://github.com/renan"&gt;Renan Gonçalves&lt;/a&gt; for the original &lt;a href="https://github.com/renan/powerdns-docker"&gt;PowerDNS+MySQL&lt;/a&gt; Docker container&lt;/p&gt;</summary><category term="Docker"></category><category term="Python"></category><category term="REST"></category><category term="PowerDNS"></category></entry><entry><title>How to simulate a slow HTTP server with a Dockerized lighttpd</title><link href="https://www.bertera.it/how-to-simulate-a-slow-http-server-with-a-dockerized-lighttpd.html" rel="alternate"></link><published>2016-08-30T00:00:00+02:00</published><updated>2016-08-30T00:00:00+02:00</updated><author><name>pietro</name></author><id>tag:www.bertera.it,2016-08-30:how-to-simulate-a-slow-http-server-with-a-dockerized-lighttpd.html</id><summary type="html">&lt;p&gt;Today I had to work on an issue related to troubled HTTP connections.
So in order to reproduce such issue I had to find a way to easily reduce the bandwidth of the HTTP transfer.&lt;/p&gt;
&lt;p&gt;After a quick Google search I landed on &lt;a href="http://stackoverflow.com/a/13656825/143819"&gt;this&lt;/a&gt; Stackoverflow answer 
which suggested me the idea to create a simple Docker container for that.&lt;/p&gt;
&lt;p&gt;The container image is automatically build on &lt;a href="https://hub.docker.com/r/pbertera/lighttpd-throttle/"&gt;Dockerhub&lt;/a&gt; from the &lt;a href="https://github.com/pbertera/dockerfiles/blob/master/lighttpd-throttle/Dockerfile"&gt;Dockerfile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The container can be easily used to &lt;a href="https://github.com/pbertera/dockerfiles/tree/master/lighttpd-throttle#server-mode"&gt;serve a local folder&lt;/a&gt; or as a &lt;a href="https://github.com/pbertera/dockerfiles/tree/master/lighttpd-throttle#proxy-mode"&gt;proxy&lt;/a&gt; in front of another HTTP server.&lt;/p&gt;</summary><category term="lighttpd"></category><category term="Docker"></category><category term="testing"></category></entry><entry><title>How this website works</title><link href="https://www.bertera.it/how-this-website-works.html" rel="alternate"></link><published>2016-06-29T20:25:00+02:00</published><updated>2016-06-29T20:25:00+02:00</updated><author><name>Pietro</name></author><id>tag:www.bertera.it,2016-06-29:how-this-website-works.html</id><summary type="html">&lt;p&gt;After many years on Wordpress I decided to move my website to a static website.&lt;/p&gt;
&lt;p&gt;I decided to adopt &lt;a href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;: a static website builder based on python and supporting reStructuredText, Markdown, or AsciiDoc.&lt;/p&gt;
&lt;p&gt;Moreover I decided to use &lt;a href="https://pages.github.com/"&gt;GitHub&lt;/a&gt; pages to host the website.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/pbertera/www.bertera.it/blob/master/plugins/cv_pdf/__init__.py"&gt;pdf plugin&lt;/a&gt; comes from &lt;a href="http://cyrille.rossant.net/pelican-github/"&gt;Cyrille Rossant&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Docker&lt;/h4&gt;
&lt;p&gt;In order to maintain a clean approach I use a self-contained Docker container for managing the whole authoring and publishing / deploying workflow: the &lt;a href="https://github.com/pbertera/www.bertera.it/blob/master/Dockerfile"&gt;Dockerfile&lt;/a&gt; defines a container based on the &lt;em&gt;python:3&lt;/em&gt; image plus all the needed packages and the Flex theme.&lt;/p&gt;
&lt;p&gt;The Docker image is automatically build on &lt;a href="https://hub.docker.com/r/pbertera/pelican/"&gt;Docker hub&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;The manage script&lt;/h4&gt;
&lt;p&gt;The &lt;a href="https://github.com/pbertera/www.bertera.it/blob/master/manage.sh"&gt;manage.sh&lt;/a&gt; is a wrapper around the &lt;code&gt;docker run&lt;/code&gt; command the script accepts all the valid &lt;a href="https://github.com/pbertera/www.bertera.it/blob/master/Makefile"&gt;Makefile&lt;/a&gt; target plus the &lt;code&gt;deploy&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt; and &lt;code&gt;update&lt;/code&gt;. The first argument will deploy the website into the &lt;code&gt;gh-pages&lt;/code&gt; branch, the second one creates the Docker image. The &lt;code&gt;update&lt;/code&gt; argument is the same of &lt;code&gt;make html &amp;amp;&amp;amp; make serve&lt;/code&gt; inside of the container&lt;/p&gt;</summary><category term="markdown"></category><category term="Pelican"></category><category term="Docker"></category><category term="github"></category></entry><entry><title>Overwriting Latex image positioning in pandoc generated pdf</title><link href="https://www.bertera.it/overwriting-latex-image-positioning-in-pandoc-generated-pdf.html" rel="alternate"></link><published>2015-04-14T20:25:00+02:00</published><updated>2015-04-14T20:25:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2015-04-14:overwriting-latex-image-positioning-in-pandoc-generated-pdf.html</id><summary type="html">&lt;p&gt;Pandoc is a very powerful tool, I'm extensively using it for writing
documentation, papers and so on.&lt;br /&gt;
You can generate pdf, html, docx and many other formats trough a
compilation of markdown source file.&lt;/p&gt;
&lt;p&gt;Often I use it to produce nice PDF documents, in this process your
Markdown document is parsed and rendered using a Latex template, you can
obtain the default template using the command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pandoc -D latex&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately all images with a caption tet are rendered in Latex using
the &lt;strong&gt;htbp&lt;/strong&gt; floating positioning, this is hardcoded in pandoc.&lt;/p&gt;
&lt;p&gt;Markdown code:&lt;br /&gt;
&lt;code&gt;![I/O connector](img/1.jpg)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Latex code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;\begin{figure}[htbp]
\centering
\includegraphics{img/1.jpg}
\caption{I/O connector}
\end{figure}
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sometimes the [htbp] positioning doesn't fits my needs and I prefer to
use the fixed [H] positioning.&lt;br /&gt;
Over the web you can find a lot of solutions suggesting to compile your
Markdown in a Latex file, parse the file with sed and then use pdflatex
to generate the PDF.&lt;/p&gt;
&lt;p&gt;Now, I found a way to overwrite the Latex {figure} environment directly
into the Latex template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;% Overwrite \begin{figure}[htbp] with \begin{figure}[H]&lt;/span&gt;
&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;usepackage&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;origfigure&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;
&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;endorigfigure&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;endfigure&lt;/span&gt;
&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;renewenvironment&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;}[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][]{&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
   &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;origfigure&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
   &lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;endorigfigure&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="Latex"></category><category term="markdown"></category></entry><entry><title>A server launcher with log console in Python Tkinter</title><link href="https://www.bertera.it/a-server-launcher-with-log-console-in-python-tkinter.html" rel="alternate"></link><published>2015-03-13T15:12:00+01:00</published><updated>2015-03-13T15:12:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2015-03-13:a-server-launcher-with-log-console-in-python-tkinter.html</id><summary type="html">&lt;p&gt;I'm working on an Tk application that should start and stop an UDP
server, I need to show server logs in the Tk GUI with a "Pause &amp;amp; Resume"
button.&lt;/p&gt;
&lt;p&gt;I already have the UDP server implemented using the
blocking &lt;a href="https://docs.python.org/2/library/socketserver.html"&gt;SocketServer.BaseRequestHandler &lt;/a&gt;,
so in order to wrap a GUI to the server I need to run the server in a
separate Thread.&lt;/p&gt;
&lt;p&gt;My server already logs all messages using the Python
&lt;a href="https://docs.python.org/2/library/logging.html"&gt;logging&lt;/a&gt; module, &lt;a href="http://stackoverflow.com/a/20671023"&gt;this
StackExchange snipped&lt;/a&gt; shows a good
example of how to write on a Text widget from the logging Python module.&lt;/p&gt;
&lt;p&gt;Soon I found that Python Tkinter and multithreading is a
&lt;a href="http://stackoverflow.com/q/3567238"&gt;frequent&lt;/a&gt; cause
of &lt;a href="http://bugs.python.org/issue11077"&gt;headache&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The secret for avoiding a big waste of debugging hours is to keep away
from all the graphical things child threads. In brief a child thread
cannot interact with Tk, otherwise your application is at risk of
deadlock or race conditions.&lt;/p&gt;
&lt;p&gt;So I found the solution to write from the logging handler in a Python
Queue, the Tk widget will read and display the Queue contents using a
recursive &lt;a href="http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method"&gt;after&lt;/a&gt;
callback.&lt;/p&gt;
&lt;p&gt;Here the code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Copyright 2015 Pietro Bertera \&amp;lt;pietro@bertera.it\&amp;gt;  &lt;/span&gt;
&lt;span class="c1"&gt;#  &lt;/span&gt;
&lt;span class="c1"&gt;# This program is free software: you can redistribute it and/or modify  &lt;/span&gt;
&lt;span class="c1"&gt;# it under the terms of the GNU General Public License as published by  &lt;/span&gt;
&lt;span class="c1"&gt;# the Free Software Foundation, either version 3 of the License, or  &lt;/span&gt;
&lt;span class="c1"&gt;# (at your option) any later version.  &lt;/span&gt;
&lt;span class="c1"&gt;#  &lt;/span&gt;
&lt;span class="c1"&gt;# This program is distributed in the hope that it will be useful,  &lt;/span&gt;
&lt;span class="c1"&gt;# but WITHOUT ANY WARRANTY; without even the implied warranty of  &lt;/span&gt;
&lt;span class="c1"&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  &lt;/span&gt;
&lt;span class="c1"&gt;# GNU General Public License for more details.  &lt;/span&gt;
&lt;span class="c1"&gt;#  &lt;/span&gt;
&lt;span class="c1"&gt;# You should have received a copy of the GNU General Public License  &lt;/span&gt;
&lt;span class="c1"&gt;# along with this program. If not, see http://www.gnu.org/licenses/&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Queue&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;SocketServer&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;threading&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Tkinter&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;tk&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;ScrolledText&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ScrolledText&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QueueLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;

    &lt;span class="c1"&gt;# write in the queue&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoggedUDPServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SocketServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ThreadingMixIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SocketServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UDPServer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RequestHandlerClass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;SocketServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UDPServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RequestHandlerClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Add the queue logger&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UDPHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SocketServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseRequestHandler&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Queue logger is un under the self.server object&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainApplication&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log_level&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columnconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rowconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2 rows: firts with settings, second with registrar data&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Commands row doesn&amp;#39;t expands&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rowconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Logs row will grow&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rowconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Main fram can enlarge&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columnconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columnconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NSEW&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Run/Stop button&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Run Server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Clear button&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear_button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Clear Log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear_log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Stop log button&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_log_button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pause Log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_log_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Logs Widget&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ScrolledText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;columnspan&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NSEW&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Not editable&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;disabled&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Queue where the logging handler will write&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Stup the logger&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;logger&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%(asctime)s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%(levelname)s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%(message)s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Use the QueueLogger as Handler&lt;/span&gt;
        &lt;span class="n"&gt;hl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QueueLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;hl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;logger&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Setup the update_widget callback reading logs from the queue&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_log&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stop_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pausing the logger&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger_alarm&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;after_cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger_alarm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_log_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Start Log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger_alarm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Starting the logger&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_log_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pause Log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;normal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Read from the Queue and add to the log widger&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Scroll to the bottom&lt;/span&gt;
            &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_idletasks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;disabled&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger_alarm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clear_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;normal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_widget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;disabled&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Starting thread&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LoggedUDPServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;UDPHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server_thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;serve_forever&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server_thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;daemon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server_thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Stop Server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop_server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Cannot start the server: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stop_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Stopping server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Server stopped&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;control_button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Run Server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MainApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mainloop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Error: you must specify address and port..&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here a screenshot of the UDP server in action:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A screenshot of the logging server in action" src="https://www.bertera.it/tsafe.png" /&gt;&lt;/p&gt;</summary><category term="GUI"></category><category term="Multithreading"></category><category term="python"></category><category term="Tkinter"></category><category term="UDP"></category></entry><entry><title>Changes on the Italian "Golden Tree"</title><link href="https://www.bertera.it/changes-on-the-italian-golden-tree.html" rel="alternate"></link><published>2015-03-02T21:03:00+01:00</published><updated>2015-03-02T21:03:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2015-03-02:changes-on-the-italian-golden-tree.html</id><summary type="html">&lt;p&gt;This is a continuation of my &lt;a href="http://www.bertera.it/index.php/2015/02/25/what-happened-to-the-39-italy-enum-dns-zone/" title="What happened to the +39 (Italy) ENUM DNS Zone ?"&gt;previous
post&lt;/a&gt;
about the &lt;strong&gt;+39 ENUM DNS zone&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to the powerful of the RIPE Database you can see all historical
changes on a RIPE-assigned domain. Lets see what happen on the
domain &lt;strong&gt;9.3.e164.arpa&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;List all changes on the domain object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois -h whois.ripe.net -- &amp;quot;--list-versions 9.3.e164.arpa&amp;quot;  
% This is the RIPE Database query service.  
% The objects are in RPSL format.  
%  
% The RIPE Database is subject to Terms and Conditions.  
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Version history for DOMAIN object &amp;quot;9.3.e164.arpa&amp;quot;  
% You can use &amp;quot;--show-version rev\#&amp;quot; to get an exact version of the
object.

rev\# Date Op.

1 2005-11-02 15:21 ADD/UPD  
2 2006-02-10 11:41 ADD/UPD  
3 2006-04-07 17:56 ADD/UPD  
4 2006-04-07 18:00 ADD/UPD

% This query was served by the RIPE Database Query Service version 1.78 (DB-4)  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So, the domain was changed 4 times:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version N°1:&lt;/strong&gt; 2005-11-02&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version N°2:&lt;/strong&gt; 2006-02-10&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version N°3 and 4:&lt;/strong&gt; 2006-04-07&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The object in the first version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois -h whois.ripe.net -- &amp;quot;--show-version 1 9.3.e164.arpa&amp;quot;  
% This is the RIPE Database query service.  
% The objects are in RPSL format.  
%  
% The RIPE Database is subject to Terms and Conditions.  
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Version 1 of object &amp;quot;9.3.e164.arpa&amp;quot;  
% This version was a UPDATE operation on 2005-11-02 15:21  
% You can use &amp;quot;--list-versions&amp;quot; to get a list of versions for an
object.

domain: 9.3.e164.arpa  
descr: Italy ENUM Mapping  
descr: Italy ENUM Registry  
admin-c: LF1894-RIPE  
tech-c: GT2177-RIPE  
zone-c: GT2177-RIPE  
nserver: dns.voipex.it  
nserver: dns2.voipex.it  
remarks: Ministero delle Comunicazioni - http://www.comunicazioni.it  
remarks: Istituto Superiore delle Comunicazioni  
remarks: e delle tecnologie dell&amp;#39;Informazione -  
remarks: http://www.iscom.gov.it  
remarks: Consorzio VOIPEX - http://www.voipex.it  
mnt-by: MNT-VOIPEX  
source: RIPE \# Filtered

% This query was served by the RIPE Database Query Service version 1.78 (DB-2)  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ok, the first version was the assignment to the Voipex consortium,
&lt;a href="https://www.ripe.net/ripe/mail/archives/enum-announce/2005-October/000046.html"&gt;see&lt;/a&gt;
the request.&lt;/p&gt;
&lt;p&gt;Here the second version of the object (updated at 2006-02-10 11:41):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois -h whois.ripe.net -- &amp;quot;--show-version 2 9.3.e164.arpa&amp;quot;  
% This is the RIPE Database query service.  
% The objects are in RPSL format.  
%  
% The RIPE Database is subject to Terms and Conditions.  
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Version 2 of object &amp;quot;9.3.e164.arpa&amp;quot;  
% This version was a UPDATE operation on 2006-02-10 11:41  
% You can use &amp;quot;--list-versions&amp;quot; to get a list of versions for an
object.

domain: 9.3.e164.arpa  
descr: Italy ENUM Mapping  
descr: Italy ENUM Registry  
admin-c: LF1894-RIPE  
tech-c: LF1894-RIPE  
zone-c: LF1894-RIPE  
nserver: dns.voipex.it  
nserver: dns2.voipex.it  
remarks: Ministero delle Comunicazioni - http://www.comunicazioni.it  
remarks: Istituto Superiore delle Comunicazioni e delle tecnologie
dell&amp;#39;Informazione  
remarks: http://www.iscom.gov.it  
mnt-by: ISCOM-MNT  
source: RIPE \# Filtered

% This query was served by the RIPE Database Query Service version 1.78 (DB-3)  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In this second version the domain is now delegated to ISCOM (Istituto
Superiore delle Comunicazioni e delle tecnologie dell'Informazione).
Nameservers were still on Voipex.&lt;/p&gt;
&lt;p&gt;Below the differences between version 2 and version 3: Namserver moved
from Voipex to istsupcti.it&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois -h whois.ripe.net -- &amp;quot;--diff-versions 2:3
9.3.e164.arpa&amp;quot;  
% This is the RIPE Database query service.  
% The objects are in RPSL format.  
%  
% The RIPE Database is subject to Terms and Conditions.  
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Difference between version 2 and 3 of object &amp;quot;9.3.e164.arpa&amp;quot;

@@ -6,4 +6,4 @@  
zone-c: LF1894-RIPE  
-nserver: dns.voipex.it  
-nserver: dns2.voipex.it  
+nserver: dns.istsupcti.it  
+nserver: dns2.istsupcti.it  
remarks: Ministero delle Comunicazioni - http://www.comunicazioni.it

% This query was served by the RIPE Database Query Service version 1.78 (DB-2)  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There isn't differences between revisions 3 and 4:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois -h whois.ripe.net -- &amp;quot;--diff-versions 3:4
9.3.e164.arpa&amp;quot;  
% This is the RIPE Database query service.  
% The objects are in RPSL format.  
%  
% The RIPE Database is subject to Terms and Conditions.  
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Difference between version 3 and 4 of object &amp;quot;9.3.e164.arpa&amp;quot;

% This query was served by the RIPE Database Query Service version 1.78 (DB-2)  
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;The Vatican long hand&lt;/h2&gt;
&lt;p&gt;WTF? Vatican ? Yes this is quite interesting: seems that someone at
Vatican city has something to do with the Italian golden tree:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois -h whois.ripe.net -- &amp;quot;-B 9.3.e164.arpa&amp;quot;  
% This is the RIPE Database query service.  
% The objects are in RPSL format.  
%  
% The RIPE Database is subject to Terms and Conditions.  
% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Information related to &amp;#39;9.3.e164.arpa&amp;#39;

domain: 9.3.e164.arpa  
descr: Italy ENUM Mapping  
descr: Italy ENUM Registry  
admin-c: LF1894-RIPE  
tech-c: LF1894-RIPE  
zone-c: LF1894-RIPE  
nserver: dns.istsupcti.it  
nserver: dns2.istsupcti.it  
remarks: Ministero delle Comunicazioni - http://www.comunicazioni.it  
remarks: Istituto Superiore delle Comunicazioni e delle tecnologie
dell&amp;#39;Informazione  
remarks: http://www.iscom.gov.it  
notify: pasquini@vatican.va  
mnt-by: ISCOM-MNT  
changed: pasquini@vatican.va 20060407  
source: RIPE

person: Luisa Franchina  
address: Viale America 201  
address: I-00144 Roma  
address: Italy  
phone: +39 06 54444267  
fax-no: +39 06 54444222  
e-mail: luisa.franchina@comunicazioni.it  
nic-hdl: LF1894-RIPE  
remarks: Ministero delle Comunicazioni  
remarks: Direttore Generale Istituto Superiore Comunicazioni  
notify: pasquini@vatican.va  
mnt-by: ISCOM-MNT  
changed: pasquini@vatican.va 20051031  
source: RIPE

% This query was served by the RIPE Database Query Service version 1.78 (DB-1)  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ok, maybe the reason can be that Vatican City actually shares the
Italian country code (+39) despite the fact that ITU-T allocated a
dedicated Vatican City one (+379).&lt;/p&gt;
&lt;p&gt;Just for the records: I sent an email to Pasquini@Vatican and Franchina
of  Communication Ministry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;At the moment of writing still no answers on my previous email...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[EDIT:] Today (6 March 2015) I received the permanent delivery failure
from my SMTP: comunicazioni.it doesn't has a working email system and my
email to the responsible person for the 9.3.e164.arpa cannot be
delivered. Still no answers on my other email.&lt;/p&gt;
&lt;h5&gt;... To be continued ...&lt;/h5&gt;</summary><category term="dns"></category><category term="ENUM"></category><category term="VoIP"></category></entry><entry><title>What happened to the +39 (Italy) ENUM DNS Zone ?</title><link href="https://www.bertera.it/what-happened-to-the-39-italy-enum-dns-zone.html" rel="alternate"></link><published>2015-02-25T16:38:00+01:00</published><updated>2015-02-25T16:38:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2015-02-25:what-happened-to-the-39-italy-enum-dns-zone.html</id><summary type="html">&lt;p&gt;&lt;a href="https://tools.ietf.org/html/rfc6116"&gt;ENUM&lt;/a&gt; is a DNS based algorithm
used to store data associated with E.164 numbers (aka global phone
numbers). Using ENUM you can associate your email or Skype or SIP
contact along with your phone number.&lt;/p&gt;
&lt;p&gt;So, registering your contacts in the ENUM tree you'll make yourself
reachable trough all the ways you published on the ENUM database:
someone needing to contact you will do an ENUM query against your E.164
phone number, the server will answer with all your contacts (email, SIP
URI, Web URL, Instant message, presence service, etc..).&lt;/p&gt;
&lt;h5&gt;ENUM implements a global, multiservice addressbook.&lt;/h5&gt;
&lt;h1&gt;How ENUM works?&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;As first you need to translate the phone number in the E.164 format
    (for example +39 338 1234567 for the Italian mobile number 338
    1234567)&lt;/li&gt;
&lt;li&gt;The E.164 number should reduced to numbers only (393381234567)&lt;/li&gt;
&lt;li&gt;All digits should reordered front-back (765432183393)&lt;/li&gt;
&lt;li&gt;Insert a dot between each digit (7.6.5.4.3.2.1.8.3.3.9.3)&lt;/li&gt;
&lt;li&gt;Add the suffix ".e164.arpa" at the end
    (7.6.5.4.3.2.1.8.3.3.9.3.e164.arpa)&lt;/li&gt;
&lt;li&gt;Send a DNS request for the obtained domain and look at the NAPTR
    record&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ENUM is globally managed trough a DNS hierarchy:
&lt;a href="https://tools.ietf.org/html/rfc6116#section-6"&gt;RFC6116&lt;/a&gt; states:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;   Names within this zone are to be delegated to parties consistent with
   ITU Recommendation E.164.  The names allocated should be hierarchic
   in accordance with ITU Recommendation E.164, and the codes should be
   assigned in accordance with that Recommendation.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This means that for example the +49 E.164 country code (Germany) is
managed by the German naming authority:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ dig +short NS 9.4.e164.arpa  
enum3.denic.de.  
enum1.denic.de.  
enum2.denic.de.  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A working example is the number +43 780 00471:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ dig +short 1.1.7.4.0.0.0.8.7.3.4.e164.arpa NAPTR  
100 10 &amp;quot;u&amp;quot; &amp;quot;E2U+web:http&amp;quot; &amp;quot;!\^.\*\$!http://q.nemox.net/!&amp;quot; .  
100 10 &amp;quot;u&amp;quot; &amp;quot;E2U+email:mailto&amp;quot; &amp;quot;!\^.\*\$!mailto:info@nemox.net!&amp;quot; .  
100 10 &amp;quot;u&amp;quot; &amp;quot;E2U+sip&amp;quot; &amp;quot;!\^.\*\$!sip:enum-test@sip.nemox.net!&amp;quot; .  
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;The 9.3.e164.arpa zone&lt;/h1&gt;
&lt;p&gt;The DNS manging the +39 country code seems not working:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ dig +short 9.3.e164.arpa ANY  
;; connection timed out; no servers could be reached  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Searching the nameserver managing this zone:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="nt"&gt;pietro&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="nt"&gt;dig&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;short&lt;/span&gt; &lt;span class="nt"&gt;e164&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arpa&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt;  
&lt;span class="nt"&gt;sec1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;apnic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;span class="nt"&gt;tinnie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;span class="nt"&gt;pri&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;authdns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;span class="nt"&gt;sec3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;apnic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;span class="nt"&gt;ns3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;span class="nt"&gt;sns-pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;isc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="nt"&gt;pietro&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="nt"&gt;dig&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;ns3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;fr&lt;/span&gt; &lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;e164&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arpa&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt;

&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;DiG&lt;/span&gt; &lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3-P1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;ns3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;fr&lt;/span&gt; &lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;e164&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arpa&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt;  
&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt; &lt;span class="nt"&gt;server&lt;/span&gt; &lt;span class="nt"&gt;found&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;  
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;global&lt;/span&gt; &lt;span class="nt"&gt;options&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nt"&gt;cmd&lt;/span&gt;  
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;Got&lt;/span&gt; &lt;span class="nt"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;-&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;HEADER&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;;;&lt;/span&gt; &lt;span class="nt"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;qr&lt;/span&gt; &lt;span class="nt"&gt;rd&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;QUERY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ANSWER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;AUTHORITY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nt"&gt;ADDITIONAL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;  
&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;recursion&lt;/span&gt; &lt;span class="nt"&gt;requested&lt;/span&gt; &lt;span class="nt"&gt;but&lt;/span&gt; &lt;span class="nt"&gt;not&lt;/span&gt; &lt;span class="nt"&gt;available&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;QUESTION&lt;/span&gt; &lt;span class="nt"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  
&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;e164&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arpa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;IN&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt;

&lt;span class="o"&gt;;;&lt;/span&gt; &lt;span class="nt"&gt;AUTHORITY&lt;/span&gt; &lt;span class="nt"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  
&lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;e164&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arpa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;172800&lt;/span&gt; &lt;span class="nt"&gt;IN&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt; &lt;span class="nt"&gt;dns2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;istsupcti&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;span class="nt"&gt;9&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;e164&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;arpa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;172800&lt;/span&gt; &lt;span class="nt"&gt;IN&lt;/span&gt; &lt;span class="nt"&gt;NS&lt;/span&gt; &lt;span class="nt"&gt;dns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;istsupcti&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The 9.3.e164.arpa is delegated to dns2.istsupcti.it and
dns.istsupcti.it, no one of them seems working:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ dig @dns2.istsupcti.it ANY

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.8.3-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @dns2.istsupcti.it ANY  
; (1 server found)  
;; global options: +cmd  
;; connection timed out; no servers could be reached  
~ pietro$ dig @dns.istsupcti.it ANY

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.8.3-P1 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @dns.istsupcti.it ANY  
; (1 server found)  
;; global options: +cmd  
;; connection timed out; no servers could be reached  
&lt;/pre&gt;&lt;/div&gt;


&lt;h5&gt;&lt;strong&gt;Ok, ENUM is totally broken in Italy.&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Let me dig a bit more:&lt;/p&gt;
&lt;p&gt;Who is istsupcti.it (seems not have even a working web site)?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;~ pietro$ whois istsupcti.it

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*  
\* Please note that the following result could be a subgroup of \*  
\* the data contained in the database. \*  
\* \*  
\* Additional information can be visualized at: \*  
\* http://www.nic.it/cgi-bin/Whois/whois.cgi \*  

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

Domain: istsupcti.it  
Status: ok  
Created: 1998-12-23 00:00:00  
Last Update: 2015-02-24 00:54:36  
Expire Date: 2016-02-08

Registrant  
Organization: Istituto Superiore delle Comunicazioni e delle Tecnologie
dell&amp;#39;Informazione  
Address: Viale America, 201  
Roma  
00144  
RM  
IT  
Created: 2008-02-08 12:11:24  
Last Update: 2012-07-16 16:14:51

Admin Contact  
Name: Claudia Passaro  
Organization: Istituto Superiore delle Comunicazioni e delle Tecnologie
dell&amp;#39;Informazione  
Address: Viale America, 201  
Roma  
00144  
RM  
IT  
Created: 2012-07-16 14:30:02  
Last Update: 2012-07-16 16:13:49

Technical Contacts  
Name: Gestione Domini  
Address: Via Caracciolo, 51  
MILANO  
20155  
MI  
IT  
Created: 2005-07-07 00:00:00  
Last Update: 2014-06-20 14:07:55

Registrar  
Organization: Fastweb s.p.a.  
Name: FASTWEB-REG

Nameservers  
dns1.fweds-spc.it  
dns2.fweds-spc.it  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="http://lmgtfy.com/?q=Istituto+Superiore+delle+Comunicazioni+e+delle+Tecnologie+dell%27Informazione"&gt;Googling&lt;/a&gt;
for "Istituto Superiore delle Comunicazioni e delle Tecnologie
dell'Informazione" I found the &lt;a href="http://www.isticom.it/"&gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;10 years of testing&lt;/h1&gt;
&lt;p&gt;Searching on the RIPE archive I found the &lt;a href="https://www.ripe.net/ripe/mail/archives/enum-announce/2005-October/000046.html"&gt;delegation
request&lt;/a&gt;
for the +39 ENUM prefix: it was in October 2005: Almost ten years ago!
The request comes from the Voipex consortium (from the
&lt;a href="http://www.voipex.it/"&gt;website&lt;/a&gt; it looks more or less died now).&lt;/p&gt;
&lt;p&gt;Digging on the Internet you can find
&lt;a href="http://www.voipblog.it/enum-e-regolamentazione-voip-281.html"&gt;some&lt;/a&gt; old
&lt;a href="http://punto-informatico.it/1440878/Telefonia/News/enum-piu-vicina-vera-telefonia-ip.aspx"&gt;posts&lt;/a&gt;
saying that we entered in a test phase for the ENUM introduction.&lt;/p&gt;
&lt;p&gt;Searching on the AGCOM (The Italian Communications Authority) website
you can see some &lt;a href="http://www.agcom.it/risultati?q=enum"&gt;documents&lt;/a&gt;
mentioning ENUM as a maybe/future technology to adopt.&lt;/p&gt;
&lt;p&gt;The result at the moment is that after 10 years of testing, a consortium
foundation, various ISP involved, ENUM isn't working at all and we
cannot find test results, adoptions guidelines nor regulation rules.&lt;/p&gt;
&lt;h5&gt;Just for the taxpayers happiness!&lt;/h5&gt;
&lt;p&gt;I just sent an email to urp.comunicazioni@mise.gov.it
("Istituto Superiore delle Comunicazioni e delle Tecnologie
dell'Informazione" &lt;a href="http://www.isticom.it/index.php/contatti"&gt;PR
office&lt;/a&gt; ), I tried to send an
email to AGCOM too but I crashed against this message:&lt;/p&gt;
&lt;p&gt;&lt;img alt="agcom" src="https://www.bertera.it/agcom-300x170.png" /&gt;]&lt;/p&gt;
&lt;p&gt;If you have any information about ENUM in Italy, feel free to
&lt;a href="http://www.bertera.it/index.php/contacts/"&gt;contact&lt;/a&gt; me.&lt;/p&gt;
&lt;h5&gt;to be continued ...&lt;/h5&gt;</summary><category term="ENUM"></category><category term="Italy"></category><category term="VoIP"></category></entry><entry><title>SIP packets filtering with iptables</title><link href="https://www.bertera.it/sip-packet-filtering-with-iptables.html" rel="alternate"></link><published>2014-01-22T23:50:00+01:00</published><updated>2014-01-22T23:50:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2014-01-22:sip-packet-filtering-with-iptables.html</id><summary type="html">&lt;p&gt;One of the most powerful &lt;a href="http://www.netfilter.org"&gt;iptables&lt;/a&gt; match is
the &lt;a href="http://www.netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html#ss3.21"&gt;u32
module&lt;/a&gt;.&lt;br /&gt;
Using the u32 match you are able to write a firewall rule matching
against a single bit of a network packet.&lt;/p&gt;
&lt;p&gt;If you wanna play with u32 module you have to be prepared to deal with a syntax very far away from the user friendliness: you have to fight
with commands like the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;iptables -I OUTPUT &lt;span class="m"&gt;1&lt;/span&gt; -p udp  &lt;span class="se"&gt;\!&lt;/span&gt; -f -m u32 --u32 &lt;span class="m"&gt;0&lt;/span&gt;&amp;gt;&amp;gt;22&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;0x3C@8&lt;span class="o"&gt;=&lt;/span&gt;0x494e5649&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&amp;gt;&amp;gt;22&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;0x3C@12&lt;span class="o"&gt;=&lt;/span&gt;0x54452073&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&amp;gt;&amp;gt;22&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;0x3C@16&lt;span class="o"&gt;=&lt;/span&gt;0x69703a33&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&amp;gt;&amp;gt;22&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;0x3C@20&lt;span class="o"&gt;=&lt;/span&gt;0x33383132&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&amp;gt;&amp;gt;22&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;0x3C@24&lt;span class="o"&gt;=&lt;/span&gt;0x33343536&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&amp;gt;&amp;gt;22&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;0x3C@28&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;0xFF000000&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0x37000000 -j LOG --log-prefix &lt;span class="s2"&gt;&amp;quot;--call-to-3381234567 &amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;More over checking contents in variable positions can be very difficult: you need to know the exact data position into the network frame.&lt;/p&gt;
&lt;p&gt;Keeping that in mind you can write your rules.&lt;/p&gt;
&lt;p&gt;Writing matching rules against SIP methods, SIP URI or response code is
feasible: the IP header comes with a fixed size (this isn't really true,
but you can workaround it) and the UDP header too has a fixed size.&lt;/p&gt;
&lt;p&gt;For example this rule logs all the outgoing SIP INVITE to
&lt;strong&gt;sip:3381234567&lt;/strong&gt;:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;bradbury&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;iptables&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;udp&lt;/span&gt;  &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;u32&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;u32&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="mi"&gt;@8&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x494e5649&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="mi"&gt;@12&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x54452073&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="mi"&gt;@16&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x69703a33&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="mi"&gt;@20&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x33383132&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="mi"&gt;@24&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x33343536&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="mi"&gt;@28&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFF000000&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0x37000000&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here you can see the network traffic (look at the hex data matching the iptables rule):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;root&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;bradbury&lt;/span&gt; &lt;span class="o"&gt;~]&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nt"&gt;tcpdump&lt;/span&gt; &lt;span class="nt"&gt;-nn&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;br0&lt;/span&gt; &lt;span class="nt"&gt;-XX&lt;/span&gt; &lt;span class="nt"&gt;udp&lt;/span&gt; &lt;span class="nt"&gt;and&lt;/span&gt; &lt;span class="nt"&gt;port&lt;/span&gt; &lt;span class="nt"&gt;5060&lt;/span&gt; &lt;span class="nt"&gt;and&lt;/span&gt; &lt;span class="nt"&gt;host&lt;/span&gt; &lt;span class="nt"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxxxxxxxxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xx&lt;/span&gt;

&lt;span class="nt"&gt;tcpdump&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;verbose&lt;/span&gt; &lt;span class="nt"&gt;output&lt;/span&gt; &lt;span class="nt"&gt;suppressed&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;use&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;or&lt;/span&gt; &lt;span class="nt"&gt;-vv&lt;/span&gt; &lt;span class="nt"&gt;for&lt;/span&gt; &lt;span class="nt"&gt;full&lt;/span&gt; &lt;span class="nt"&gt;protocol&lt;/span&gt; &lt;span class="nt"&gt;decode&lt;/span&gt; &lt;span class="nt"&gt;listening&lt;/span&gt; &lt;span class="nt"&gt;on&lt;/span&gt; &lt;span class="nt"&gt;br0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;link-type&lt;/span&gt; &lt;span class="nt"&gt;EN10MB&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;Ethernet&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nt"&gt;capture&lt;/span&gt; &lt;span class="nt"&gt;size&lt;/span&gt; &lt;span class="nt"&gt;65535&lt;/span&gt; &lt;span class="nt"&gt;bytes&lt;/span&gt;

&lt;span class="nt"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;29&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;362185&lt;/span&gt; &lt;span class="nt"&gt;IP&lt;/span&gt; &lt;span class="nt"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5060&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;5060&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;SIP&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;length&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;965&lt;/span&gt;
&lt;span class="nt"&gt;0x0000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;001f&lt;/span&gt; &lt;span class="nt"&gt;1249&lt;/span&gt; &lt;span class="nt"&gt;0acc&lt;/span&gt; &lt;span class="nt"&gt;5254&lt;/span&gt; &lt;span class="nt"&gt;00e7&lt;/span&gt; &lt;span class="nt"&gt;8e30&lt;/span&gt; &lt;span class="nt"&gt;0800&lt;/span&gt; &lt;span class="nt"&gt;45a0&lt;/span&gt;  &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;I&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RT&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;E&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="nt"&gt;0x0010&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;03e1&lt;/span&gt; &lt;span class="nt"&gt;0000&lt;/span&gt; &lt;span class="nt"&gt;4000&lt;/span&gt; &lt;span class="nt"&gt;4011&lt;/span&gt; &lt;span class="nt"&gt;01dd&lt;/span&gt; &lt;span class="nt"&gt;511d&lt;/span&gt; &lt;span class="nt"&gt;d3c4&lt;/span&gt; &lt;span class="nt"&gt;d461&lt;/span&gt;  &lt;span class="o"&gt;....@.@..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Q&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;a&lt;/span&gt;
&lt;span class="nt"&gt;0x0020&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;3b4c&lt;/span&gt; &lt;span class="nt"&gt;13c4&lt;/span&gt; &lt;span class="nt"&gt;13c4&lt;/span&gt; &lt;span class="nt"&gt;03cd&lt;/span&gt; &lt;span class="nt"&gt;386e&lt;/span&gt; &lt;span class="nt"&gt;494e&lt;/span&gt; &lt;span class="nt"&gt;5649&lt;/span&gt; &lt;span class="nt"&gt;5445&lt;/span&gt;  &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;L&lt;/span&gt;&lt;span class="o"&gt;.....&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;8nINVITE&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="nt"&gt;HERE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;look&lt;/span&gt; &lt;span class="nt"&gt;at&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;494e&lt;/span&gt; &lt;span class="nt"&gt;5649&lt;/span&gt; &lt;span class="nt"&gt;5445&lt;/span&gt; &lt;span class="nt"&gt;matching&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;INVITE&amp;#39;&lt;/span&gt;
&lt;span class="nt"&gt;0x0030&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;2073&lt;/span&gt; &lt;span class="nt"&gt;6970&lt;/span&gt; &lt;span class="nt"&gt;3a33&lt;/span&gt; &lt;span class="nt"&gt;3338&lt;/span&gt; &lt;span class="nt"&gt;3132&lt;/span&gt; &lt;span class="nt"&gt;3334&lt;/span&gt; &lt;span class="nt"&gt;3536&lt;/span&gt; &lt;span class="nt"&gt;3740&lt;/span&gt;  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;3381234567&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="nt"&gt;HERE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;look&lt;/span&gt; &lt;span class="nt"&gt;at&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;SIP&lt;/span&gt; &lt;span class="nt"&gt;URI&lt;/span&gt;
&lt;span class="nt"&gt;0x0040&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;7878&lt;/span&gt; &lt;span class="nt"&gt;782e&lt;/span&gt; &lt;span class="nt"&gt;7878&lt;/span&gt; &lt;span class="nt"&gt;7878&lt;/span&gt; &lt;span class="nt"&gt;7878&lt;/span&gt; &lt;span class="nt"&gt;7878&lt;/span&gt; &lt;span class="nt"&gt;7878&lt;/span&gt; &lt;span class="nt"&gt;2e78&lt;/span&gt;  &lt;span class="nt"&gt;xxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xxxxxxxxxx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;x&lt;/span&gt;
&lt;span class="nt"&gt;0x0050&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nt"&gt;783b&lt;/span&gt; &lt;span class="nt"&gt;7573&lt;/span&gt; &lt;span class="nt"&gt;6572&lt;/span&gt; &lt;span class="nt"&gt;3d70&lt;/span&gt; &lt;span class="nt"&gt;686f&lt;/span&gt; &lt;span class="nt"&gt;6e65&lt;/span&gt; &lt;span class="nt"&gt;2053&lt;/span&gt; &lt;span class="nt"&gt;4950&lt;/span&gt;  &lt;span class="nt"&gt;x&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SIP&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Messages are logged (the first one is the INVITE without the
authentication data):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[root@bradbury ~]# tail -f /var/log/messages
Jan 22 23:00:28 bradbury kernel: --call-to-3381234567IN= OUT=br0 SRC=xxx.xxx.xxx.xxx DST=xxx.xxx.xxx.xxx LEN=993 TOS=0x00 PREC=0xA0 TTL=64 ID=0 DF PROTO=UDP SPT=5060 DPT=5060 LEN=973
Jan 22 23:00:28 bradbury kernel: --call-to-3381234567IN= OUT=br0 SRC=xxx.xxx.xxx.xxx DST=xxx.xxx.xxx.xxx LEN=1285 TOS=0x00 PREC=0xA0 TTL=64 ID=0 DF PROTO=UDP SPT=5060 DPT=5060 LEN=1265
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can write your rules in a more simple way using my&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pbertera/scripts/blob/master/iptables-SIPu32.py"&gt;iptables-SIPu32.py python script&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;iptables -I OUTPUT 1 -p udp  \! -f -m u32 --u32 $(./iptables-SIPu32.py &amp;quot;INVITE sip:3381234567&amp;quot;) -j LOG --log-prefix &amp;quot;-j LOG --log-prefix &amp;quot;--call-to-3381234567 &amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Please note that this script can works with every kind of UDP payload.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; now the script supports TCP too&lt;/p&gt;</summary><category term="iptables"></category><category term="netfilter"></category><category term="python"></category><category term="sip"></category></entry><entry><title>Using special chars in Python string Templates</title><link href="https://www.bertera.it/using-special-chars-in-python-string-templates.html" rel="alternate"></link><published>2013-06-05T21:55:00+02:00</published><updated>2013-06-05T21:55:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2013-06-05:using-special-chars-in-python-string-templates.html</id><summary type="html">&lt;p&gt;&lt;a href="http://www.python.org/dev/peps/pep-0292"&gt;PEP-292&lt;/a&gt; introduced a nice
Python templating feature.&lt;br /&gt;
Templates placehoder names are subject to some
restrictions,&lt;a href="http://docs.python.org/3/library/string.html#template-strings"&gt;Documentation&lt;/a&gt;
says:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$identifier names a substitution placeholder matching a mapping key of &amp;quot;identifier&amp;quot;.
By default, &amp;quot;identifier&amp;quot; must spell a Python identifier.
The first non-identifier character after the $ character terminates this placeholder specification.
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This means that &lt;strong&gt;\${placeholder}&lt;/strong&gt; names must spell the Python
identifier syntax: dots (.), hyphen (-) or other special chars are not
allowed.&lt;br /&gt;
The default regex that must match the placeolder is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;r&amp;#39;[\_a-z][\_a-z0-9]\*&amp;#39;  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can simply extend this regex overwriting the &lt;strong&gt;idpattern&lt;/strong&gt; property
in &lt;strong&gt;Template&lt;/strong&gt; class.&lt;/p&gt;
&lt;p&gt;Here a quick example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;string&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Template&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Template&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="n"&gt;idpattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[a-z][\.\-_a-z0-9]*&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MyTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a=${ciccio_pippo-b}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substitute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ciccio_pippo-b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pasticcio&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;a=pasticcio&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; 
&lt;/pre&gt;&lt;/div&gt;</summary><category term="coding"></category><category term="python"></category><category term="strings"></category><category term="templating"></category></entry><entry><title>UAS Authenticating registrar SIPp scenario</title><link href="https://www.bertera.it/uas-authenticating-registrar-sipp-scenario.html" rel="alternate"></link><published>2013-05-30T16:42:00+02:00</published><updated>2013-05-30T16:42:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2013-05-30:uas-authenticating-registrar-sipp-scenario.html</id><summary type="html">&lt;p&gt;&lt;a href="http://sipp.sourceforge.net"&gt;SIPp&lt;/a&gt; is a real SIP swiss army knife. You
can create various SIP scenario and test your devices and environments.&lt;/p&gt;
&lt;p&gt;I never found a SIPp scenario implementing an UAs (User Agent server)
registrar with authentication.&lt;/p&gt;
&lt;p&gt;Following you can find this scenario:&lt;/p&gt;
&lt;p&gt;The SIPp XML scenario file: &lt;strong&gt;sipp_register_auth_uas.xml&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot; ?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE scenario SYSTEM &amp;quot;sipp.dtd&amp;quot;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;scenario&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Basic UAS registrar with authentication&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;badauth&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt; 
&lt;span class="nt"&gt;&amp;lt;recv&lt;/span&gt; &lt;span class="na"&gt;request=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;REGISTER&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;send&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class="cp"&gt;      SIP/2.0 401 Authorization Required&lt;/span&gt;
&lt;span class="cp"&gt;      [last_Via:]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_From:]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_To:];tag=[pid]SIPpTag01[call_number]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_Call-ID:]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_CSeq:]&lt;/span&gt;
&lt;span class="cp"&gt;      Contact: &amp;lt;sip:[local_ip]:[local_port];transport=[transport]&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;      WWW-Authenticate: Digest realm=&amp;quot;test.example.com&amp;quot;, nonce=&amp;quot;47ebe028cda119c35d4877b383027d28da013815&amp;quot;&lt;/span&gt;
&lt;span class="cp"&gt;      Content-Length: [len]&lt;/span&gt;

&lt;span class="cp"&gt;    ]]&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/send&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;recv&lt;/span&gt; &lt;span class="na"&gt;request=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;REGISTER&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;action&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;ereg&lt;/span&gt; &lt;span class="na"&gt;regexp=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Digest .*username=\&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;([^\&amp;quot;]*)\&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;search_in=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;hdr&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;header=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Authorization:&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;assign_to=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;junk,username&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;lookup&lt;/span&gt; &lt;span class="na"&gt;assign_to=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;line&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;file=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;users.csv&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;[$username]&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;assign&lt;/span&gt; &lt;span class="na"&gt;assign_to=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;junk&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;log&lt;/span&gt; &lt;span class="na"&gt;message=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Received REGISTER from user -[$username]-&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;log&lt;/span&gt; &lt;span class="na"&gt;message=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;searching in file at line [$line]: Username: [field0 line=\&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;[$line]\&amp;quot;]&lt;/span&gt; &lt;span class="err"&gt;Pass:&lt;/span&gt; &lt;span class="err"&gt;[field1&lt;/span&gt; &lt;span class="na"&gt;line=&lt;/span&gt;&lt;span class="s"&gt;\&amp;quot;[$line]\&amp;quot;]&amp;quot;/&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;verifyauth&lt;/span&gt; &lt;span class="na"&gt;assign_to=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;authvalid&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;username=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;[field0 line=\&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;[$line]\&amp;quot;]&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;password=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;[field1 line=\&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;[$line]\&amp;quot;]&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/action&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/recv&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;nop&lt;/span&gt; &lt;span class="na"&gt;hide=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;test=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;authvalid&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;next=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;goodauth&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;nop&lt;/span&gt; &lt;span class="na"&gt;hide=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;next=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;badauth&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;goodauth&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;send&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;![CDATA[&lt;/span&gt;

&lt;span class="cp"&gt;      SIP/2.0 200 OK&lt;/span&gt;
&lt;span class="cp"&gt;      [last_Via:]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_From:]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_To:];tag=[call_number]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_Call-ID:]&lt;/span&gt;
&lt;span class="cp"&gt;      [last_CSeq:]&lt;/span&gt;
&lt;span class="cp"&gt;      Contact: &amp;lt;sip:[local_ip]:[local_port];transport=[transport]&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;      Content-Length: 0&lt;/span&gt;
&lt;span class="cp"&gt;      Expires: 3600&lt;/span&gt;

&lt;span class="cp"&gt;    ]]&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/send&amp;gt;&lt;/span&gt;


  &lt;span class="c"&gt;&amp;lt;!-- definition of the response time repartition table (unit is ms)   --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ResponseTimeRepartition&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;10, 20, 30, 40, 50, 100, 150, 200&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- definition of the call length repartition table (unit is ms)     --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;CallLengthRepartition&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;10, 50, 100, 500, 1000, 5000, 10000&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/scenario&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here the users file: a CSV containing users and password (first column
is the username, second column the password). &lt;strong&gt;users.csv&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;USERS  
pippero;1234  
pippo;1234  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you can run your scenario putting users.csv and
sipp_register_auth_uas.xml in the same directory, and running SIPp
inside the directory (SIPp handle in a stupid manned direcotories..):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sipp -sf sipp_register_auth_uas.xml -inf users.csv -infindex users.csv 0 -log_file sipp_register_auth_uas.log -trace_logs  
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And you will see an output like this:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;------------------------------ Scenario Screen -------- [1-9]: Change Screen --
  Port   Total-time  Total-calls  Transport
  5060       4.00 s            0  UDP

  0 new calls during 1.001 s period      1 ms scheduler resolution
  0 calls                                Peak was 0 calls, after 0 s
  0 Running, 1 Paused, 3 Woken up
  0 dead call msg (discarded)          
  3 open sockets                        

                                 Messages  Retrans   Timeout   Unexpected-Msg
  ----------&amp;gt; REGISTER           0         0         0         0        
  &amp;lt;---------- 401                0         0                            
  ----------&amp;gt; REGISTER           0         0         0         0        
  &amp;lt;---------- 200                0         0                            
------------------------------ Sipp Server Mode -------------------------------
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you can register your device configuring the registrar address and
credentials, when your device will send the REGISTER request you will
the message flow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;------------------------------ Scenario Screen -------- [1-9]: Change Screen --
  Port   Total-time  Total-calls  Transport
  5060     161.28 s            1  UDP

  0 new calls during 1.001 s period      1 ms scheduler resolution
  0 calls                                Peak was 1 calls, after 157 s
  0 Running, 2 Paused, 4 Woken up
  0 dead call msg (discarded)          
  3 open sockets                        

                                 Messages  Retrans   Timeout   Unexpected-Msg
  ----------&amp;gt; REGISTER           1         0         0         0        
  &amp;lt;---------- 401                1         0                            
  ----------&amp;gt; REGISTER           1         0         0         0        
  &amp;lt;---------- 200                1         0                            
------------------------------ Sipp Server Mode -------------------------------
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Log messages will be saved in &lt;strong&gt;sipp_register_auth_uas.log&lt;/strong&gt;.&lt;br /&gt;
Please note that the &lt;strong&gt;verifyauth&lt;/strong&gt; needs the OpenSSL support.&lt;/p&gt;</summary><category term="sip"></category><category term="SIPp"></category><category term="Testing"></category><category term="VoIP"></category></entry><entry><title>Ability to set codec in MulticastRTP Asterisk channels</title><link href="https://www.bertera.it/ability-to-set-codec-in-multicastrtp-asterisk-channels.html" rel="alternate"></link><published>2012-12-12T21:08:00+01:00</published><updated>2012-12-12T21:08:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-12-12:ability-to-set-codec-in-multicastrtp-asterisk-channels.html</id><summary type="html">&lt;p&gt;&lt;a href="https://www.bertera.it/asterisk_trunk-377802_rtp_multicast_codec.patch"&gt;Here&lt;/a&gt;
you can find a port for Asterisk trunk (rev. 377802) of this patch:
&lt;a href="http://lists.digium.com/pipermail/asterisk-dev/2011-September/051262.html"&gt;http://lists.digium.com/pipermail/asterisk-dev/2011-September/051262.html&lt;/a&gt;.&lt;br /&gt;
This patch permits to set the codec of an outgoing multicast RTP stream
via the variable MULTICAST_RTP_CODEC:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;exten =&amp;gt; 999,1,Answer()  
exten =&amp;gt; 999,n,Set(MULTICAST_RTP_CODEC=alaw)  
exten =&amp;gt; 999,n,Dial(MulticastRTP/basic/239.255.255.245:5555,,A(/var/lib/asterisk/moh/mymoh))
&lt;/pre&gt;&lt;/div&gt;</summary><category term="asterisk"></category><category term="c"></category><category term="code"></category><category term="patch"></category><category term="rtp"></category><category term="VoIP"></category></entry><entry><title>RTP timestamps fix in Asterisk MulticastRTP channels</title><link href="https://www.bertera.it/rtp-timestamps-fix-in-asterisk-multicastrtp-channels.html" rel="alternate"></link><published>2012-12-12T19:09:00+01:00</published><updated>2012-12-12T19:09:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-12-12:rtp-timestamps-fix-in-asterisk-multicastrtp-channels.html</id><summary type="html">&lt;p&gt;Starting from Asterisk 1.8 you can &lt;a href="http://www.voip-info.org/wiki/view/Asterisk+MulticastRTP+channels"&gt;send multicast rtp
streams&lt;/a&gt;
using the MulticastRTP channel driver. There is an &lt;a href="https://issues.asterisk.org/jira/browse/ASTERISK-19883"&gt;open
issue&lt;/a&gt; that
breaks outgoing RTP if the source channel doesn't contains timing
informations (Eg. playing an audio file with
&lt;strong&gt;Dial(MulticastRTP/basic/239.255.255.245:5555,,A(my-announce))&lt;/strong&gt;).&lt;br /&gt;
All outgoing RTP frames a timestamp value of 0.&lt;/p&gt;
&lt;p&gt;This &lt;a href="https://www.bertera.it/asterisk_trunk-377802-rtp-multicast-timestamp.patch"&gt;patch&lt;/a&gt; adds timing information in outgoing RTP stream.&lt;/p&gt;
&lt;p&gt;Following an example usage in dialplan:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;exten =&amp;gt; 999,1,Answer()  
exten =&amp;gt; 999,n,Dial(MulticastRTP/basic/239.255.255.245:5555,,A(/var/lib/asterisk/moh/mymoh))
&lt;/pre&gt;&lt;/div&gt;</summary><category term="asterisk"></category><category term="c"></category><category term="multicast"></category><category term="patch"></category><category term="rtp"></category><category term="VoIP"></category></entry><entry><title>Encoding and decoding Encapsulated DHCP options (RFC 2132)</title><link href="https://www.bertera.it/encoding-and-decoding-encapsulated-dhcp-options-rfc-2132.html" rel="alternate"></link><published>2012-10-19T10:38:00+02:00</published><updated>2012-10-19T10:38:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-10-19:encoding-and-decoding-encapsulated-dhcp-options-rfc-2132.html</id><summary type="html">&lt;p&gt;Vendor specific DHCP options may be provided encapsulated in DHCP option
43.&lt;br /&gt;
With &lt;a href="https://github.com/pbertera/junk/tree/master/dhcp-encapsulated-options"&gt;this little script&lt;/a&gt; you
can encode and decode vendor encapsulated option according to &lt;a href="http://www.ietf.org/rfc/rfc2132.txt"&gt;RFC
2132&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example with this command you can tunnel options 66 (TFTP Server),
67 (TFTP Path), 132 (VLAN ID) and 133 (VLAN QOS):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ./dhcp-encapsulated-options.py encode &lt;span class="m"&gt;66&lt;/span&gt; http://provisionig.example.com &lt;span class="m"&gt;67&lt;/span&gt; settings.xml &lt;span class="m"&gt;132&lt;/span&gt; &lt;span class="m"&gt;33&lt;/span&gt; &lt;span class="m"&gt;133&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;
Encoding part &lt;span class="m"&gt;1&lt;/span&gt;: http://provisionig.example.com
 Option ID: &lt;span class="m"&gt;66&lt;/span&gt;
 Option length: &lt;span class="m"&gt;30&lt;/span&gt;
 Encoded Option part: &lt;span class="m"&gt;42&lt;/span&gt;:1E:68:74:74:70:3A:2F:2F:70:72:6F:76:69:73:69:6F:6E:69:67:2E:65:78:61:6D:70:6C:65:2E:63:6F:6D

Encoding part &lt;span class="m"&gt;2&lt;/span&gt;: settings.xml
 Option ID: &lt;span class="m"&gt;67&lt;/span&gt;
 Option length: &lt;span class="m"&gt;12&lt;/span&gt;
 Encoded Option part: &lt;span class="m"&gt;43&lt;/span&gt;:0C:73:65:74:74:69:6E:67:73:2E:78:6D:6C

Encoding part &lt;span class="m"&gt;3&lt;/span&gt;: &lt;span class="m"&gt;33&lt;/span&gt;
 Option ID: &lt;span class="m"&gt;132&lt;/span&gt;
 Option length: &lt;span class="m"&gt;2&lt;/span&gt;
 Encoded Option part: &lt;span class="m"&gt;84&lt;/span&gt;:02:33:33

Encoding part &lt;span class="m"&gt;4&lt;/span&gt;: &lt;span class="m"&gt;6&lt;/span&gt;
 Option ID: &lt;span class="m"&gt;133&lt;/span&gt;
 Option length: &lt;span class="m"&gt;1&lt;/span&gt;
 Encoded Option part: &lt;span class="m"&gt;85&lt;/span&gt;:01:36

Full encoded options: &lt;span class="m"&gt;42&lt;/span&gt;:1E:68:74:74:70:3A:2F:2F:70:72:6F:76:69:73:69:6F:6E:69:67:2E:65:78:61:6D:70:6C:65:2E:63:6F:6D:43:0C:73:65:74:74:69:6E:67:73:2E:78:6D:6C:84:02:33:33:85:01:36
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And then you can add the encoded options in you dhcpd config file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt; &lt;span class="nt"&gt;device&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;labo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;local&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="err"&gt;hardware&lt;/span&gt; &lt;span class="err"&gt;ethernet&lt;/span&gt; &lt;span class="err"&gt;01:04:23:3&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="err"&gt;fixed-address&lt;/span&gt; &lt;span class="err"&gt;172.16.18.30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="err"&gt;option&lt;/span&gt; &lt;span class="err"&gt;vendor-encapsulated-options&lt;/span&gt;
    &lt;span class="err"&gt;42:1&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And viceversa you can decode an encapsulated option:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ./dhcp-encapsulated-options.py decode &lt;span class="m"&gt;42&lt;/span&gt;:1E:68:74:74:70:3A:2F:2F:70:72:6F:76:69:73:69:6F:6E:69:67:2E:65:78:61:6D:70:6C:65:2E:63:6F:6D:43:0C:73:65:74:74:69:6E:67:73:2E:78:6D:6C
Decoding part &lt;span class="m"&gt;1&lt;/span&gt;: &lt;span class="m"&gt;42&lt;/span&gt;:1E:68:74:74:70:3A:2F:2F:70:72:6F:76:69:73:69:6F:6E:69:67:2E:65:78:61:6D:70:6C:65:2E:63:6F:6D
 Option ID: &lt;span class="m"&gt;66&lt;/span&gt;
 Option lenght: &lt;span class="m"&gt;30&lt;/span&gt;
 Option value: &lt;span class="s2"&gt;&amp;quot;http://provisionig.example.com&amp;quot;&lt;/span&gt;

Decoding part &lt;span class="m"&gt;2&lt;/span&gt;: &lt;span class="m"&gt;43&lt;/span&gt;:0C:73:65:74:74:69:6E:67:73:2E:78:6D:6C
 Option ID: &lt;span class="m"&gt;67&lt;/span&gt;
 Option lenght: &lt;span class="m"&gt;12&lt;/span&gt;
 Option value: &lt;span class="s2"&gt;&amp;quot;settings.xml&amp;quot;&lt;/span&gt;

End of encoded options
&lt;/pre&gt;&lt;/div&gt;</summary><category term="decoding"></category><category term="dhcp"></category><category term="encapsulated options"></category><category term="encoding"></category><category term="python"></category><category term="rfc2132"></category></entry><entry><title>Asterisk callback from a failed blind transfer</title><link href="https://www.bertera.it/asterisk-callback-from-a-failed-blind-transfer.html" rel="alternate"></link><published>2012-10-07T15:34:00+02:00</published><updated>2012-10-07T15:34:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-10-07:asterisk-callback-from-a-failed-blind-transfer.html</id><summary type="html">&lt;p&gt;This little piece of extensions.conf implements a callback from a failed
transfer (attendant and unattendant/bind)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;exten =&amp;gt; _1XX,1,Dial(SIP/&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;EXTEN&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;,20,tT)
exten =&amp;gt; _1XX,n,GotoIf($[ &amp;quot;a&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;BLINDTRANSFER&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;&amp;quot; = &amp;quot;a&amp;quot; ]?TransferFailed)
exten =&amp;gt; _1XX,n,Set(CALLER=&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BLINDTRANSFER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;);
exten =&amp;gt; _1XX,n,Goto(CallBack)
exten =&amp;gt; _1XX,n(TransferFailed),GotoIf($[ &amp;quot;a&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;TRANSFERERNAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;&amp;quot; = &amp;quot;a&amp;quot; ]?Fail)
exten =&amp;gt; _1XX,n,Set(CALLER=&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CUT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TRANSFERERNAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;);
exten =&amp;gt; _1XX,n(CallBack),Set(CALLERID(all)=&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;EXTEN&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CALLERID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;&amp;gt;)
exten =&amp;gt; _1XX,n,Dial(&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CALLER&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;,,tT)
exten =&amp;gt; _1XX,n(Fail),Hangup()
&lt;/pre&gt;&lt;/div&gt;</summary><category term="asterisk"></category><category term="sip"></category><category term="VoIP"></category></entry><entry><title>vtiger CRM: Howto add products commissions in invoice</title><link href="https://www.bertera.it/vtiger-crm-howto-add-products-commissions-in-invoice.html" rel="alternate"></link><published>2012-09-27T13:27:00+02:00</published><updated>2012-09-27T13:27:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-09-27:vtiger-crm-howto-add-products-commissions-in-invoice.html</id><summary type="html">&lt;p&gt;During last days I played with &lt;a href="https://www.vtiger.com"&gt;vtiger&lt;/a&gt;: a very
customizable and feature rich PHP/MySQL CRM. Sincerely this task has
revived my intimate &lt;a href="http://www.google.com/search?q=php+sucks"&gt;hate&lt;/a&gt; for
PHP programming language.&lt;/p&gt;
&lt;p&gt;This is the idea: add a function hook in vtiger workflow every time that
an invoice is created or edited. This function must take care to update
invoice commission based on products commissions rates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First step: Create the hook function:&lt;/strong&gt;&lt;br /&gt;
Create a new file  under "include" folder: &lt;code&gt;vim include/CommissionHandler.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Following the content of this file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;   
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;updateCommission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$entity&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;   
  &lt;span class="nx"&gt;global&lt;/span&gt; &lt;span class="nx"&gt;$log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
  &lt;span class="nx"&gt;$entityArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;get_object_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$entity&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       
  &lt;span class="nx"&gt;$invoice_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;vtws_getIdComponents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$entity&lt;/span&gt;&lt;span class="o"&gt;-----&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;getId&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;$invoice_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$invoice_id&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nx"&gt;$log&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Entering into function updateRebate(&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$invoice_id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;).&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;$products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;pquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SELECT productid, quantity from vtiger_inventoryproductrel WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$invoice_id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;$numrows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;num_rows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;$rebate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;$index&lt;/span&gt; &lt;span class="nx"&gt;query_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;productid&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;$quantity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;query_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quantity&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;$commission_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;pquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SELECT unit_price, commissionrate from vtiger_products WHERE productid=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$productid&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="nx"&gt;$commission_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;query_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$commission_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;commissionrate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;$price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;query_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$commission_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;unit_price&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;$rebate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$rebate&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$quantity&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;$commission_rate&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;$adb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;pquery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;UPDATE vtiger_invoice SET salescommission=$rebate WHERE invoiceid=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$invoice_id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Second Step: register the hook  &lt;/p&gt;
&lt;p&gt;Create a new php file: &lt;code&gt;vim reg.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Following the content of reg.php:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; 
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;include/utils/utils.php&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="k"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;modules/com_vtiger_workflow/VTEntityMethodManager.inc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="nv"&gt;$emm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;VTEntityMethodManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$adb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;#addEntityMethod(&amp;quot;Module&amp;quot;, &amp;quot;LABEL&amp;quot;, &amp;quot;FILENAME&amp;quot;, &amp;quot;FUNCTION_NAME&amp;quot;); &lt;/span&gt;
&lt;span class="nv"&gt;$emm&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;addEntityMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Invoice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Update Commission&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;include/CommissionHandler.php&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;updateCommission&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Execute the registration script:&lt;/p&gt;
&lt;p&gt;via CLI: &lt;code&gt;php -f reg.php&lt;/code&gt; or via Web: &lt;code&gt;wget http://your.vtiger.url/vtiger-pat/reg.php -O &amp;gt; /dev/null&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Third Step: Associate the function hook to an invoice workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under the vtiger admin panel, select &lt;strong&gt;"Workflow"&lt;/strong&gt; and then &lt;strong&gt;"New Workflow"&lt;/strong&gt;.  &lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"For Module"&lt;/strong&gt;, select &lt;strong&gt;"Invocie"&lt;/strong&gt; Module  &lt;/li&gt;
&lt;li&gt;Fill the description field with a descriptive name eg. "Update Invoice Commission"  &lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Every time the record is saved."&lt;/strong&gt; radio button  &lt;/li&gt;
&lt;li&gt;Click Save button  &lt;/li&gt;
&lt;li&gt;Leave conditions empty  &lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;"New Task"&lt;/strong&gt; button  &lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Invoke custom function"&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;Assign a Task title and select &lt;strong&gt;"Update Commission"&lt;/strong&gt; method  &lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Save"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Fourth Step: Play with invoice and products commissions.&lt;/strong&gt;&lt;/p&gt;</summary><category term="crm"></category><category term="php"></category><category term="vtiger"></category></entry><entry><title>Backup your Dropbox share with bacula</title><link href="https://www.bertera.it/backup-your-dropbox-share-with-bacula.html" rel="alternate"></link><published>2012-07-27T22:33:00+02:00</published><updated>2012-07-27T22:33:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-07-27:backup-your-dropbox-share-with-bacula.html</id><summary type="html">&lt;p&gt;I don't
&lt;a href="http://www.zdnet.com/blog/bott/sorry-dropbox-i-still-dont-trust-you/4173"&gt;like&lt;/a&gt;
cloud storage, especially I don't like Dropbox security
&lt;a href="http://www.schneier.com/blog/archives/2011/05/dropbox_securit.html"&gt;history&lt;/a&gt;.&lt;br /&gt;
Anyway Dropbox and others cloud storage are damn cheap and easy to use,
I use it for sharing non-important documents.&lt;/p&gt;
&lt;p&gt;This little howto explain how you can backup your Dropbox share with
&lt;a href="http://www.bacula.org"&gt;Bacula&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First you must install Dropbox in your server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the python &lt;strong&gt;CLI script&lt;/strong&gt; from &lt;a href="https://www.dropbox.com/install?os=lnx"&gt;here&lt;/a&gt;: &lt;code&gt;wget https://linux.dropbox.com/packages/dropbox.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;and install: &lt;code&gt;LC_ALL=C python26 ./dropbox.py start -i&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;run it: &lt;code&gt;LC_ALL=C python26 ./dropbox.py start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Now Dropbox start reply with a link:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;To link this computer to a dropbox account, visit the following url:  

https://www.dropbox.com/cli_link?host_id=4258saj1921sa123aa17329a12e3&amp;amp;cl=en_US  
&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Copy and paste the in your browser and insert you DropBox credentials, after you can restart Dropbox.&lt;br /&gt;
Dropbox will sync your storage with your ~/Dropbox folder. You can check the status with the command: &lt;code&gt;LC_ALL=C python26 ./dropbox.py status&lt;/code&gt;
*When your Dropbox folder is fully syncronized you can stop Dropbox &lt;code&gt;LC_ALL=C python26 ./dropbox.py stop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This little script starts local dropbox sync process and check the
status, the script exit with success if your Dropbox folder is in-sync,
and with an error code you a timeout event is reached (configure maxwait
and recheck variabales). You can use this script as Pre-client-script in
your bacula job.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;maxwait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt; &lt;span class="c1"&gt;#number of maximum re-check&lt;/span&gt;
&lt;span class="nv"&gt;recheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;#seconds between recheck&lt;/span&gt;
&lt;span class="nv"&gt;dropbox&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;python26 /root/dropbox.py&amp;quot;&lt;/span&gt;


do_ok&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nv"&gt;$dropbox&lt;/span&gt; stop
        &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;span class="c1"&gt;# start DR&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C
&lt;span class="nv"&gt;$dropbox&lt;/span&gt; start


&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt; -le &lt;span class="nv"&gt;$maxwait&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
        sleep &lt;span class="nv"&gt;$recheck&lt;/span&gt;
        &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$dropbox&lt;/span&gt; filestatus Dropbox &lt;span class="p"&gt;|&lt;/span&gt; cut -d &lt;span class="se"&gt;\ &lt;/span&gt; -f2-&lt;span class="k"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;up to date&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; do_ok
        &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Dropbox not updated.. (&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Timeout reached.&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$dropbox&lt;/span&gt; stop
&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Following the bacula configuration for this job: Job definition and
FilSet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;FileSet {
  Name = &amp;quot;DropBox Full Set&amp;quot;
  Include {
    Options {
      signature = MD5
    }
    File = /root/Dropbox
  }
}

Job {
  Name = &amp;quot;BackupDropBox&amp;quot;
  Client = stoker-fd
  FileSet = &amp;quot;DropBox Full Set&amp;quot;
  JobDefs = &amp;quot;DefaultJob&amp;quot;
  RunScript {
    RunsWhen = Before
    FailJobOnError = Yes
    Command = &amp;quot;/etc/bacula/scripts/sync-dropbox.sh&amp;quot;
  }
}
&lt;/pre&gt;&lt;/div&gt;</summary><category term="backup"></category><category term="bacula"></category><category term="bash"></category><category term="dropbox"></category></entry><entry><title>Poor man virtual consolidated backup update</title><link href="https://www.bertera.it/poor-man-virtual-consolidated-backup-update.html" rel="alternate"></link><published>2012-04-01T15:17:00+02:00</published><updated>2012-04-01T15:17:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-04-01:poor-man-virtual-consolidated-backup-update.html</id><summary type="html">&lt;p&gt;I just received a little patch to my
&lt;a href="http://www.bertera.it/index.php/2011/07/25/poor-man-vmware-consolidate-backup/" title="pmvcb"&gt;pmvcb&lt;/a&gt;
from Tilman Schmidt.&lt;br /&gt;
This patch add the support for the new ESXi syntax of
&lt;strong&gt;snapshot.remove&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can download the last pmvcb from my Github
&lt;a href="https://github.com/pbertera/pmvcb" title="pmvcb download from github"&gt;page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks Tilman.&lt;/p&gt;</summary><category term="backup"></category><category term="bacula"></category><category term="bash"></category><category term="script"></category></entry><entry><title>Little file browser with pdmenu</title><link href="https://www.bertera.it/little-file-browser-with-pdmenu.html" rel="alternate"></link><published>2012-03-10T02:15:00+01:00</published><updated>2012-03-10T02:15:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-03-10:little-file-browser-with-pdmenu.html</id><summary type="html">&lt;p&gt;&lt;a href="http://kitenet.net/programs/pdmenu/"&gt;Pdmenu&lt;/a&gt; is a menu system for Unix.
It is designed to be easy to use, and is suitable for a login shell for
inexperienced users, or it can just be run at the command line as a
handy menu program.&lt;/p&gt;
&lt;p&gt;I just modified showdir.pl script in order to implement a small and
minimal file browser for using pdmenu.&lt;/p&gt;
&lt;p&gt;You can add/delete file and directory and edit files. Some screenshot
below:&lt;/p&gt;
&lt;p&gt;&lt;img alt="run menu" src="https://www.bertera.it/pdmenu1.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="menu" src="https://www.bertera.it/pdmenu2.png" /&gt;&lt;/p&gt;
&lt;p&gt;this is the &lt;a href="https://github.com/pbertera/junk/blob/master/showdir/menutest"&gt;pdmenu configuration file&lt;/a&gt;:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;#! /usr/bin/pdmenu -c
#
## Version 2.0
#
## Title
preproc: echo &amp;quot;Title: test&amp;quot;
color:desktop:blue:blue
color:title:red:white
color:base:blue:white
# File manager
menu:provisioning: Provisioning file management : 
group:_Edit a file
    exec::makemenu: (\
            /usr/share/pdmenu/editdir.pl /var/www &amp;quot;&amp;quot; show_directory \
            ) 2&amp;gt;/dev/null
    show:::show_directory
    remove:::show_directory
endgroup
group:_Remove a file or directory
    exec::makemenu: (\
            /usr/share/pdmenu/deldir.pl /var/www &amp;quot;&amp;quot; del_directory \
            ) 2&amp;gt;/dev/null
    show:::del_directory
    remove:::del_directory
endgroup
group:Add a _directory
    exec::makemenu: (\
            /usr/share/pdmenu/adddir.pl /var/www &amp;quot;&amp;quot; add_directory \
            ) 2&amp;gt;/dev/null
    show:::add_directory
    remove:::add_directory
endgroup
group:Add a _file
    exec::makemenu: (\
            /usr/share/pdmenu/addfile.pl /var/www &amp;quot;&amp;quot; add_file \
            ) 2&amp;gt;/dev/null
    show:::add_file
    remove:::add_file
endgroup
nop

nop
exit:E_xit
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;you can download the showdir.pl script &lt;a href="https://github.com/pbertera/junk/blob/master/showdir/showdir.pl"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All files &lt;code&gt;/usr/share/pdmenu/editdir.pl&lt;/code&gt; &lt;code&gt;/usr/share/pdmenu/deldir.pl&lt;/code&gt;
&lt;code&gt;/usr/share/pdmenu/adddir.pl&lt;/code&gt; &lt;code&gt;/usr/share/pdmenu/addfile.pl&lt;/code&gt; are symlink to
&lt;code&gt;showdir.pl&lt;/code&gt;&lt;/p&gt;</summary><category term="coding"></category><category term="pdmenu"></category><category term="perl"></category></entry><entry><title>How to push a public IP on your laptop using SSH bridged tunnel</title><link href="https://www.bertera.it/how-to-push-a-public-ip-on-your-laptop-using-ssh-bridged-tunnel.html" rel="alternate"></link><published>2012-03-04T23:49:00+01:00</published><updated>2012-03-04T23:49:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-03-04:how-to-push-a-public-ip-on-your-laptop-using-ssh-bridged-tunnel.html</id><summary type="html">&lt;p&gt;In my &lt;a href="http://www.bertera.it/index.php/2008/12/22/vpn-layer-3-con-openssh/" title="VPN layer 3 con OpenSSH"&gt;previous
post&lt;/a&gt; I
talked about Layer 3 VPN feature of OpenSSH (starting from version
4.3).&lt;br /&gt;
Now, I'm talking about bridged VPN or Layer 2 VPN. With this feature
you can create a virtual network device that, through the encrypted
tunnel, is connected on the same network segment of remote server. In
fact the VPN acts as a network switch connecting local virtual device
with remote device in same ethernet network.&lt;/p&gt;
&lt;p&gt;With this setup your SSH client will connect to remote server and start
forwarding packet between local end remote TUN/TAP device.&lt;br /&gt;
All packets are forward through the encrypted SSH tunnel.&lt;/p&gt;
&lt;p&gt;using &lt;strong&gt;-o Tunnel=ethernet&lt;/strong&gt; instead of &lt;strong&gt;&lt;em&gt;-o
Tunnel=point-to-point&lt;/em&gt;&lt;/strong&gt; ssh process try to use a tap device and
forwards all ethernet frames (layer 2). You can specify TUN/TAP local
and remote device index with &lt;strong&gt;&lt;em&gt;-w&lt;/em&gt;&lt;/strong&gt; option:&lt;/p&gt;
&lt;p&gt;This command: &lt;code&gt;ssh -o Tunnel=ethernet -w 0:1 host.example.com&lt;/code&gt;
establish an ssh connection to host.example.com and forwards all ethernet
frames from local tap0 to remote tap1 and vice-versa.&lt;br /&gt;
If tap0 and tap1 doesn't exist ssh will try to create.&lt;/p&gt;
&lt;p&gt;In order to setup a public IP on your laptop you need to create a bridge
between remote remote public ethernet device and remote TUN/TAP device.
Below the accomplishment step for this task:&lt;/p&gt;
&lt;p&gt;Assuming that this is the public network configuration:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Public IP:&lt;/strong&gt; 78.47.249.187&lt;br /&gt;
&lt;strong&gt;Public Network:&lt;/strong&gt; 78.47.249.160&lt;br /&gt;
&lt;strong&gt;Public Gateway:&lt;/strong&gt; 78.47.249.190&lt;br /&gt;
&lt;strong&gt;Laptop Public IP:&lt;/strong&gt; 78.47.249.187&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On server side:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create a bridge: &lt;code&gt;brctl addbr br0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;create the remote tap device: &lt;code&gt;tunctl -t tap0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;add devices to bridge: &lt;code&gt;brctl addif br0 eth0 &amp;amp;&amp;amp; brctl addif br0 tap0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;setup the remote public IP address on bridge interface: &lt;code&gt;ip addr add  78.47.249.187/27 dev br0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;setup link and promiscuous mode: &lt;code&gt;ip link set up promisc on dev tap0  &amp;amp;&amp;amp; ip link set up promisc on dev eth0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;setup default gateway: &lt;code&gt;ip route add default via  78.47.249.190&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Permit tunnel on ssh server: add "&lt;strong&gt;PermitTunnel yes&lt;/strong&gt;" on your sshd_config sshd configuration file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now the public machine must be connected to public network and
reachable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On client side:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connect your laptop to server and create the tunnel &lt;code&gt;ssh -o Tunnel=ethernet -w 0:0 root@78.47.249.187&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;add public ip to your client and setup link: &lt;code&gt;ip addr add  78.47.249.188/27 dev tap0 &amp;amp;&amp;amp; ip link set up dev tap0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now your laptop is directly connected to public remote network through
tap0 device.&lt;br /&gt;
Following steps are needed only  if you  need to substitute your
gateway with public gw:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;setup a static route to remote server (you need to know your current
default gw): &lt;code&gt;ip route add 78.47.249.187 via my.old.def.gw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;setup the new default gw: &lt;code&gt;ip route del default via my.old.def.gw &amp;amp;&amp;amp; ip route add default via 78.47.249.190 dev tap0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can automate all client task with a simple bash script&lt;/li&gt;
&lt;li&gt;&lt;em&gt;-u&lt;/em&gt; and &lt;em&gt;-g&lt;/em&gt; tunctl options permit to manage TUN/TAP device with an unprivileged user&lt;/li&gt;
&lt;li&gt;use ssh public key authentication and a dedicated unprivileged user&lt;/li&gt;
&lt;li&gt;&lt;em&gt;-NTCf -o ServerAliveInterval=60&lt;/em&gt; ssh options are your friends&lt;/li&gt;
&lt;li&gt;following the configuration files for automatic and reboot persistent configuration on server side (for RedHat based distro):&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;/etc/sysconfig/network-scripts/ifcfg-br0&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;DEVICE=&amp;quot;br0&amp;quot;
ONBOOT=&amp;quot;yes&amp;quot;
TYPE=Bridge
BOOTPROTO=none
IPADDR=78.47.249.187
PREFIX=27
GATEWAY=78.47.249.190
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=&amp;quot;System Bridge&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;/etc/sysconfig/network-scripts/ifcfg-tap0&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;DEVICE=tap0
TYPE=Tap
OWNER=vpnuser #use an unprivileged user for your TUN/TAP device
BRIDGE=br0
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;/etc/sysconfig/network-scripts/ifcfg-eth0&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;DEVICE=&amp;quot;eth0&amp;quot;
ONBOOT=&amp;quot;yes&amp;quot;
TYPE=Ethernet
BRIDGE=br0
&lt;/pre&gt;&lt;/div&gt;</summary><category term="routing"></category><category term="ssh"></category><category term="vpn"></category></entry><entry><title>Asterisk and SIP session refresh with UPDATE request</title><link href="https://www.bertera.it/asterisk_and_sip_session_refresh_with_update-request.html" rel="alternate"></link><published>2012-02-15T07:12:00+01:00</published><updated>2012-02-15T07:12:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2012-02-15:asterisk_and_sip_session_refresh_with_update-request.html</id><summary type="html">&lt;p&gt;Using &lt;strong&gt;directmedia=update&lt;/strong&gt; or (&lt;strong&gt;canreinvite=update&lt;/strong&gt; in old-sytle
configuration) in chan_sip.conf Asterisk sends SIP UPDATE request to
refresh SIP session.&lt;/p&gt;
&lt;p&gt;If this UPDATE requests refers to an inactive call the phone reply with
&lt;strong&gt;SIP/2.0 481 Call Leg/Transaction Does Not Exist.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this situation Asterisk continue in resending UPDATE and doesn't tear
down the previous allocated channel.&lt;br /&gt;
Using INVITE instead UPDATE (&lt;strong&gt;directmedia=yes&lt;/strong&gt;) Asterisk correctly
terminate the dialog.&lt;/p&gt;
&lt;p&gt;This little chan_sip.c patch (Asterisk 1.8.9.1 version) correct this
behavior:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gd"&gt;--- asterisk-1.8.9.1/channels/chan_sip.c 2012-02-06 22:40:37.000000000 +0100&lt;/span&gt;
&lt;span class="gi"&gt;+++ /root/asterisk-1.8.9.1/channels/chan_sip.c 2012-02-08 15:30:04.552673312 +0100&lt;/span&gt;
&lt;span class="gu"&gt;@@ -20952,6 +20952,17 @@ static void handle_response(struct sip_p&lt;/span&gt;
case 481: /* Call leg does not exist */
if (sipmethod == SIP_INVITE) {
handle_response_invite(p, resp, rest, req, seqno);
&lt;span class="gi"&gt;+ }&lt;/span&gt;
&lt;span class="gi"&gt;+ else if (sipmethod == SIP_UPDATE) {&lt;/span&gt;
&lt;span class="gi"&gt;+ switch (resp) {&lt;/span&gt;
&lt;span class="gi"&gt;+ case 481: /* Call leg does not exist */&lt;/span&gt;
&lt;span class="gi"&gt;+ ast_log(LOG_WARNING, &amp;quot;Re-invite with UPDATE to non-existing call leg on other UA. SIP dialog &amp;#39;%s&amp;#39;. Giving up.\n&amp;quot;, p-&amp;gt;callid);&lt;/span&gt;
&lt;span class="gi"&gt;+ //xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);&lt;/span&gt;
&lt;span class="gi"&gt;+ if (p-&amp;gt;owner)&lt;/span&gt;
&lt;span class="gi"&gt;+ ast_queue_control(p-&amp;gt;owner, AST_CONTROL_CONGESTION);&lt;/span&gt;
&lt;span class="gi"&gt;+ sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);&lt;/span&gt;
&lt;span class="gi"&gt;+ break;&lt;/span&gt;
&lt;span class="gi"&gt;+ }&lt;/span&gt;
} else if (sipmethod == SIP_SUBSCRIBE) {
handle_response_subscribe(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_BYE) {
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can download the patch at
&lt;a href="https://github.com/pbertera/junk/blob/master/asterisk-stuff/asterisk-1.8.9.1-UPDATE-reinvite.patch"&gt;https://github.com/pbertera/junk/blob/master/asterisk-stuff/asterisk-1.8.9.1-UPDATE-reinvite.patch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Asterisk reported issue: &lt;a href="https://issues.asterisk.org/jira/browse/ASTERISK-19313"&gt;ASTERISK-19313&lt;/a&gt;&lt;/p&gt;</summary><category term="asterisk"></category><category term="bug"></category><category term="sip"></category><category term="VoIP"></category></entry><entry><title>How to split DNS name resolution in VPN environment</title><link href="https://www.bertera.it/how-to-split-dns-name-resolution-in-vpn-environment.html" rel="alternate"></link><published>2011-11-30T19:18:00+01:00</published><updated>2011-11-30T19:18:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-11-30:how-to-split-dns-name-resolution-in-vpn-environment.html</id><summary type="html">&lt;p&gt;I'm in this situation:&lt;br /&gt;
a VPN to remote concentrator that load many routes to private networks,
vpn server push DNS configuration via OpenVPN protocol (see
--dhcp-option DNS in openvpn(8) ).&lt;br /&gt;
The scope of this post is to explain how you can use remote DNS pushed
by VPN concentrator only for certain zones.&lt;br /&gt;
For accomplish this I used a local &lt;a href="http://www.powerdns.com"&gt;PowerDNS&lt;/a&gt;
server and a little &lt;a href="http://www.openvpn.net"&gt;OpenVPN&lt;/a&gt; up script:&lt;/p&gt;
&lt;p&gt;When OpenVPN make the tunnel the up script create a custom
&lt;strong&gt;forward-zones-file&lt;/strong&gt; used by PowerDNS. The script insert in the custom
file the remote zones and the dns server authoritative for these zones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PowedDNS configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[pietro@berta ~]$ grep -v ^\# /etc/pdns/pdns.conf | sed -e /^$/d
setuid=pdns
setgid=pdns
allow-recursion=127.0.0.1/8
negquery-cache-ttl=0
query-cache-ttl=0

[pietro@berta ~]$ grep -v ^\# /etc/pdns-recursor/recursor.conf | sed -e /^$/d
setuid=pdns-recursor
setgid=pdns-recursor
forward-zones-file=/etc/pdns-recursor/vpn-zones.conf
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;OpenVPN configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[pietro@berta ~]$ grep ^up /etc/openvpn/my-vpn.conf
up /etc/openvpn/vpn-dns.sh up
down /etc/oprnvpn/vpn-dns.sh down
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;the /etc/openvpn/vpn-dns.sh script:&lt;/strong&gt;&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;zones&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;example.com remote.com my.internal.zone&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;dns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dns

&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; in
    up&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; opt in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;!foreign_option_*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dns=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;$opt&lt;/span&gt;&lt;span class="p"&gt;#dhcp-option DNS &lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$dns&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dns&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;then&lt;/span&gt;
                &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;;; created by openvpn --up &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &amp;quot;&lt;/span&gt; &amp;gt;/tmp/vpn-zones.conf
                &lt;span class="k"&gt;for&lt;/span&gt; zone in &lt;span class="nv"&gt;$zones&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
                    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;+&lt;/span&gt;&lt;span class="nv"&gt;$zone&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$dns&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; /tmp/vpn-zones.conf
                &lt;span class="k"&gt;done&lt;/span&gt;
                mv -f /tmp/vpn-zones.conf /etc/pdns-recursor/
                rec_control reload-zones
                &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
            &lt;span class="k"&gt;fi&lt;/span&gt;
        &lt;span class="k"&gt;done&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;

    down&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &amp;gt; /etc/pdns-recursor/vpn-zones.conf
        rec_control reload-zones
        &lt;span class="p"&gt;;;&lt;/span&gt;
    * &lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; usage:
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; [up|down]&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;This script route DNS zones &lt;em&gt;example.com remote.com my.internal.zone&lt;/em&gt; to
DNS server pushed by OpenVPN.&lt;/p&gt;
&lt;p&gt;You can check the right configuration using dig end tcpdump on tunnel
interface to see correctly routed DNS query.&lt;br /&gt;
In finish you must not forget to instruct your dhcp client to use
127.0.0.1 as a DNS server&lt;/p&gt;</summary><category term="dns"></category><category term="openvpn"></category><category term="powerdns"></category><category term="scripting"></category><category term="vpn"></category></entry><entry><title>Simple CMS using web.py and Markdown</title><link href="https://www.bertera.it/simple-cms-usin-web-py-and-markdown.html" rel="alternate"></link><published>2011-11-18T20:54:00+01:00</published><updated>2011-11-18T20:54:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-11-18:simple-cms-usin-web-py-and-markdown.html</id><summary type="html">&lt;p&gt;With a bit of code you can build a simple but powerful, single page, CMS
using &lt;a href="http://www.python.org"&gt;python&lt;/a&gt;, &lt;a href="http://www.webpy.org"&gt;web.py&lt;/a&gt;
and content stored in &lt;a href="http://en.wikipedia.org/wiki/Markdown"&gt;markdown&lt;/a&gt;
files.&lt;/p&gt;
&lt;p&gt;1) the application: &lt;strong&gt;application.py&lt;/strong&gt;&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/python26&lt;/span&gt;
&lt;span class="c1"&gt;# vi:si:et:sw=4:sts=4:ts=4&lt;/span&gt;
&lt;span class="c1"&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;
&lt;span class="c1"&gt;# -*- Mode: Python -*-&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Copyright (C) 2011 Bertera Pietro&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;web&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mimetypes&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;markdown2&lt;/span&gt;

&lt;span class="c1"&gt;# pages is a list of dictionary: the value of key name represent the name\&lt;/span&gt;
&lt;span class="c1"&gt;# of page, the value of  link represent the routing pattern,&lt;/span&gt;
&lt;span class="c1"&gt;# and content_file is the path of markdown file with the page content&lt;/span&gt;
&lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="s2"&gt;&amp;quot;content_file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;contents/home.md&amp;quot;&lt;/span&gt;
                 &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Info&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="s2"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/info.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="s2"&gt;&amp;quot;content_file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;contents/info.md&amp;quot;&lt;/span&gt;
                 &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# this is the directory with static files (images, css, ...)&lt;/span&gt;
&lt;span class="n"&gt;static_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;public&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# the view, layout.html is a template file&lt;/span&gt;
&lt;span class="n"&gt;htmlview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;views&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;layout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;\
   &lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ctx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# generic controller for Markdown pages:&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PageClassTemplate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;markdown2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;markdown_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;htmlview&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Controller for static files&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;file_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mime_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IOError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notfound&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# mime type interpreter&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mime_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mimetypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guess_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# initialize the application&lt;/span&gt;
&lt;span class="n"&gt;myApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;fvars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;\
   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PageClassTemplate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;content_file&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="n"&gt;myApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_mapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# add static file handler:&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;static_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;myApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_mapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;/.+&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;static_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Public&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# RUN!&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;myApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;2) main template layout: &lt;strong&gt;views/layout.html&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$def with (page, title=&amp;quot;&amp;quot;)

&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;xml:lang=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cs&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cs&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Single Page Markdown CMS&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
Custom header here      
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;        
$for item in pages:
    $ attr = &amp;#39;&amp;#39;
    $if ctx.path == item[&amp;#39;link&amp;#39;]:
        $ attr=&amp;#39; id=&amp;quot;current&amp;quot;&amp;#39;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt;&lt;span class="err"&gt;$:(attr)&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;$item[&amp;#39;link&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;$item[&amp;#39;name&amp;#39;]&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
$pass
        &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;hr/&amp;gt;&lt;/span&gt;
$:page
&lt;span class="nt"&gt;&amp;lt;hr/&amp;gt;&lt;/span&gt;    

    Custom footer here 
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;3) content template: views/page.html&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$def with (html)

$:html
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;4) markdown contents:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;contents/home.md&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;## Welcome !!

### This is an Hello word Page!

**web.py** the best python framework for webapps [web.py][].

This is a simple page from a markdown file

  [web.py]: http://www.webpy.org
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;contents/info.md&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;## Info&lt;/span&gt;

&lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;stupid&lt;/span&gt; &lt;span class="n"&gt;idea&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;made&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bertera&lt;/span&gt; &lt;span class="n"&gt;pietro&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nl"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//www.bertera.it)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="python"></category><category term="web.py"></category><category term="webapplications"></category></entry><entry><title>Php sinippet: howto ignore HTTP errors in file_get_contents()</title><link href="https://www.bertera.it/php-sinippet-howto-ignore-http-errors-in-file_get_contents.html" rel="alternate"></link><published>2011-11-04T12:52:00+01:00</published><updated>2011-11-04T12:52:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-11-04:php-sinippet-howto-ignore-http-errors-in-file_get_contents.html</id><summary type="html">&lt;p&gt;A useful snipped of php code:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;echo file_get_contents(&amp;#39;http://www.example.com/foo.html&amp;#39;,\
  FALSE, stream_context_create(array\
  (&amp;#39;http&amp;#39;=&amp;gt;;array(&amp;#39;ignore_errors&amp;#39; =&amp;gt;; TRUE))))
&lt;/pre&gt;&lt;/div&gt;</summary><category term="code"></category><category term="http"></category><category term="php"></category></entry><entry><title>Client side result pagination in python-ldap</title><link href="https://www.bertera.it/client-side-result-pagination-in-python-ldap.html" rel="alternate"></link><published>2011-10-25T13:28:00+02:00</published><updated>2011-10-25T13:28:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-10-25:client-side-result-pagination-in-python-ldap.html</id><summary type="html">&lt;p&gt;Sometime I must fighting with monkeys-configured LDAP servers.&lt;br /&gt;
This time DIT does not support
&lt;a href="http://www.ietf.org/rfc/rfc2696" title="RFC2696"&gt;RFC2696&lt;/a&gt; (Paged Results for
LDAP query), the data tree contains over 90000 entries.&lt;br /&gt;
Thanks to ldap.resiter is possible to implement client side pagination
in ldap scripts.&lt;br /&gt;
These simple lines of code explain how to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ldap&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pprint&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ldap.resiter&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;ldap_uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ldap://my.ldap.server&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;ldap_base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dc=example,dc=com&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;page_entry_num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyLDAPObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ldapobject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LDAPObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResultProcessor&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="n"&gt;ldapconn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyLDAPObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ldap_uri&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;msg_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ldapconn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ldap_base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCOPE_SUBTREE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(objectclass=*)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;res_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;res_msgid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;res_controls&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ldapconn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allresults&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page_entry_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;raw_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Press Enter for nex page or CTRL-C to interrupt:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ldapconn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abandon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;..Bye.&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rdn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ldap_obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;***********************&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;RDN: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rdn&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;***********************&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ldap_obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;***********************&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="code"></category><category term="ldap"></category><category term="python"></category><category term="python-ldap"></category></entry><entry><title>Howto configure multiple mac address over a single ethernet interface</title><link href="https://www.bertera.it/howto-configure-multiple-mac-address-over-a-single-ethernet-interface.html" rel="alternate"></link><published>2011-10-04T18:01:00+02:00</published><updated>2011-10-04T18:01:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-10-04:howto-configure-multiple-mac-address-over-a-single-ethernet-interface.html</id><summary type="html">&lt;p&gt;I up against this problem on a server hosted by Hetzner.My server is a
virtual hypervisor containing several virtual machines.The Hetzner's
politics is to statically associate a public IP to a single mac address,
is therefore impossible to have multiple IP address on a single ethernet
device.  Observing this rule you can associate only one virtual machine
with one public IP, and you cannot create a firewall with all public IPs
attested on public interface and private interfaces attached to a
vSwitchs.&lt;/p&gt;
&lt;p&gt;To solve the problem you can use the macvlan module. Macvlan allow to
create indipendent logical devices over a single ethernet device. In
this way you have three (logical) ethernet device with three IPs and
three mac address over a single physical device. This solve the
addressing problem but slightly complicates routing and NAT.&lt;/p&gt;
&lt;h3&gt;Configuration example:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Public IPs:&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;A.A.A.A associated mac address: aa:aa:aa:aa:aa:aa  &lt;/p&gt;
&lt;p&gt;B.B.B.B associated mac address: bb:bb:bb:bb:bb:bb  &lt;/p&gt;
&lt;p&gt;C.C.C.C associated mac address: cc:cc:cc:cc:cc:cc  &lt;/p&gt;
&lt;p&gt;External interface: eth0  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gateway:&lt;/strong&gt;&lt;br /&gt;
X.X.X.X&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Internal Subnets:&lt;/strong&gt;&lt;br /&gt;
a.a.a.0/24 (eth1)&lt;br /&gt;
b.b.b.0/24 (eth2)&lt;br /&gt;
c.c.c.0/24 (eth3)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Firewall IPs on internal subnets:&lt;/strong&gt;&lt;br /&gt;
eth1: a.a.a.254&lt;br /&gt;
eth2: b.b.b.254&lt;br /&gt;
eth3: c.c.c.254&lt;/p&gt;
&lt;h3&gt;Network schema:&lt;/h3&gt;
&lt;p&gt;I want to map the outgoing connections in this way:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Origin subnet&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Public IP&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a.a.a.0/24&lt;/td&gt;
&lt;td&gt;A.A.A.A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;b.b.b.0/24&lt;/td&gt;
&lt;td&gt;B.B.B.B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c.c.c.0/24&lt;/td&gt;
&lt;td&gt;C.C.C.C&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Macvlan interface creation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;set-up link on physical device:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip link set up dev eth0
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;create logical interfaces:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip link add link eth0 dev peth0 type macvlan address aa:aa:aa:aa:aa:aa
    ip link add link eth0 dev peth1 type macvlan address bb:bb:bb:bb:bb:bb
    ip link add link eth0 dev peth2 type macvlan address cc:cc:cc:cc:cc:cc
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Assign ip address and activate link:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip addr add A.A.A.A/26 dev peth0
    ip addr add B.B.B.B/26 dev peth1
    ip addr add C.C.C.C/26 dev peth2
    ip link set up dev peth0
    ip link set up dev peth1
    ip link set up dev peth2
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Normally configure the internal interfaces (eth1, eth2 eth3):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip addr add a.a.a.245/24 dev eth1
    ip addr add b.b.b.245/24 dev eth2
    ip addr add b.b.b.245/24 dev eth3
    ip link set up dev eth1
    ip link set up dev eth2
    ip link set up dev eth3
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;This is the routing situation:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# ip route sh
127.0.0.0/8 dev lo  proto kernel  scope link  src 127.0.0.1
a.a.a.0/24 dev eth1  proto kernel  scope link  src a.a.a.254
a.a.a.0/24 dev eth2  proto kernel  scope link  src b.b.b.254
a.a.a.0/24 dev eth3  proto kernel  scope link  src c.c.c.254
A.A.A.A/26 dev peth0  proto kernel  scope link  src A.A.A.A
B.B.B.B/26 dev peth1  proto kernel  scope link  src B.B.B.B
C.C.C.C/26 dev peth2  proto kernel  scope link  src C.C.C.C
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;You must create a routing table for all outgoing interface:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    echo &amp;quot;500 ipA&amp;quot; &amp;gt;&amp;gt; /etc/iproute2/rt_tables
    echo &amp;quot;600 ipB&amp;quot; &amp;gt;&amp;gt; /etc/iproute2/rt_tables
    echo &amp;quot;700 ipC&amp;quot; &amp;gt;&amp;gt; /etc/iproute2/rt_tables
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add a "catch all" routing table:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    echo &amp;quot;1000 catch_all&amp;quot; &amp;gt;&amp;gt; /etc/iproute2/rt_tables
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add gateways for tables:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip route add default via X.X.X.X dev peth0 table ipA
    ip route add default via X.X.X.X dev peth1 table ipB
    ip route add default via X.X.X.X dev peth1 table ipC
    ip route add default via X.X.X.X dev peth0 table catch_all
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add routing policy for internal subnet. Note that the priority must
be greater than the priority used for the normal and default tables (for
show all rules: ip rule show )&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip rule add from a.a.a.0/24 lookup ipA pref 60000
    ip rule add from b.b.b.0/24 lookup ipB pref 60001
    ip rule add from c.c.c.0/24 lookup ipC pref 60002
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add routing policy for local IPs:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip rule add from A.A.A.254 lookup ipA pref 60010
    ip rule add from B.B.B.254 lookup ipB pref 60011
    ip rule add from C.C.C.254 lookup ipC pref 60012
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Add a catch all routing policy (with preference greater than all):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    ip rule add from all lookup catch_all pref 70000
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Configure the NAT:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    iptables -t nat -I POSTROUTING -o peth0 -s a.a.a.0/24 -j SNAT --to-source A.A.A.A
    iptables -t nat -I POSTROUTING -o peth1 -s b.b.b.0/24 -j SNAT --to-source B.B.B.B
    iptables -t nat -I POSTROUTING -o peth2 -s c.c.c.0/24 -j SNAT --to-source C.C.C.C
&lt;/pre&gt;&lt;/div&gt;</summary><category term="iptables"></category><category term="linux"></category><category term="networking"></category><category term="routing"></category></entry><entry><title>cisco IOS: Monitorare una vpn</title><link href="https://www.bertera.it/cisco-ios-monitorare-una-vpn.html" rel="alternate"></link><published>2011-08-23T20:54:00+02:00</published><updated>2011-08-23T20:54:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-08-23:cisco-ios-monitorare-una-vpn.html</id><summary type="html">&lt;p&gt;Avere a che fare con delle connettività scadenti è sempre un disastro.&lt;/p&gt;
&lt;p&gt;Uno strumento per tenere monitorata una VPN e reagire in caso di down
puo' essere comodo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Esempio:&lt;/strong&gt;&lt;br /&gt;
In questo esempio ho una VPN tra la rete A (192.168.2.0/24) e la rete B
(192.168.8.0/24)&lt;br /&gt;
L'endpoint della rete A (192.186.2.1) è un router Cisco, l'enpoint B
(192.168.8.1) non è in nostra gestione ma parla IPSec. Tramite le
configurazione seguenti l'endpoint A tiene monitorato lo stato della VPN
e in caso di down effettua il reload della VPN.&lt;/p&gt;
&lt;p&gt;1) definiamo lo &lt;strong&gt;sla monitor&lt;/strong&gt; in modo che esegua un ping verso l'host
192.168.8.1. Dobbiamo definire il source address in modo da essere
sicuri di utilizzare il tunnel cifrato e lo scheduling in modo da
eseguire il test sempre. E' possibile impostare una frequenza di
esecuzione, di default è 60 secondi.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; ip sla monitor 5
 type echo protocol ipIcmpEcho 192.168.8.1 source-ipaddr 192.168.2.1
 exit
 ip sla monitor schedule 1 life forever start-time now
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;2) definiamo un tracker per lo sla monitor creato precedentemente:
vogliamo monitorare quando lo &lt;strong&gt;sla monitor 5&lt;/strong&gt; ritorna route
unreachable e reagire solo se lo stato di down permane per piu' di 60
secondi.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; track 1 rtr 5 reachability
 delay down 60
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;3) definiamo il "reattore"&lt;br /&gt;
Le configurazioni immesse finora fanno in modo che se l'host
192.168.8.1 rimane irraggiungibile per piu' di 60 secondi viene generato
un evento nel syslog locale. L'event manager applet seguente si occupa
di intercettare l'evento syslog, eseguire il reload della VPN e loggare
il messaggio "VPN Reloaded"&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; event manager applet VPN-IS-DOWN
 event syslog pattern &amp;quot;TRACKING-5-STATE: 5 .*Up-&amp;gt;Down&amp;quot;
 action 1.0 cli command &amp;quot;enable&amp;quot;
 action 2.0 cli command &amp;quot;clear crypto session remote b.public.ip&amp;quot;
 action 3.0 cli command &amp;quot;end&amp;quot;
 action 4.0 syslog msg &amp;quot;VPN Reloaded&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="http://www.cisco.com/en/US/docs/ios/12_4/ip_sla/configuration/guide/hsla_c.html"&gt;Cisco IOS IP SLA configuration
guide&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.cisco.com/en/US/docs/ios/ipsla/command/reference/sla_book.html"&gt;Cisco IOS IP SLAs command
reference&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.cisco.com/en/US/docs/ios/netmgmt/configuration/guide/nm_eem_policy_cli.html"&gt;Writing Cisco embedded event manager
policy&lt;/a&gt;&lt;/p&gt;</summary><category term="cisco"></category><category term="ios"></category><category term="monitoring"></category><category term="vpn"></category></entry><entry><title>Bacula 5.0.3 debian squeeze backport</title><link href="https://www.bertera.it/bacula-5-0-3-debian-squeeze-backport.html" rel="alternate"></link><published>2011-07-25T22:08:00+02:00</published><updated>2011-07-25T22:08:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-07-25:bacula-5-0-3-debian-squeeze-backport.html</id><summary type="html">&lt;p&gt;Packages available here:
&lt;a href="http://www.bertera.it/software/bacula/bacula-backports/"&gt;http://www.bertera.it/software/bacula/bacula-backports/&lt;/a&gt;&lt;/p&gt;</summary><category term="bacula"></category><category term="debian"></category></entry><entry><title>Poor man vmware consolidate backup</title><link href="https://www.bertera.it/poor-man-vmware-consolidate-backup.html" rel="alternate"></link><published>2011-07-25T21:59:00+02:00</published><updated>2011-07-25T21:59:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-07-25:poor-man-vmware-consolidate-backup.html</id><summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update:&lt;/strong&gt; for an english version of this post you
can read the README of pmvcb at &lt;a href="https://github.com/pbertera/pmvcb"&gt;github&lt;/a&gt;&lt;br /&gt;
For bacula integration of pvmcb you can see the instruction on bacula &lt;a href="http://wiki.bacula.org/doku.php?id=application_specific_backups:poor_man_vmware_consolidated_backup"&gt;wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VMware offre un pacchetto di backup per le macchine virtuali: &lt;a href="http://www.vmware.com/products/vi/cb_overview.html"&gt;VCB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="VCB" src="https://www.bertera.it/vcb.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Il VCB non fa altro che:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;eseguire uno snapshot di una VM&lt;/li&gt;
&lt;li&gt;clonare i dischi virtuali della VM&lt;/li&gt;
&lt;li&gt;consolidare lo snapshot (rimozione dello snapshot)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I vantaggi di un backup del genere sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si ha il backup una macchina virtuale intera&lt;/li&gt;
&lt;li&gt;non ci sono downtime: lo snapshot si puo' fare a caldo&lt;/li&gt;
&lt;li&gt;se i vmware tools fanno il loro dovere il filesystem dovrebbe essere
    consistente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gli svantaggi sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si ha il backup di una macchina virtuale intera (leggi: no
    incrementali)&lt;/li&gt;
&lt;li&gt;si hanno gli stessi limiti derivati dall'uso degli snapshot: no RDM,
    ecc..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In buona sostanza il VCB è un buon sistema per il disaster recovery (se
i paletti imposti dall'uso degli snapshot non sono troppo restrittivi).&lt;/p&gt;
&lt;p&gt;E' possibile implementare un sistema di backup molto simile
automatizzando le operazioni di snapshot, cloning e consolidation
tramite uno script.&lt;/p&gt;
&lt;p&gt;Lo script in questione è pmvcb: &lt;a href="/software/pmvcb/"&gt;pmvcb&lt;/a&gt; esegue le
operazioni sopra elencate su un host ESXi.&lt;/p&gt;
&lt;p&gt;Di seguito l'help:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Usage: ./pmvcb -v [VM] -d [DIR] -h [host] &amp;lt;options&amp;gt;

options:
    -v &amp;lt;vm&amp;gt;       Virtual machine to backup [*]
    -d &amp;lt;dir&amp;gt;  Remote directory to store backup [*]
    -h &amp;lt;host&amp;gt; ESXi host [*]
    -u &amp;lt;user&amp;gt; ESXi username (default: root)
    -f &amp;lt;opts&amp;gt; vmkfstool optons (default: &amp;quot;-a lsilogic -d zeroedthick&amp;quot;)
    -o      overwrite existent backups
    -q      use quiesce snapshot
    -s &amp;lt;opts&amp;gt; ssh options (default: &amp;quot;-i /var/lib/bacula/.ssh/id_rsa&amp;quot;)
    -L &amp;lt;cmd&amp;gt;  local command executed after backup of virtual disks, this command is executed on local machine
    -R &amp;lt;cmd&amp;gt;  remote command executed on ESXi host after local command execution

[*] required options
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;come opzioni obbligatorie richiede il nome della VM da 
(&lt;strong&gt;-v&lt;/strong&gt;), la directory di appoggio in cui clonare i dischi (&lt;strong&gt;-d&lt;/strong&gt;) e
l'host ESXi a cui collegarsi (&lt;strong&gt;-h&lt;/strong&gt;).&lt;br /&gt;
Tramite l'opzione &lt;strong&gt;-f&lt;/strong&gt; è possibile specificare diverse opzioni al
comando vmkfstool utilizato per le operazioni di cloning, tramite &lt;strong&gt;-q&lt;/strong&gt;
richiede un'operazione di Quiescing prima di effettuare lo snapshot.&lt;br /&gt;
&lt;strong&gt;-s&lt;/strong&gt; istruisce il comando ssh (es. ad usare l'autenticazione con
chiave RSA).&lt;br /&gt;
&lt;strong&gt;-L&lt;/strong&gt; e &lt;strong&gt;-R&lt;/strong&gt; eseguono comandi rispettivamente e nell'ordine
sull'host locale e sull'host remoto.&lt;/p&gt;
&lt;p&gt;pmvcb si occupa di:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;verificare che la virtual machine non abbia dischi &lt;em&gt;indipendent&lt;/em&gt;
    oppure &lt;em&gt;RDM&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;verificare che non ci siano snapshot attivi sulla virtual machine&lt;/li&gt;
&lt;li&gt;eseguire lo snapshot&lt;/li&gt;
&lt;li&gt;clonare i dischi e il .vmx della virtual machine nella directory
    specificata dall'opzione &lt;strong&gt;-d&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;consolidare lo snapshot creato&lt;/li&gt;
&lt;li&gt;eseguire i comandi specificati da &lt;strong&gt;-L&lt;/strong&gt; localmente&lt;/li&gt;
&lt;li&gt;eseguire i comandi specificati da &lt;strong&gt;-R&lt;/strong&gt; sull'host ESXi remoto&lt;/li&gt;
&lt;/ul&gt;</summary><category term="backup"></category><category term="bacula"></category><category term="script"></category><category term="vmware"></category></entry><entry><title>bash snippet: dumping function call trace</title><link href="https://www.bertera.it/bash-snippet-dumping-function-call-trace.html" rel="alternate"></link><published>2011-07-18T12:44:00+02:00</published><updated>2011-07-18T12:44:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2011-07-18:bash-snippet-dumping-function-call-trace.html</id><summary type="html">&lt;p&gt;Uno snippet di codice bash utile nel debugging di script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;#@.. function:: __cm_exit_error([text],[...])
#@
#@   Stampa la stringa passata in stderr ed esce
#@   Se è impostata la variabile __cm_debug stampa lo stack di chiamata delle funzioni
#@
#@   :param text: la stringa da stampare
#@   :type text: String
#@
__cm_exit_error()

{
        echo &amp;quot;Error in &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;:&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;BASH_LINENO&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;: $*&amp;quot; 1&amp;gt;&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;2
        local i=0
        [ &lt;span class="nv"&gt;$__cm_debug&lt;/span&gt; ] &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; while [ &lt;span class="nv"&gt;$i&lt;/span&gt; -lt &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="c1"&gt;#FUNCNAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt; ]; do
                [ &amp;quot;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;&amp;quot; == &amp;quot;main&amp;quot; ] &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; break
                echo &amp;quot;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;BASH_SOURCE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;::&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;::&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;BASH_LINENO&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;&amp;quot; 1&amp;gt;&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;2
                i=$(expr &lt;span class="nv"&gt;$i&lt;/span&gt; + 1)
        done
        exit 1
}
&lt;/pre&gt;&lt;/div&gt;</summary><category term="bash"></category><category term="debugging"></category><category term="script"></category></entry><entry><title>cisco IOS contextual config diffs via syslog</title><link href="https://www.bertera.it/cisco-ios-contextual-config-diffs-via-syslog.html" rel="alternate"></link><published>2010-10-11T11:11:00+02:00</published><updated>2010-10-11T11:11:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2010-10-11:cisco-ios-contextual-config-diffs-via-syslog.html</id><summary type="html">&lt;p&gt;Event amanager applet per salvare il diff tra stratup-config e
running-config via syslog.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;event manager applet wr-mem-match 
 event cli pattern &amp;quot;wr.* mem.*&amp;quot; sync yes
 action 1.0 cli command &amp;quot;enable&amp;quot;
 action 1.1 cli command &amp;quot;show archive config differences nvram:/startup-config system:/running-config&amp;quot;
 action 1.2 syslog msg &amp;quot;$_cli_result&amp;quot;
 set 2.0 _exit_status 1
&lt;/pre&gt;&lt;/div&gt;</summary><category term="cisco"></category><category term="cli"></category><category term="syslog"></category></entry><entry><title>Authentication username in Astersik SIP peer</title><link href="https://www.bertera.it/authentication-username-in-astersik-sip-peer.html" rel="alternate"></link><published>2010-07-12T09:01:00+02:00</published><updated>2010-07-12T09:01:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2010-07-12:authentication-username-in-astersik-sip-peer.html</id><summary type="html">&lt;p&gt;Asterisk use peername as username during SIP inbound digest
authentication.&lt;br /&gt;
&lt;a href="https://github.com/pbertera/junk/blob/master/asterisk-stuff/asterisk-1.6.2.2-sip-peer-authuser-patch.patch"&gt;This
patch&lt;/a&gt;
add &lt;strong&gt;authuser&lt;/strong&gt; parameter in SIP peer definition and use authuser in
digest authentication:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peer definition in /etc/asterisk/sip.conf&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;...
[pietro](sip-client-base)
authuser=MyUsername
secret=XXXXX
qualify=yes
nat=yes
...
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Peer definition in my SIP client (Twinkle)&lt;/strong&gt;&lt;br /&gt;
&lt;img alt="client configuration" src="https://www.bertera.it/Twinkle-conf.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;REGISTER message from my SIP client&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;REGISTER&lt;/span&gt; &lt;span class="nt"&gt;sip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;bertera&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;it&lt;/span&gt; &lt;span class="nt"&gt;SIP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;
&lt;span class="nt"&gt;Via&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;SIP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;UDP&lt;/span&gt; &lt;span class="nt"&gt;88&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;149&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;226&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;66&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;10458&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;rport&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;z9hG4bKkqpevlic&lt;/span&gt;
&lt;span class="nt"&gt;Max-Forwards&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;70&lt;/span&gt;
&lt;span class="nt"&gt;To&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pietro&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;From&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pietro&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;ntlug&lt;/span&gt;
&lt;span class="nt"&gt;Call-ID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;mqezxbywgtulavj&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;bertuccia&lt;/span&gt;
&lt;span class="nt"&gt;CSeq&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;681&lt;/span&gt; &lt;span class="nt"&gt;REGISTER&lt;/span&gt;
&lt;span class="nt"&gt;Contact&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;3600&lt;/span&gt;
&lt;span class="nt"&gt;Authorization&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Digest&lt;/span&gt; &lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MyUsername&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;realm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bertera.it&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;nonce&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;27f804de&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sip:bertera.it&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;47dbf0a57d80faffd148b58d84edc2db&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;algorithm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;MD5&lt;/span&gt; &lt;span class="nt"&gt;Allow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;INVITE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;ACK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;BYE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;CANCEL&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;OPTIONS&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;PRACK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;REFER&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;NOTIFY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;SUBSCRIBE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;INFO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;MESSAGE&lt;/span&gt;
&lt;span class="nt"&gt;User-Agent&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Twinkle&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;2&lt;/span&gt;
&lt;span class="nt"&gt;Content-Length&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Message in Asterisk CLI:&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[Feb 4 23:23:35] NOTICE[24864]: chan_sip.c:13016 register_verify: Trying athenticate peer &amp;#39;pietro&amp;#39; using authuser: &amp;#39;MyUsername&amp;#39;
-- Registered SIP &amp;#39;pietro&amp;#39; at 88.149.226.66 port 10458
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;REGISTER Confirmation from Asterisk:&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;SIP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt; &lt;span class="nt"&gt;200&lt;/span&gt; &lt;span class="nt"&gt;OK&lt;/span&gt;
&lt;span class="nt"&gt;Via&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;SIP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;UDP&lt;/span&gt; &lt;span class="nt"&gt;88&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;149&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;226&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;66&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;10458&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;z9hG4bKkqpevlic&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;received&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;88&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;149&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;226&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;66&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;rport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;10458&lt;/span&gt;
&lt;span class="nt"&gt;From&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pietro&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;ntlug&lt;/span&gt;
&lt;span class="nt"&gt;To&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Pietro&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;as49faff1f&lt;/span&gt;
&lt;span class="nt"&gt;Call-ID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;mqezxbywgtulavj&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="k"&gt;bertuccia&lt;/span&gt;
&lt;span class="nt"&gt;CSeq&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;681&lt;/span&gt; &lt;span class="nt"&gt;REGISTER&lt;/span&gt;
&lt;span class="nt"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Asterisk&lt;/span&gt; &lt;span class="nt"&gt;PBX&lt;/span&gt; &lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;2&lt;/span&gt;
&lt;span class="nt"&gt;Allow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;INVITE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ACK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;CANCEL&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;OPTIONS&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;BYE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;REFER&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;SUBSCRIBE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;NOTIFY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;INFO&lt;/span&gt;
&lt;span class="nt"&gt;Supported&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;replaces&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;timer&lt;/span&gt;
&lt;span class="nt"&gt;Expires&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;3600&lt;/span&gt;
&lt;span class="nt"&gt;Contact&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;expires&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;3600&lt;/span&gt;
&lt;span class="nt"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Thu&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;04&lt;/span&gt; &lt;span class="nt"&gt;Feb&lt;/span&gt; &lt;span class="nt"&gt;2010&lt;/span&gt; &lt;span class="nt"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;35&lt;/span&gt; &lt;span class="nt"&gt;GMT&lt;/span&gt;
&lt;span class="nt"&gt;Content-Length&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here is the chan_sip.c patch against Asterisk 1.6.2.2&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gh"&gt;Index: channels/chan_sip.c&lt;/span&gt;
&lt;span class="gh"&gt;===================================================================&lt;/span&gt;
&lt;span class="gd"&gt;--- channels/chan_sip.c (revision 244766)&lt;/span&gt;
&lt;span class="gi"&gt;+++ channels/chan_sip.c (working copy)&lt;/span&gt;
&lt;span class="gu"&gt;@@ -1825,6 +1825,7 @@&lt;/span&gt;
        AST_STRING_FIELD(context);      /*!&amp;lt; Default context for incoming calls */
        AST_STRING_FIELD(subscribecontext); /*!&amp;lt; Default context for subscriptions */
        AST_STRING_FIELD(username);     /*!&amp;lt; Temporary username until registration */ 
&lt;span class="gi"&gt;+       AST_STRING_FIELD(authuser);     /*!&amp;lt; Username used during inbound authentication */ &lt;/span&gt;
        AST_STRING_FIELD(accountcode);      /*!&amp;lt; Account code */
        AST_STRING_FIELD(tohost);       /*!&amp;lt; If not dynamic, IP address */
        AST_STRING_FIELD(regexten);         /*!&amp;lt; Extension to register (if regcontext is used) */
&lt;span class="gu"&gt;@@ -13011,7 +13012,9 @@&lt;/span&gt;
            ast_copy_flags(&amp;amp;p-&amp;gt;flags[0], &amp;amp;peer-&amp;gt;flags[0], SIP_NAT);
            if (ast_test_flag(&amp;amp;p-&amp;gt;flags[1], SIP_PAGE2_REGISTERTRYING))
                transmit_response(p, &amp;quot;100 Trying&amp;quot;, req);
&lt;span class="gd"&gt;-           if (!(res = check_auth(p, req, peer-&amp;gt;name, peer-&amp;gt;secret, peer-&amp;gt;md5secret, SIP_REGISTER, uri, XMIT_UNRELIABLE, req-&amp;gt;ignore))) {&lt;/span&gt;
&lt;span class="gi"&gt;+           if (strcmp(peer-&amp;gt;authuser, peer-&amp;gt;name))&lt;/span&gt;
&lt;span class="gi"&gt;+               ast_log(LOG_NOTICE, &amp;quot;Trying athenticate peer &amp;#39;%s&amp;#39; using authuser: &amp;#39;%s&amp;#39;\n&amp;quot;, peer-&amp;gt;name, peer-&amp;gt;authuser);&lt;/span&gt;
&lt;span class="gi"&gt;+           if (!(res = check_auth(p, req, peer-&amp;gt;authuser, peer-&amp;gt;secret, peer-&amp;gt;md5secret, SIP_REGISTER, uri, XMIT_UNRELIABLE, req-&amp;gt;ignore))) {&lt;/span&gt;
                if (sip_cancel_destroy(p))
                    ast_log(LOG_WARNING, &amp;quot;Unable to cancel SIP destruction.  Expect bad things.\n&amp;quot;);

&lt;span class="gu"&gt;@@ -14006,7 +14009,7 @@&lt;/span&gt;
        ast_string_field_set(p, peersecret, NULL);
        ast_string_field_set(p, peermd5secret, NULL);
    }
&lt;span class="gd"&gt;-   if (!(res = check_auth(p, req, peer-&amp;gt;name, p-&amp;gt;peersecret, p-&amp;gt;peermd5secret, sipmethod, uri2, reliable, req-&amp;gt;ignore))) {&lt;/span&gt;
&lt;span class="gi"&gt;+   if (!(res = check_auth(p, req, peer-&amp;gt;authuser, p-&amp;gt;peersecret, p-&amp;gt;peermd5secret, sipmethod, uri2, reliable, req-&amp;gt;ignore))) {&lt;/span&gt;
        ast_copy_flags(&amp;amp;p-&amp;gt;flags[0], &amp;amp;peer-&amp;gt;flags[0], SIP_FLAGS_TO_COPY);
        ast_copy_flags(&amp;amp;p-&amp;gt;flags[1], &amp;amp;peer-&amp;gt;flags[1], SIP_PAGE2_FLAGS_TO_COPY);
        /* If we have a call limit, set flag */
&lt;span class="gu"&gt;@@ -15386,6 +15389,7 @@&lt;/span&gt;
        }
        ast_cli(fd, &amp;quot;  Secret       : %s\n&amp;quot;, ast_strlen_zero(peer-&amp;gt;secret)?&amp;quot;&amp;lt;Not set&amp;gt;&amp;quot;:&amp;quot;&amp;lt;Set&amp;gt;&amp;quot;);
        ast_cli(fd, &amp;quot;  MD5Secret    : %s\n&amp;quot;, ast_strlen_zero(peer-&amp;gt;md5secret)?&amp;quot;&amp;lt;Not set&amp;gt;&amp;quot;:&amp;quot;&amp;lt;Set&amp;gt;&amp;quot;);
&lt;span class="gi"&gt;+       ast_cli(fd, &amp;quot;  Auth User    : %s\n&amp;quot;, peer-&amp;gt;authuser);&lt;/span&gt;
        ast_cli(fd, &amp;quot;  Remote Secret: %s\n&amp;quot;, ast_strlen_zero(peer-&amp;gt;remotesecret)?&amp;quot;&amp;lt;Not set&amp;gt;&amp;quot;:&amp;quot;&amp;lt;Set&amp;gt;&amp;quot;);
        for (auth = peer-&amp;gt;auth; auth; auth = auth-&amp;gt;next) {
            ast_cli(fd, &amp;quot;  Realm-auth   : Realm %-15.15s User %-10.20s &amp;quot;, auth-&amp;gt;realm, auth-&amp;gt;username);
&lt;span class="gu"&gt;@@ -23706,8 +23710,10 @@&lt;/span&gt;
        set_peer_defaults(peer);    /* Set peer defaults */
        peer-&amp;gt;type = 0;
    }
&lt;span class="gd"&gt;-   if (!found &amp;amp;&amp;amp; name)&lt;/span&gt;
&lt;span class="gi"&gt;+   if (!found &amp;amp;&amp;amp; name) {&lt;/span&gt;
        ast_copy_string(peer-&amp;gt;name, name, sizeof(peer-&amp;gt;name));
&lt;span class="gi"&gt;+       ast_string_field_set(peer, authuser, name); /* Set default authuser == peername*/&lt;/span&gt;
&lt;span class="gi"&gt;+   }&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="asterisk"></category><category term="c"></category><category term="patch"></category><category term="VoIP"></category></entry><entry><title>GNU/Find posix acl support</title><link href="https://www.bertera.it/gnufind-posix-acl-support.html" rel="alternate"></link><published>2009-09-28T18:25:00+02:00</published><updated>2009-09-28T18:25:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2009-09-28:gnufind-posix-acl-support.html</id><summary type="html">&lt;p&gt;Cercare file che corrispondono a delle acl posix all'interno di un
filesystem molto intricato è sempre un delirio.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pbertera/junk/tree/master/findutils-acl"&gt;Questa&lt;/a&gt; patch aggiunge
l'opzione -acl al comando find
(&lt;a href="http://www.gnu.org/software/findutils/"&gt;GNU/Findutils&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Esempio d'uso:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;touch&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;mkdir&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;rx&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;rw&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;pietro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;---&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;rw&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;wheel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;r&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;rwx&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;touch&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;setfacl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;m&lt;/span&gt; &lt;span class="nn"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;wheel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;r&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;

&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;find&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;acl&lt;/span&gt; &lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;rx&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;find&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;acl&lt;/span&gt; &lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;find&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;acl&lt;/span&gt; &lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;*:rx&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;find&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;acl&lt;/span&gt; &lt;span class="nn"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;*:*&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="s s-Atom"&gt;find&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;acl&lt;/span&gt; &lt;span class="nn"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nn"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;*:*&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Questa patch e' stata testata solo su Linux, è scaricabile qua:
&lt;a href="https://github.com/pbertera/junk/tree/master/findutils-acl"&gt;https://github.com/pbertera/junk/tree/master/findutils-acl&lt;/a&gt; è disponibile per la
versione 4.42 e 4.5.6 di findutils&lt;/p&gt;</summary><category term="c"></category><category term="find"></category><category term="gnu"></category></entry><entry><title>Verbose bash history</title><link href="https://www.bertera.it/verbose-bash-history.html" rel="alternate"></link><published>2009-07-02T08:58:00+02:00</published><updated>2009-07-02T08:58:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2009-07-02:verbose-bash-history.html</id><summary type="html">&lt;p&gt;Usando questo codice durante l'inizializzasione della shell viene
salvata una command history nel file &lt;em&gt;.bash_verbose_history&lt;/em&gt; contenete
data e ora, tty (oppure l'ip se l'utente è collegato in ssh) eil comando
eseguito. Inoltre evita la sovrascrittura del file
&lt;em&gt;.bash_verbose_history&lt;/em&gt; e &lt;em&gt;.bash_history&lt;/em&gt; eseguendone una copia
quando il file raggiunge le 3000 righe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/etc/bashrc&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;HISTSIZE=4000
HISTFILESIZE=4000

for f in .bash_history .bash_verbose_history; do
        if [ `wc -l &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$f&lt;/span&gt; | awk &amp;#39;{print $1}&amp;#39;` -gt 3000 ] ; then
                cp -f &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/&lt;span class="nv"&gt;$f&lt;/span&gt;-`date -I`
        fi
done

if [ -n &amp;quot;&lt;span class="nv"&gt;$SSH_CLIENT&lt;/span&gt;&amp;quot; ]; then
        TTY=`echo &lt;span class="nv"&gt;$SSH_CLIENT&lt;/span&gt;| cut -d   -f1`
else
        TTY=`tty | sed -e &amp;quot;s:/dev/::&amp;quot;`
fi

PROMPT_COMMAND=&amp;quot;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;PROMPT_COMMAND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;PROMPT_COMMAND&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cp"&gt;}&lt;/span&gt;&amp;quot;&amp;#39;echo `date +&amp;quot;%Y-%m-%d %k:%M:%S&amp;quot;` &lt;span class="nv"&gt;$USER&lt;/span&gt; &lt;span class="nv"&gt;$TTY&lt;/span&gt; &amp;quot;$(history 1)&amp;quot; &amp;gt;&amp;gt; ~/.bash_verbose_history&amp;#39;
&lt;/pre&gt;&lt;/div&gt;</summary></entry><entry><title>VPN layer 3 con OpenSSH</title><link href="https://www.bertera.it/vpn-layer-3-con-openssh.html" rel="alternate"></link><published>2008-12-22T13:48:00+01:00</published><updated>2008-12-22T13:48:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2008-12-22:vpn-layer-3-con-openssh.html</id><summary type="html">&lt;p&gt;Dalla versione 4.3 di OpenSSH è stato introdotto il supporto per
TUN/TAP. Questo sigifica che è possibile stabilire un tunnel cifrato tra
due peer o due (o piu) reti.&lt;br /&gt;
&lt;a href="https://github.com/pbertera/ssh-vpn"&gt;Questo&lt;/a&gt; script si
occupa di fare il discover dei device tun da utilizzare, assegnare gli
indirizzi e le rotte al tunnel (locali e sul peer remoto) ed eseguire
comandi aggiuntivi tramite un file di configurazione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/pbertera/ssh-vpn/blob/master/example.conf"&gt;testvpn.conf&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;SSH_OPTS=&amp;quot;-i /home/pietro/.ssh/id_dsa&amp;quot; # optional: options for ssh command
RUSER=root  # user to login on remote peer
PEER=172.42.10.2 # ip of remote peer
RTUNADDR=10.10.100.2 # remote ip of tunnel
LTUNADDR=10.10.100.1 # local ip of tunnel
#LOCAL_TUN=tun0 #optional: static definition of local tun device
#REMOTE_TUN=tun1 #optional: static definition of remote tun device
REMOTE_NET=172.16.40.1 # remote network
ENABLE_PEER_IP_FORWARD=true # enable ip forwarding on remote host
TRY_LOAD_PEER_TUN_MOD=true # try loading tun/tap kernel module
BAILOUT_COMMAND=&amp;quot;logger died&amp;quot;
# in POST_TUN_PEER_COMMAND and POST_TUN_LOCAL_COMMAND use &amp;#39; instead &amp;quot; !!!
# $LOCAL_TUN is local tun device
# $REMOTE_TUN is remote tun device
POST_TUN_PEER_COMMAND=&amp;#39;iptables -I FORWARD -i $REMOTE_TUN -j ACCEPT&amp;#39; # optional: command to execute on remote peer
POST_TUN_LOCAL_COMMAND=&amp;#39;ip route add 192.168.6.0/24 via $RTUNADDR dev $LOCAL_TUN&amp;#39; # optional: command to execute on local peer
LOCAL_IP=&amp;quot;ip&amp;quot; # optional: local ip command binary
REMOTE_IP=&amp;quot;ip&amp;quot; # optional: remote ip command binary
SSH=&amp;quot;ssh&amp;quot; # optional: ssh binary
&lt;/pre&gt;&lt;/div&gt;</summary><category term="bash"></category><category term="ssh"></category><category term="vpn"></category></entry><entry><title>Reading Windows and Office product key</title><link href="https://www.bertera.it/reading-windows-and-office-product-key.html" rel="alternate"></link><published>2008-12-17T15:04:00+01:00</published><updated>2008-12-17T15:04:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2008-12-17:reading-windows-and-office-product-key.html</id><summary type="html">&lt;p&gt;I product key di M\$ Windows e Office vengono salvati nel registro in
alcune chiavi cifrate&lt;br /&gt;
Pygetkey decifra le chiavi e le stampa a video oppure le salva in
chiaro in un'altra chiave di registro. Puo' inoltre preleveare i product
key da un pc remoto.&lt;/p&gt;
&lt;p&gt;Pygetkey è scritto in python e richiede un'installazione di python 2.X
per windows&lt;/p&gt;
&lt;p&gt;Esempio:  &lt;code&gt;pygetkey -c SYSTEMTest&lt;/code&gt; creerà i valori WINDOWS-KEY e OFFICE-2007-KEY all'interno della chiave
HKEY_LOCAL_MACHINESYSTEMTest:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[HKEY_LOCAL_MACHINESYSTEMTest] &amp;quot;WINDOWS-KEY&amp;quot;=&amp;quot;XQM13-K3M7R-32HRX-XF3Q-GMF63&amp;quot; &amp;quot;OFFICE-2007-KEY&amp;quot;=&amp;quot;JPBW9-BPY6B-79M9M-RJYJV-6G5B6&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;i valori vengono creati sotto l'albero di registro HKEY_LOCAL_MACHINE
nella chiave specificata dal parametro -c e potranno avere i seguenti nomi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WINDOWS-KEY: la chiave di windows  &lt;/li&gt;
&lt;li&gt;OFFICE-{2000,2007,2003,XP}-KEY: le chiavi di office trovate a seconda della versione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La chiave specificata dal comando DEVE esistere, in caso contrario
verrà ritornato un errore.&lt;/p&gt;
&lt;p&gt;L'opzione -r HOST indica a pygetkey di interrogare un host remoto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leggere chiavi di registro su un pc remoto:&lt;/strong&gt;&lt;br /&gt;
readrreg.py è ingrado di leggere le chiavi di registro da un pc remoto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;devgetkey&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;readrreg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;SYSTEMTest&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;RemotePC&lt;/span&gt; &lt;span class="n"&gt;office&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2007&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;XQM13&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;K3M7R&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="n"&gt;HRX&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;XF3Q&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;GMF63&lt;/span&gt; &lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JPBW9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;BPY6B&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="n"&gt;M9M&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;RJYJV&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;G5B6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Creazione dei binari&lt;/strong&gt;&lt;br /&gt;
E' possibile creare un eseguibile di pygetkey e readrreg in modo da non
installare python sui pc, per creare i binari occorre&lt;br /&gt;
installare py2exe (http://www.py2exe.org) per l'appropriata versione di&lt;/p&gt;
&lt;p&gt;Python ed eseguire il seguente comando: &lt;code&gt;python.exe setup.py py2exe&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Qesto creera' una directory dist contente dei file, quelli strettamente
necessari all'esecuzione di pygetkey.exe e readrreg.exe sono:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pygetkey.exe  &lt;/li&gt;
&lt;li&gt;readrreg.exe  &lt;/li&gt;
&lt;li&gt;library.zip  &lt;/li&gt;
&lt;li&gt;python25.dll (il 25 dipende dalla versione di Python installata)  &lt;/li&gt;
&lt;li&gt;MSVCR71.dll&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS: non sono sicuro funzioni correttamente con Office 2000&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;pygetkey è scaricabile &lt;a href="https://github.com/pbertera/junk/tree/master/pygetkey"&gt;qua&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;python è scaricabile all'indirizzo: &lt;a href="http://www.python.org"&gt;http://www.python.org&lt;/a&gt;&lt;br /&gt;
py2exe è scaricabile all'indirizzo: &lt;a href="http://www.py2exe.org"&gt;http://www.py2exe.org&lt;/a&gt;&lt;/p&gt;</summary><category term="product key"></category><category term="python"></category><category term="registry"></category><category term="windows"></category></entry><entry><title>Worstbit posix acl</title><link href="https://www.bertera.it/worstbit-posix-acl.html" rel="alternate"></link><published>2008-09-26T18:05:00+02:00</published><updated>2008-09-26T18:05:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2008-09-26:worstbit-posix-acl.html</id><summary type="html">&lt;p&gt;Software C che si occupa dell'encode e decode dei filename contenuti nei dump del comando&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; getfacl -R
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/pbertera/junk/tree/master/worstbit"&gt;https://github.com/pbertera/junk/tree/master/worstbit&lt;/a&gt;&lt;/p&gt;</summary><category term="acl posix"></category><category term="c"></category></entry><entry><title>Check_web_form.py</title><link href="https://www.bertera.it/check_web_formpy.html" rel="alternate"></link><published>2008-09-24T16:42:00+02:00</published><updated>2008-09-24T16:42:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2008-09-24:check_web_formpy.html</id><summary type="html">&lt;p&gt;Check script di nagios per eseguire il submit di un form e cercare dei
valori nella response del server.&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span class="c1"&gt;# vi:si:et:sw=4:sts=4:ts=4&lt;/span&gt;
&lt;span class="c1"&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;
&lt;span class="c1"&gt;# -*- Mode: Python -*-&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Copyright (C) 2006 Bertera Pietro&lt;/span&gt;

&lt;span class="c1"&gt;# This file may be distributed and/or modified under the terms of&lt;/span&gt;
&lt;span class="c1"&gt;# the GNU General Public License version 2 as published by&lt;/span&gt;
&lt;span class="c1"&gt;# the Free Software Foundation.&lt;/span&gt;
&lt;span class="c1"&gt;# This file is distributed without any warranty; without even the implied&lt;/span&gt;
&lt;span class="c1"&gt;# warranty of merchantability or fitness for a particular purpose.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Check web form&lt;/span&gt;
&lt;span class="c1"&gt;# Permette di effettuare il submit di un form HTML e di cercare dei contenuti nella&lt;/span&gt;
&lt;span class="c1"&gt;# response del server&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Features:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# * Supporto per i Cookie&lt;/span&gt;
&lt;span class="c1"&gt;# * URL personabilizzabile per ricevere i cookie&lt;/span&gt;
&lt;span class="c1"&gt;# * Invio di Header HTTP arbitrari&lt;/span&gt;
&lt;span class="c1"&gt;# * Ricerca nel contenuto e nell&amp;#39;header della response&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Esempio:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# ./check_web_form -a http://www.spam.com/login.php -i username=CiccioUser -i password=CiccioUser -C &amp;quot;^Logged in as:  CiccioUser&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# Esegue il submit di un form con action=&amp;quot;http://www.spam.com/login.php&amp;quot; e passa i campi username=CiccioUser e password=CiccioUser&lt;/span&gt;
&lt;span class="c1"&gt;# e controlla che nel risultato ci sia una riga che inizia con &amp;quot;Logged in as:  CiccioUser&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# ./check_web_form -a http://www.spam.com/login.php -i username=user -i password=Passw -H content-type=application/x-www-form-urlencoded -H &amp;quot;User-Agent=Mozilla&amp;quot; -m POST -c -u http://www.spam.com/smolla_il_cookie -R location=http://www.spam.com/*authenticated&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# * Prende il cookie all&amp;#39; URL http://www.spam.com/smolla_il_cookie (-u)&lt;/span&gt;
&lt;span class="c1"&gt;# * Tramite metodo POST invia gli header content-type=application/x-www-form-urlencoded e User-Agent=Mozilla (-H)&lt;/span&gt;
&lt;span class="c1"&gt;# * Invia i valori username e password (-i)&lt;/span&gt;
&lt;span class="c1"&gt;# * L&amp;#39;invio viene effettuato all&amp;#39;URL http://www.spam.com/login.php (-a)&lt;/span&gt;
&lt;span class="c1"&gt;# * La ricerca del risultato avviene negl&amp;#39;header location della risposta (-R)&lt;/span&gt;

&lt;span class="c1"&gt;# Se l&amp;#39;esito ha buon fine ritorna 0 e stampa OK ...&lt;/span&gt;
&lt;span class="c1"&gt;# Se fallisce ritorna 2 e stampa ERROR ...&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;optparse&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;httplib2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Http&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urllib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FormSubmitterOptionParser&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OptionParser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_required&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; option not supplied&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--method&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;HTTP method not implemented use GET or POST&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--input&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; must be in format &amp;quot;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FormSubmitterOptionParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;usage: %prog [options]&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-m&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--method&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;HTTP method (GET or POST), default &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;efault&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-i&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--input&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;append&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;input fileld name=value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--action&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Action of form&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--cookie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Support for cookie&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-u&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--cookie-url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;URL used to retrieve cookie&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--header&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;append&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Send header hdeadername=HeaderValue&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--content-match&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Check for regular expression match in content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-R&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--response-match&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;store&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Check for regular expression match in response ex: Status=^4??&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--debug&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;store_true&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Debug mode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Check required options&lt;/span&gt;
        &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# parser.check_required(&amp;#39;-i&amp;#39;)&lt;/span&gt;
        &lt;span class="c1"&gt;# check http method&lt;/span&gt;
        &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_method&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;# check values&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_input&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt;  &lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Error: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# make header dict&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c1"&gt;# make data dict&lt;/span&gt;
    &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Http&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;#headers = None&lt;/span&gt;

    &lt;span class="c1"&gt;# check in response Header&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response_match&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response_match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;response_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s*=s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response_match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# get page to read cookie&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cookie&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sending request to retrieve cookie:&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;URL: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Method: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Headers: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cookie_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cookie_url&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Response: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Content: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;set-cookie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Cookie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;set-cookie&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]})&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urlparse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlsplit&lt;/span&gt;
            &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urlparse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlunsplit&lt;/span&gt;

            &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urlsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# if exist query string&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urlunsplit&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
            &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;

        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;
            &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sending request:&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;URL: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Method: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Headers: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Body: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

        &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CRITICAL : &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Response: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Content: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Error: regexp not valid: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MULTILINE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;OK Found: &amp;quot;&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;response_match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Error: regexp not valid: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;response_name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;OK Found: &amp;quot;&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CRITICAL: response header &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; not found&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;response_name&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CRITICAL : Not found&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Download: &lt;a href="https://github.com/pbertera/junk/blob/master/nagios-stuff/check_web_form.py"&gt;check_web_form.py&lt;/a&gt;&lt;/p&gt;</summary><category term="http"></category><category term="nagios"></category><category term="python"></category></entry><entry><title>PowerChute con apcupsd</title><link href="https://www.bertera.it/powerchute-con-apcupsd.html" rel="alternate"></link><published>2008-09-03T17:37:00+02:00</published><updated>2008-09-03T17:37:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2008-09-03:powerchute-con-apcupsd.html</id><summary type="html">&lt;p&gt;Dalla versione 3.14 &lt;a href="http://www.apcupsd.org"&gt;apcupsd&lt;/a&gt; supporta il
protocollo PowerChute di APC:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.apcupsd.org/manual/Configuration_Examples.html#SECTION000135000000000000000"&gt;PowerChute Network Shutdown Driver
(PCNET)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I backport per Debian etch:
&lt;span&gt;&lt;a href="http://www.bertera.it/software/apcupsd/"&gt;http://www.bertera.it/software/apcupsd&lt;/a&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;</summary><category term="apcupsd"></category><category term="backports"></category><category term="debian"></category><category term="linux"></category><category term="powerchute"></category></entry><entry><title>SQL Server backup con Bacula</title><link href="https://www.bertera.it/sql-server-backup-con-bacula.html" rel="alternate"></link><published>2008-05-30T17:06:00+02:00</published><updated>2008-05-30T17:06:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2008-05-30:sql-server-backup-con-bacula.html</id><summary type="html">&lt;p&gt;In teoria con una versione recente di Bacula ed il supporto VSS si
dovrebbe poter eseguire il backup in maniera consistente prelevando
direttamente i file dei database.&lt;br /&gt;
Per chi non si fida
&lt;a href="https://github.com/pbertera/junk/blob/master/mssql-backup/dump.sql"&gt;questa&lt;/a&gt; stored
procedure esegue il dump di tutti i database utente in file .BAK.&lt;/p&gt;
&lt;p&gt;Viene installata ed eseguita tramite
&lt;a href="https://github.com/pbertera/junk/blob/master/mssql-backup/pre-backup.bat"&gt;questo&lt;/a&gt;
.bat richiamato da un “ClientRunBeforeJob”. (Ovvio che la directory che
contiene i .BAK deve essere compresa nel FIleSet del client).&lt;/p&gt;
&lt;p&gt;Lo script &lt;a href="https://github.com/pbertera/junk/blob/master/mssql-backup/post-backup.bat"&gt;post-bakup&lt;/a&gt;
si occupa di ripulire la directory di appoggio dai dump.&lt;/p&gt;</summary><category term="bacula"></category><category term="sql server"></category><category term="windows"></category></entry><entry><title>Kecho</title><link href="https://www.bertera.it/kecho.html" rel="alternate"></link><published>2006-05-21T16:41:00+02:00</published><updated>2006-05-21T16:41:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-05-21:kecho.html</id><summary type="html">&lt;p&gt;Kernel echo è un esempio di comunicazione tra userspace e kernelspace&lt;br /&gt;
&lt;a href="https://github.com/pbertera/junk/tree/master/kecho"&gt;kecho&lt;/a&gt;&lt;/p&gt;</summary><category term="kernel"></category><category term="networking"></category></entry><entry><title>Nettester</title><link href="https://www.bertera.it/nettester.html" rel="alternate"></link><published>2006-05-21T16:41:00+02:00</published><updated>2006-05-21T16:41:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-05-21:nettester.html</id><summary type="html">&lt;p&gt;un clone di netcat con supporto UDP&lt;br /&gt;
&lt;a href="https://github.com/pbertera/junk/tree/master/nettester"&gt;nettester&lt;/a&gt;&lt;/p&gt;</summary><category term="codin"></category><category term="networking"></category></entry><entry><title>rTCP</title><link href="https://www.bertera.it/rtcp.html" rel="alternate"></link><published>2006-05-21T16:40:00+02:00</published><updated>2006-05-21T16:40:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-05-21:rtcp.html</id><summary type="html">&lt;p&gt;rTCP è un modulo kernel che inverte i flag fin e syn dei pacchetti tcp
diretti verso un dato host.&lt;br /&gt;
Installato su due host permette di comunicare con un TCP “inverso”&lt;br /&gt;
&lt;a href="https://github.com/pbertera/junk/tree/master/rtcp"&gt;rtcp&lt;/a&gt;&lt;/p&gt;</summary><category term="kernel"></category></entry><entry><title>Camilla</title><link href="https://www.bertera.it/camilla.html" rel="alternate"></link><published>2006-05-21T16:38:00+02:00</published><updated>2006-05-21T16:38:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-05-21:camilla.html</id><summary type="html">&lt;p&gt;Camilla è un sistema di booking per camere e case, supporta agenzie
multiple e la gestione di calendari e stagioni.&lt;br /&gt;
&lt;img alt="camilla" src="https://www.bertera.it/camilla.jpg" /&gt;  &lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pbertera/junk/tree/master/camilla"&gt;camilla&lt;/a&gt;&lt;/p&gt;</summary><category term="booking"></category><category term="php"></category></entry><entry><title>Arpiglio</title><link href="https://www.bertera.it/arpiglio.html" rel="alternate"></link><published>2006-05-21T16:36:00+02:00</published><updated>2006-05-21T16:36:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-05-21:arpiglio.html</id><summary type="html">&lt;p&gt;un tool per forgiare pacchetti ARP/RARP da linea di comando.&lt;br /&gt;
&lt;a href="https://github.com/pbertera/junk/tree/master/arpiglio"&gt;arpiglio.c&lt;/a&gt;&lt;/p&gt;</summary><category term="arp"></category><category term="c"></category></entry><entry><title>Wireless Networking in the Developing World</title><link href="https://www.bertera.it/wireless-networking-in-the-developing-world.html" rel="alternate"></link><published>2006-05-21T16:34:00+02:00</published><updated>2006-05-21T16:34:00+02:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-05-21:wireless-networking-in-the-developing-world.html</id><summary type="html">&lt;p&gt;&lt;a href="http://wndw.net/"&gt;Wireless Networking in the Developing World&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.secdev.org/projects/scapy/"&gt;A powerful interactive packet manipulation
program&lt;/a&gt;&lt;/p&gt;</summary></entry><entry><title>Hacking della seriale</title><link href="https://www.bertera.it/hacking-della-seriale.html" rel="alternate"></link><published>2006-02-09T16:25:00+01:00</published><updated>2006-02-09T16:25:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-02-09:hacking-della-seriale.html</id><summary type="html">&lt;p&gt;Leggere e modificare lo stato dei pin di seganalzione della seriale:&lt;br /&gt;
&lt;a href="https://github.com/pbertera/junk/tree/master/serial"&gt;due script&lt;/a&gt;&lt;/p&gt;</summary><category term="serial port"></category></entry><entry><title>Software</title><link href="https://www.bertera.it/software.html" rel="alternate"></link><published>2006-02-05T16:22:00+01:00</published><updated>2006-02-05T16:22:00+01:00</updated><author><name>admin</name></author><id>tag:www.bertera.it,2006-02-05:software.html</id><summary type="html">&lt;p&gt;Era un progettino che avevo dato all’università : esegue dei backup
differenziali o full utilizzando rsync:
&lt;a href="https://github.com/pbertera/junk/tree/master/batbu"&gt;Batbu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bacula: i .deb per sarge della 1.38.5
&lt;a href="http://www.bertera.it/software/bacula-1.38.5/"&gt;bacula-1.38.5&lt;/a&gt; &lt;strong&gt;UPDATE:&lt;/strong&gt; non piu' mantenuto&lt;/p&gt;
&lt;p&gt;Plugin nagios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;check-imap-login&lt;/strong&gt; Un plugin per nagios per eseguire un login su un server IMAP (o IMAPS)
&lt;a href="https://github.com/pbertera/junk/blob/master/nagios-stuff/check_imap_login"&gt;chek-imap-login&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;chek-load-login&lt;/strong&gt; Altro plugin per verificare il carico di una macchina via ssh con due
soglie di allarme &lt;a href="https://github.com/pbertera/junk/blob/master/nagios-stuff/check_load_ssh"&gt;check_load_ssh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;check-horde-login&lt;/strong&gt; Plugin che fa il logon in horde web mail&lt;/li&gt;
&lt;/ul&gt;</summary><category term="bacula"></category><category term="nagios"></category><category term="python"></category><category term="rsync"></category><category term="script"></category></entry></feed>