<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Andrea Veri's Blog</title><description>Andrea Veri's Blog</description><link>https://www.dragonsreach.it//</link><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><language>en</language><docs>https://cyber.harvard.edu/rss/rss.html#requiredChannelElements</docs><lastBuildDate>Fri, 25 Jul 2025 09:39:36 +0000</lastBuildDate><ttl>60</ttl><item><dc:creator>Andrea Veri</dc:creator><title>AWP - The Awesome Weekend Project</title><description>&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="#table-of-contents">Table of Contents&lt;/a>&lt;/li>
&lt;li>&lt;a href="#introduction">Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="#mvp">MVP&lt;/a>&lt;/li>
&lt;li>&lt;a href="#the-learning-resources">The learning resources&lt;/a>&lt;/li>
&lt;li>&lt;a href="#preliminary-steps">Preliminary steps&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#configuration-on-ovn-control-plane">Configuration on ovn-control-plane&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuration-on-sweetrevenge">Configuration on sweetrevenge&lt;/a>&lt;/li>
&lt;li>&lt;a href="#configuration-on-flumina">Configuration on flumina&lt;/a>&lt;/li>
&lt;li>&lt;a href="#connectivity-test">Connectivity test&lt;/a>&lt;/li>
&lt;li>&lt;a href="#libvirt">Libvirt&lt;/a>&lt;/li>
&lt;li>&lt;a href="#rust">Rust&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#the-code">The code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#a-quick-peek-at-the-web-ui">A quick peek at the web UI&lt;/a>&lt;/li>
&lt;li>&lt;a href="#license">License&lt;/a>&lt;/li>
&lt;li>&lt;a href="#the-future">The future&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>One of those things that make Red Hat a special place are the so called &amp;ldquo;Learning days&amp;rdquo;, working days where you can primarily focus on improving your skills on subjects that then can have an impact on your team or organization and at the same time get you up to speed with newer technologies and trends. A few months back during one of these days I started getting my hands dirty with Rust. In the past I&amp;rsquo;ve been writing code in Go, due to its predominance in the k8s/Openshift world, so this really wasn&amp;rsquo;t my first experience with statically typed programming languages but the increased adoption Rust is having in multiple organizations and Open Source communities (with GNOME being one of them), its memory safety guardrails and the potential it has to slowly replace C in the very long run has hyped me to think it was a good idea for me to spend some time learning more about its internals.&lt;/p>
&lt;p>The best way for me to get more proficient with a specific programming language is to write code with it, that also means I had to find a project of some sort to work on. In the back of my brain I always wanted to build my own cloud infrastructure with ability to spawn multi-arch VMs, have them configured using cloud-init and finally have them be able to communicate with the internet in one way or another (NAT? VLAN trunks?). At the same time I wanted a nice web UI to show the state of the VMs, be able to schedule new ones and perform specific actions on them. This is what encouraged me at some point in the development process to also learn a bit of ReactJS in order to be able to make the web UI look fancier with dynamic state updates.&lt;/p>
&lt;p>Before actually starting any coding, I started thinking on what lower level technologies I was going to be using. The answer was OVN/OVS for the networking stack and libvirt/qemu for the virtualization layer. While Rust ships with a libvirt library I couldn&amp;rsquo;t find one for OVN so I had to code my own using the XML-RPC interface OVN ships with.&lt;/p>
&lt;p>While this started as a Red Hat Learning Day project, it slowly became something I started working on at late night and/or during weekends. This is the reason why I decided to call it the AWP or Awesome Weekend Project.&lt;/p>
&lt;h2 id="mvp">MVP&lt;/h2>
&lt;p>It was important for me to clearly define what the MVP (Minimal Viable Product) of this private cloud solution could potentially be. I drafted the following requirements and decided to release version 0.0.1 only when these were met:&lt;/p>
&lt;ol>
&lt;li>Ability to schedule a multi-arch VM using the API and the web UI&lt;/li>
&lt;li>Ability to select multiple different operating systems&lt;/li>
&lt;li>Ability for the system to boot using cloud-init and define a default password, also have a working networking stack&lt;/li>
&lt;li>Ability to connect to the internet with trunked vlans and provider networks&lt;/li>
&lt;li>Ability to configure a L2 network and have two VMs communicate at L2&lt;/li>
&lt;li>Ability for VMs using a flat network to receive an IP address via OVN&amp;rsquo;s DHCP feature&lt;/li>
&lt;li>Ability to display specs, status of a VM and other tenant components within the web UI&lt;/li>
&lt;li>Have a working agent that would run on each hypervisor, collect specific metrics and send them to the controller to be able to then apply specific scheduler logic based on those data points&lt;/li>
&lt;li>Have a basic scheduler in place&lt;/li>
&lt;li>Have a deployment mechanism that could help me speed up the coding to testing phase, ideally using Ansible&lt;/li>
&lt;/ol>
&lt;h2 id="the-learning-resources">The learning resources&lt;/h2>
&lt;p>I&amp;rsquo;d also like to share the resources I&amp;rsquo;ve used to learn Rust, associated libraries and ReactJS/TailwindCSS:&lt;/p>
&lt;ol>
&lt;li>The Rust Book - &lt;a href="https://doc.rust-lang.org/book">https://doc.rust-lang.org/book&lt;/a>&lt;/li>
&lt;li>Easy Rust - &lt;a href="https://dhghomon.github.io/easy_rust/Chapter_1.html">https://dhghomon.github.io/easy_rust/Chapter_1.html&lt;/a>&lt;/li>
&lt;li>ReactJS Course - &lt;a href="https://scrimba.com/learn-react-c0e">https://scrimba.com/learn-react-c0e&lt;/a>&lt;/li>
&lt;li>TailwindCSS Course - &lt;a href="https://scrimba.com/learn-tailwind-css-c010">https://scrimba.com/learn-tailwind-css-c010&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>The Rust libraries I&amp;rsquo;ve used the most:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://docs.rs/virt/latest/virt/">https://docs.rs/virt/latest/virt/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/rust-netlink/rtnetlink">https://github.com/rust-netlink/rtnetlink&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.rs/axum/latest/axum/">https://docs.rs/axum/latest/axum/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.rs/tokio/latest/tokio/">https://docs.rs/tokio/latest/tokio/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://serde.rs/">https://serde.rs/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/launchbadge/sqlx">https://github.com/launchbadge/sqlx&lt;/a>&lt;/li>
&lt;/ol>
&lt;p>and the VSCode extensions I&amp;rsquo;ve interacted with:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer">https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss">https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss&lt;/a>&lt;/li>
&lt;/ol>
&lt;h2 id="preliminary-steps">Preliminary steps&lt;/h2>
&lt;p>My cluster consists of three systems:&lt;/p>
&lt;ol>
&lt;li>Raspberry Pi 5 (aarch64), hostname: sweetrevenge&lt;/li>
&lt;li>Beelink EQR6 (AMD Ryzen 9 6900HX, 24G of RAM), hostname: flumina&lt;/li>
&lt;li>A virtual machine hosted on the Beelink that serves as the OVN and AWP controlplane, hostname: ovn-control-plane&lt;/li>
&lt;/ol>
&lt;h3 id="configuration-on-ovn-control-plane">Configuration on ovn-control-plane&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>root@ovn-control-plane ~&lt;span class="o">]&lt;/span>&lt;span class="c1"># subscription-manager list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Installed Product Status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+-------------------------------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Product Name: Red Hat Enterprise Linux Fast Datapath
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Product ID: &lt;span class="m">329&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version: &lt;span class="m">9&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Arch: x86_64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Product Name: Red Hat Enterprise Linux &lt;span class="k">for&lt;/span> x86_64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Product ID: &lt;span class="m">479&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version: 9.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Arch: x86_64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dnf install openvswitch3.5 ovn24.09-host ovn24.09-vtep ovn24.09-central
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now openvswitch
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now ovn-controller
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s1">&amp;#39;OVN_NORTHD_OPTS=&amp;#34;--db-nb-addr=ovn-control-plane --db-nb-create-insecure-remote=yes --db-sb-addr=ovn-control-plane --db-sb-create-insecure-remote=yes --db-nb-cluster-local-addr=ovn-control-plane --db-sb-cluster-local-addr=ovn-control-plane --ovn-northd-nb-db=tcp:ovn-control-plane:6641 --ovn-northd-sb-db=tcp:ovn-control-plane:6642&amp;#34;&amp;#39;&lt;/span> &amp;gt;&amp;gt; /etc/sysconfig/ovn
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now ovn-northd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-remote&lt;span class="o">=&lt;/span>tcp:ovn-control-plane:6642
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-encap-type&lt;span class="o">=&lt;/span>geneve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-encap-ip&lt;span class="o">=&lt;/span>192.168.1.15
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-bridge&lt;span class="o">=&lt;/span>br-int
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl show
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-sbctl show
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="configuration-on-sweetrevenge">Configuration on sweetrevenge&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt install ovn-central ovn-host
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now openvswitch-switch.service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-remote&lt;span class="o">=&lt;/span>tcp:ovn-control-plane:6642
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-encap-ip&lt;span class="o">=&lt;/span>192.168.1.12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-encap-type&lt;span class="o">=&lt;/span>geneve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-bridge&lt;span class="o">=&lt;/span>br-int
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl show
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-sbctl show
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="configuration-on-flumina">Configuration on flumina&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt install ovn-central ovn-host
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">systemctl &lt;span class="nb">enable&lt;/span> --now openvswitch-switch.service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-remote&lt;span class="o">=&lt;/span>tcp:ovn-control-plane:6642
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-encap-ip&lt;span class="o">=&lt;/span>192.168.1.17
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-encap-type&lt;span class="o">=&lt;/span>geneve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> open . external-ids:ovn-bridge&lt;span class="o">=&lt;/span>br-int
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl show
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-sbctl show
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="connectivity-test">Connectivity test&lt;/h3>
&lt;p>&lt;em>ovn-control-plane&lt;/em>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ovn-nbctl ls-add s0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-nbctl lsp-add s0 port01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-nbctl lsp-set-addresses port01 00:00:00:00:00:01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-nbctl lsp-add s0 port02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovn-nbctl lsp-set-addresses port02 00:00:00:00:00:02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip link add name veth01 &lt;span class="nb">type&lt;/span> veth peer name port01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns add ns0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip link &lt;span class="nb">set&lt;/span> dev veth01 netns ns0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip link &lt;span class="nb">set&lt;/span> dev lo up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip link &lt;span class="nb">set&lt;/span> dev veth01 up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip link &lt;span class="nb">set&lt;/span> veth01 address 00:00:00:00:00:01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip address add 10.0.0.1/24 dev veth01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip link &lt;span class="nb">set&lt;/span> dev port01 up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl add-port br-int port01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> Interface port01 external_ids:iface-id&lt;span class="o">=&lt;/span>port01
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">firewall-cmd --permanent --zone&lt;span class="o">=&lt;/span>public --add-port&lt;span class="o">=&lt;/span>6642/tcp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">firewall-cmd --permanent --zone&lt;span class="o">=&lt;/span>public --add-port&lt;span class="o">=&lt;/span>6081/udp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>sweetrevenge&lt;/em>:&lt;/p>
&lt;p>The RPi also requires building the geneve kernel module when using Raspberry Pi OS as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt install bc bison flex libssl-dev make
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --branch rpi-6.6.y https://github.com/raspberrypi/linux.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dpkg -l &lt;span class="p">|&lt;/span> grep raspi-firmware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ii raspi-firmware 1:1.20250305-1 all Raspberry Pi family GPU firmware and bootloaders
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Click on revision --&amp;gt; Browse files&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">https://github.com/raspberrypi/firmware/releases/tag/1.20250305
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl https://raw.githubusercontent.com/raspberrypi/firmware/f9ff9c8f22a148a555a2c090af9649ad84709dc4/extra/git_hash -o /root/git_hash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> linux
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git checkout &lt;span class="k">$(&lt;/span>cat /root/git_hash&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">ARCH&lt;/span>&lt;span class="o">=&lt;/span>arm64
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">KERNEL&lt;/span>&lt;span class="o">=&lt;/span>kernel_2712
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make bcm2712_defconfig
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -i &lt;span class="s1">&amp;#39;s/# CONFIG_GENEVE is not set/CONFIG_GENEVE=m/&amp;#39;&lt;/span> .config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Commit ID is taken from the matching kernel version as taken from uname -r&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl https://raw.githubusercontent.com/raspberrypi/firmware/f9ff9c8f22a148a555a2c090af9649ad84709dc4/extra/Module_2712.symvers -o Module.symvers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm /lib/modules/&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span>/build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ln -s /root/linux /lib/modules/&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span>/build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make -j6 Image.gz modules dtbs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp net/openvswitch/vport-geneve.ko /lib/modules/&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span>/kernel/net/openvswitch/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp drivers/net/geneve.ko /lib/modules/&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span>/kernel/drivers/net/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">depmod -a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">modprobe geneve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">update-initramfs -u
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm /lib/modules/&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span>/build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ln -s /usr/src/linux-headers-&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span> /lib/modules/&lt;span class="k">$(&lt;/span>uname -r&lt;span class="k">)&lt;/span>/build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># If something fails or the module cannot be loaded use:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># make mrproper&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># this will clean up build generated objects&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dkms status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">modprobe geneve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip link add name veth02 &lt;span class="nb">type&lt;/span> veth peer name port02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns add ns0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip link &lt;span class="nb">set&lt;/span> dev veth02 netns ns0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip link &lt;span class="nb">set&lt;/span> dev lo up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip link &lt;span class="nb">set&lt;/span> dev veth02 up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip link &lt;span class="nb">set&lt;/span> veth02 address 00:00:00:00:00:02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip netns &lt;span class="nb">exec&lt;/span> ns0 ip address add 10.0.0.2/24 dev veth02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ip link &lt;span class="nb">set&lt;/span> dev port02 up
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl add-port br-int port02 external_ids:iface-id&lt;span class="o">=&lt;/span>port02
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ovs-vsctl &lt;span class="nb">set&lt;/span> Interface port02 external_ids:iface-id&lt;span class="o">=&lt;/span>port02
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="libvirt">Libvirt&lt;/h3>
&lt;p>On every hypervisor run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">dnf install qemu-kvm libvirt-daemon qemu-img virsh libvirt-devel xorriso -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>On RPis:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt install qemu-system-arm qemu-efi-aarch64 libvirt-daemon-system xorriso libvirt-dev libvirt-clients -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Once the packages have been installed, make sure &lt;code>/var/lib/libvirt/images/RHEL9-base.qcow2&lt;/code> and generally any other OS image via $OS-base.qcow2 points to a &lt;code>Cloud&lt;/code> image, this is a specific image built for cloud platforms and comes with cloud-init out of the box, that means you won&amp;rsquo;t have to build your own via &lt;code>Image Builder&lt;/code> and &lt;a href="https://osbuild.org/docs/developer-guide/projects/composer-cli">composer-cli&lt;/a>, which is also unfortunately limited to be able to only compose images for the same RHEL/CentOS release the system is running on (i.e you cannot build a RHEL 10 image on RHEL 9).&lt;/p>
&lt;h3 id="rust">Rust&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># For the aarch64 binary use:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init -o rustup-init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">./rustup-init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>From there you can &lt;code>rustup&lt;/code> to manage your Rust installations and switch between them based on your needs.&lt;/p>
&lt;h2 id="the-code">The code&lt;/h2>
&lt;p>As I promised myself when I started developing this project, as soon as all the requirements I had in mind for the MVP were met, I&amp;rsquo;d have published the code on GitHub for general consumption and to potentially find more people interested in the idea and be willing to contribute to it further in case they found having a private cloud platform, that could serve the needs of an homelab and be 100% Open Source and based on Open Source technologies and at the same time being incredibly easy to setup, interesting.&lt;/p>
&lt;p>The AWP project code can be found at &lt;a href="https://github.com/averi/AWP">https://github.com/averi/AWP&lt;/a>, both the backend and frontend are stored within the same repository.&lt;/p>
&lt;h2 id="a-quick-peek-at-the-web-ui">A quick peek at the web UI&lt;/h2>
&lt;p>What post would this be without some screenshots?!&lt;/p>
&lt;div class="gallery">
&lt;figure>
&lt;img src="https://www.dragonsreach.it/img/awp-screenshot-1.png" alt="AWP Homepage"/>
&lt;figcaption>&lt;a href="https://www.dragonsreach.it/img/awp-screenshot-1.png">AWP Homepage&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/img/awp-screenshot-2.png" alt="Tenant view and new VM creation"/>
&lt;figcaption>&lt;a href="https://www.dragonsreach.it/img/awp-screenshot-2.png">Tenant view and new VM creation&lt;/a>&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;h2 id="license">License&lt;/h2>
&lt;p>I&amp;rsquo;ve chosen to release AWP under the GNU General Public License version 3 (GPLv3). I picked this license because of two main reasons:&lt;/p>
&lt;ol>
&lt;li>Keep AWP Open Source: The core principle behind GPLv3 is the so-called &amp;ldquo;copyleft.&amp;rdquo; This means if you take AWP&amp;rsquo;s code and make something new with it, you need to share your new creation under the same license and terms. This ensures that AWP and any projects based on it will always remain open-source for the whole community to benefit from. It prevents the project from being turned into a closed, proprietary product.&lt;/li>
&lt;li>Attribution: The GPLv3 requires that the original copyright notices are kept in the code. So, if someone uses or changes AWP, they must preserve the attribution (the Copyright header on each source file, that is) to the original authors and contributors. This helps recognizing the efforts of the original project author(s) who have put time, passion and dedication into code development and maintenance.&lt;/li>
&lt;/ol>
&lt;h2 id="the-future">The future&lt;/h2>
&lt;p>While AWP began as a personal learning activity, I believe it has the potential to evolve into something more concrete. Looking ahead, I can envision several enhancements that would significantly expand its capabilities. For instance, implementing a third networking mode in order to support VMs that are configured with a flat network and want to be able to connect to the internet through NAT, this can be easily achieved by leveraging existing OVN features such as Logical Routers.&lt;/p>
&lt;p>My hope, as I mentioned earlier, is that AWP won&amp;rsquo;t remain a one-man show. If you see value in AWP and are excited by the idea of shaping an open-source, easy-to-manage private cloud platform, I wholeheartedly encourage you to jump in. Whether it&amp;rsquo;s by contributing code, coming up with some initial documentation or by just sharing ideas, your involvement could be key to developing AWP further.&lt;/p></description><link>https://www.dragonsreach.it/2025/05/17/awp-the-awesome-weekend-project/</link><guid>https://www.dragonsreach.it/2025/05/17/awp-the-awesome-weekend-project/</guid><pubDate>Sat, 17 May 2025 11:39:39 -0400</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>2024 GNOME Infrastructure Annual Review</title><description>&lt;h2 id="table-of-contents">Table of Contents&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="#table-of-contents">Table of Contents&lt;/a>&lt;/li>
&lt;li>&lt;a href="#1-introduction">1. Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-achievements">2. Achievements&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#21-major-achievements">2.1. Major achievements&lt;/a>&lt;/li>
&lt;li>&lt;a href="#22-minor-achievements">2.2. Minor achievements&lt;/a>&lt;/li>
&lt;li>&lt;a href="#23-minor-annoyancesbugs-that-were-also-fixed-in-2024">2.3 Minor annoyances/bugs that were also fixed in 2024&lt;/a>&lt;/li>
&lt;li>&lt;a href="#23-our-brand-new-and-renewed-partnerships">2.3. Our brand new and renewed partnerships&lt;/a>&lt;/li>
&lt;li>&lt;a href="#expressing-my-gratitude">Expressing my gratitude&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="1-introduction">1. Introduction&lt;/h2>
&lt;p>Time is passing by very quickly and another year will go as we approach the end of 2024. This year has been fundamental in shaping the present and the future of GNOME&amp;rsquo;s Infrastructure with its major highlight being a completely revamped platform and a migration of all GNOME services over to AWS. In this post I&amp;rsquo;ll try to highlight what the major achievements have been throughout the past 12 months.&lt;/p>
&lt;h2 id="2-achievements">2. Achievements&lt;/h2>
&lt;p>In the below is a list of individual tasks and projects we were able to fulfill in 2024. This section will be particularly long but I want to stress the importance of each of these items and the efforts we put in to make sure they were delivered in a timely manner.&lt;/p>
&lt;h3 id="21-major-achievements">2.1. Major achievements&lt;/h3>
&lt;ol>
&lt;li>All the applications (except for ego, which we expect to handle as soon as next week or in January) were migrated to our new AWS platform (see &lt;a href="https://www.dragonsreach.it/2024/11/16/gnome-infrastructure-migration-to-aws/">GNOME Infrastructure migration to AWS&lt;/a>)&lt;/li>
&lt;li>During each of the apps migrations we made sure to:
&lt;ol>
&lt;li>Migrate to sso.gnome.org and make 2FA mandatory&lt;/li>
&lt;li>Make sure database connections are handled via connection poolers&lt;/li>
&lt;li>Double check the container images in use were up-to-date and GitLab CI/CD pipeline schedules were turned on for weekly rebuilds (security updates)&lt;/li>
&lt;li>For GitLab, we made sure repositories were migrated to an EBS volume to increase IO throughput and bandwidth&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>Migrated away our backup mechanism away from rdiff-backup into AWS Backup service (which handles both our AWS EFS and EBS snapshots)&lt;/li>
&lt;li>Retired our NSD install and migrated our authoritative name servers to CloudNS (it comes with multiple redundant authoritative servers, DDOS protection and automated DNSSEC keys rotation and management)&lt;/li>
&lt;li>We moved away from Ceph and the need to maintain our own storage solution and started leveraging AWS EFS and EBS&lt;/li>
&lt;li>We deprecated Splunk and built a solution around promtail and Loki in order to handle our logging requirements&lt;/li>
&lt;li>We deprecated Prometheus blackbox and started leveraging CloudNS monitoring service which we interact with using an API and a set of CI/CD jobs we host in GitHub&lt;/li>
&lt;li>We archived GNOME&amp;rsquo;s wiki and turned it into a static HTML copy&lt;/li>
&lt;li>We replaced ftpadmin with the GNOME Release Services, thanks speknik! More information around what steps should GNOME Maintainers now follow when doing a module release are available &lt;a href="https://handbook.gnome.org/maintainers/making-a-release.html">here&lt;/a>. The service uses JWT tokens to verify and authorize specific CI/CD jobs and only allows new releases when the process is initiated by a project CI living within the GNOME GitLab namespace and a protected tag. With master.gnome.org and ftpadmin being in production for literally ages, we wanted to find a better mechanism to release GNOME software and avoid a single maintainer SSH key leak to allow a possible attacker to tamper tarballs and potentially compromise milions of computers running GNOME around the globe. With this change we don&amp;rsquo;t leverage SSH anymore and most importantly we don&amp;rsquo;t allow maintainers to generate GNOME modules tarballs on their personal computers rather we force them to use CI/CD in order to achieve the same result. We&amp;rsquo;ll be coming up shortly with a dedicated and isolated runner that will only build jobs tagged as releasing GNOME software.&lt;/li>
&lt;li>We retired our mirroring infrastructure based on Mirrorbits and replaced it with our CDN partner, CDN77&lt;/li>
&lt;li>We decoupled GIMP mirroring service from GNOME&amp;rsquo;s one, GIMP now hosts its tarballs (and associated rsync daemon) on top of a different master node, thanks OSUOSL for sponsoring the VM that makes this possible!&lt;/li>
&lt;/ol>
&lt;h3 id="22-minor-achievements">2.2. Minor achievements&lt;/h3>
&lt;ol>
&lt;li>Retired multiple VMs: splunk, nsd0{1,2}, master, ceph-metrics, gitaly&lt;/li>
&lt;li>We started managing our DNS using an API and CI/CD jobs hosted in GitHub (this to avoid relying on GNOME&amp;rsquo;s GitLab which in case of unavailability would prevent us to update DNS entries)&lt;/li>
&lt;li>We migrated smtp.gnome.org to OSCI in order to not lose IP reputations and various whitelists we received throughout the years by multiple organizations&lt;/li>
&lt;li>We deprecated our former internal DNS authoritatives based on FreeIPA. We are now leveraging internal VPC resolvers and Route53 Private zones&lt;/li>
&lt;li>We deprecated all our OSUOSL GitLab runners due to particularly slow IO and high steal time and replaced them with a new Heztner EX44 instance, kindly sponsored by GIMP. OSUOSL is working on coming up with local storage on their Openstack platform. We are looking forward to test that and introduce new runners as soon as the solution will be made available&lt;/li>
&lt;li>Retired idm0{1,2} and redirected them to a new FreeIPA load balanced service at &lt;a href="https://idm.gnome.org">https://idm.gnome.org&lt;/a>&lt;/li>
&lt;li>We retired services which weren&amp;rsquo;t relevant for the community anymore: surveys.gnome.org, roundcube (aka webmail.gnome.org)&lt;/li>
&lt;li>We migrated nmcheck.gnome.org to Fastly and are using Synthetic responses to handle HTTP responses to clients&lt;/li>
&lt;li>We upgraded to Ansible Automation Platform (AAP) 2.5&lt;/li>
&lt;li>As part of the migration to our new AWS based platform, we upgraded Openshift to release 4.17&lt;/li>
&lt;li>We received a 2k grant from Microsoft which we are using for an Azure ARM64 GitLab runner&lt;/li>
&lt;li>All of our GitLab runners fleet are now hourly kept in sync using AAP (Ansible roles were built to make this happen)&lt;/li>
&lt;li>We upgraded Cachet to 3.x series and fixed dynamic status.gnome.org updates (via a customized version of cachet-monitor)&lt;/li>
&lt;li>OS Currency: we upgraded all our systems to RHEL 9&lt;/li>
&lt;li>We converted all our Openshift images that were using a web server to Nginx for consistency/simplicity&lt;/li>
&lt;li>Replaced NRPE with Prometheus metrics based logging, checks such as IDM replication and status are now handled via the Node Exporter textfile plugin&lt;/li>
&lt;li>Migrated download.qemu.org (yes, we also host some components of QEMU&amp;rsquo;s Infrastructure) to use nginx-s3-gateway, downloads are then served via CDN77&lt;/li>
&lt;/ol>
&lt;h3 id="23-minor-annoyancesbugs-that-were-also-fixed-in-2024">2.3 Minor annoyances/bugs that were also fixed in 2024&lt;/h3>
&lt;ol>
&lt;li>Invalid OCSP responses from CDN77, &lt;a href="https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1511">https://gitlab.gnome.org/Infrastructure/Infrastructure/-/issues/1511&lt;/a>&lt;/li>
&lt;li>With the migration to &lt;a href="https://gitlab.com/gitlab-org/build/CNG/-/issues/1853">USE_TINI&lt;/a> for GitLab, no gpg zombie processes are being generated anymore&lt;/li>
&lt;/ol>
&lt;h3 id="23-our-brand-new-and-renewed-partnerships">2.3. Our brand new and renewed partnerships&lt;/h3>
&lt;ol>
&lt;li>From November 2024 and ongoing, AWS will provide sponsorship and funding to the GNOME Project to sustain the majority of its infrastructure needs&lt;/li>
&lt;li>Red Hat kindly sponsored subscriptions for RHEL, Openshift, AAP as well as hosting, bandwidth for the GNOME Infrastructure throughout 2024&lt;/li>
&lt;li>CDN77 provided unlimited bandwidth / traffic on their CDN offering&lt;/li>
&lt;li>Fastly renewed their unlimited bandwidth / traffic plan on their Delivery/Compute offerings&lt;/li>
&lt;li>and thanks to OSUOSL, Packet, DigitalOcean, Microsoft for the continued hosting and sponsorship of a set of GitLab runners, virtual machines and ARM builders!&lt;/li>
&lt;/ol>
&lt;h3 id="expressing-my-gratitude">Expressing my gratitude&lt;/h3>
&lt;p>As I&amp;rsquo;m used to do at the end of each calendar year, I want to express my gratitude to Bartłomiej Piotrowski for our continued cooperation and also to Stefan Peknik for his continued efforts in developing the GNOME Release Service. We started this journey together many months ago when Stefan was trying to find a topic to base his CS bachelor thesis on. With this in mind I went straight into the argument of replacing ftpadmin with a better technology also in light of what happened with the xz case. Stefan put all his enthusiasm and professionality into making this happen and with the service going into production on the 11th of December 2024 history was made.&lt;/p>
&lt;p>That being said, we&amp;rsquo;re closing this year being extremely close to retire our presence from RAL3 which we expect to happen in January 2025. The GNOME Infrastructure will also send in a proposal to talk at GUADEC 2025, in Italy, to present and discuss all these changes with the community.&lt;/p></description><link>https://www.dragonsreach.it/2024/12/14/gnome-infrastructure-annual-review/</link><guid>https://www.dragonsreach.it/2024/12/14/gnome-infrastructure-annual-review/</guid><pubDate>Fri, 13 Dec 2024 16:29:20 -0500</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>GNOME Infrastructure migration to AWS</title><description>&lt;h2 id="1-some-historical-background">1. Some historical background&lt;/h2>
&lt;p>The GNOME Infrastructure has been hosted as part of one of Red Hat&amp;rsquo;s datacenters for over 15 years now. The &amp;ldquo;community cage&amp;rdquo;, which is how we usually define the hosting platform that backs up multiple Open Source projects including &lt;a href="https://www.osci.io">OSCI&lt;/a>, is made of a set of racks living within the RAL3 (located in Raleigh) datacenter. Red Hat has not only been contributing to GNOME by maintaining the Red Hat&amp;rsquo;s Desktop Team operational, sponsoring events (such as GUADEC) but has also been supporting the project with hosting, internet connectivity, machines, RHEL (and many other RH products subscriptions). When the infrastructure was originally stood up it was primarily composed of a set of bare metal machines, workloads were not yet virtualized at the time and many services were running directly on top of the physical nodes. The advent of virtual machines and later containers reshaped how we managed and operated every component. What however remained the same over time was the networking layout of these services: a single L2 and a shared (with other tenants) public internet L3 domains (with both IPv4 and IPv6).&lt;/p>
&lt;h2 id="recent-challenges">Recent challenges&lt;/h2>
&lt;p>When GNOME&amp;rsquo;s Openshift 4 environment was built back in 2020 we had to make specific calls:&lt;/p>
&lt;ol>
&lt;li>We&amp;rsquo;d have ran an Openshift Hyperconverged setup (with storage (Ceph), control plane, workloads running on top of the same subset of nodes)&lt;/li>
&lt;li>The total amount of nodes we received budget for was 3, this meant running with masters.schedulable=true&lt;/li>
&lt;li>We&amp;rsquo;d have kept using our former Ceph cluster (as it had slower disks, a good combination for certain workloads we run), this is however not supported by ODF (Openshift Data Foundation) and would have required some glue to make it completely functional&lt;/li>
&lt;li>Migrating GNOME&amp;rsquo;s private L2 network to L3 would have required an effort from Red Hat&amp;rsquo;s IT Network Team who generally contributes outside of their working hours, no changes were planned in this regard&lt;/li>
&lt;li>No changes were planned on the networking equipment side to make links redundant, that means a code upgrade on switches would have required a full services downtime&lt;/li>
&lt;/ol>
&lt;p>Over time and with GNOME&amp;rsquo;s users and contributors base growing (46k users registered in GitLab, 7.44B requests and 50T of traffic per month on services we host on Openshift and kindly served by Fastly&amp;rsquo;s load balancers) we started noticing some of our original architecture decisions weren&amp;rsquo;t positively contributing to platform&amp;rsquo;s availability, specifically:&lt;/p>
&lt;ol>
&lt;li>Every time an Openshift upgrade was applied, it resulted in a cluster downtime due to the unsupported double ODF cluster layout (one internal and one external to the cluster). The behavior was stuck block devices preventing the machines to reboot with associated high IO (and general SELinux labeling mismatches), with the same nodes also hosting OCP&amp;rsquo;s control plane it was resulting in API and other OCP components becoming unavailable&lt;/li>
&lt;li>With no L3 network, we had to create a next-hop on our own to effectively give internet access through NAT to machines without a public internet IP address, this was resulting in connectivity outages whenever the target VM would go down for a quick maintenance&lt;/li>
&lt;/ol>
&lt;h2 id="migration-to-aws">Migration to AWS&lt;/h2>
&lt;p>With budgets season for FY25 approaching we struggled finding the necessary funds in order to finally optimize and fill the gaps of our previous architecture. With this in mind we reached out to &lt;a href="https://aws.amazon.com/opensource/">AWS Open Source Program&lt;/a> and received a substantial amount for us to be able to fully transition GNOME&amp;rsquo;s Infrastructure to the public cloud.&lt;/p>
&lt;p>What we achieved so far:&lt;/p>
&lt;ol>
&lt;li>Deployed and configured VPC related resources, this step will help us resolve the need to have a next-hop device we have to maintain&lt;/li>
&lt;li>Deployed an Openshift 4.17 cluster (which uses a combination of network and classic load balancers, x86 control plane and arm64 workers)&lt;/li>
&lt;li>Deployed IDM nodes that are using a Wireguard tunnel between AWS and RAL3 to remain in sync&lt;/li>
&lt;li>Migrated several applications including SSO, Discourse, Hedgedoc&lt;/li>
&lt;/ol>
&lt;p>What&amp;rsquo;s upcoming:&lt;/p>
&lt;ol>
&lt;li>Migrating away from Splunk and use a combination of rsyslog/promtail/loki&lt;/li>
&lt;li>Keep migrating further applications, the idea is to fully decommission the former cluster and GNOME&amp;rsquo;s presence within Red Hat&amp;rsquo;s community cage during Q1FY25&lt;/li>
&lt;li>Introduce a &lt;a href="https://gitlab.gnome.org/Infrastructure/openshift-images/gnome-release-service">replacement&lt;/a> for master.gnome.org and GNOME tarballs installation&lt;/li>
&lt;li>Migrate applications to GNOME&amp;rsquo;s SSO&lt;/li>
&lt;li>Retire services such as GNOME&amp;rsquo;s wiki (MoinMoin, a static copy will instead be made available), NSD (authoritative DNS servers were outsourced and replaced with ClouDNS and GitHub&amp;rsquo;s pipelines for DNS RRs updates), Nagios, Prometheus Blackbox (replaced by ClouDNS endpoints monitoring service), Ceph (replaced by EBS, EFS, S3)&lt;/li>
&lt;li>Migrate smtp.gnome.org to OSCI in order to maintain current public IP&amp;rsquo;s reputation&lt;/li>
&lt;/ol>
&lt;p>And benefits of running GNOME&amp;rsquo;s services in AWS:&lt;/p>
&lt;ol>
&lt;li>Scalability, we can easily scale up our worker nodes pool&lt;/li>
&lt;li>We run our services on top of AWS SDN and can easily create networks, routing tables, benefit from faster connectivity options, redundant networking infrastructure&lt;/li>
&lt;li>Use EBS/EFS, don&amp;rsquo;t have to maintain a self-managed Ceph cluster, easily scale volumes IOPS&lt;/li>
&lt;li>Use a local to-the-VPC load balancer, less latency for traffic to flow between the frontend and our VPC&lt;/li>
&lt;li>Have access to AWS services such as AWS Shield for advanced DDOS protection (with one bringing down GNOME&amp;rsquo;s GitLab just a week ago)&lt;/li>
&lt;/ol>
&lt;p>I&amp;rsquo;d like to thank AWS (Tom &amp;ldquo;spot&amp;rdquo; Callaway, Mila Zhou) for their sponsorship and the massive opportunity they are giving to the GNOME&amp;rsquo;s Infrastructure to improve and provide resilient, stable and highly available workloads to GNOME&amp;rsquo;s users and contributors base. And a big thank you to Red Hat for the continued sponsorship over more than 15 years on making the GNOME&amp;rsquo;s Infrastructure run smoothly and efficiently, it&amp;rsquo;s crucial for me to emphatise how critical Red Hat&amp;rsquo;s long term support has been.&lt;/p></description><link>https://www.dragonsreach.it/2024/11/16/gnome-infrastructure-migration-to-aws/</link><guid>https://www.dragonsreach.it/2024/11/16/gnome-infrastructure-migration-to-aws/</guid><pubDate>Wed, 16 Oct 2024 20:25:12 -0400</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>2022 GNOME Infrastructure Annual Review</title><description>&lt;ul>
&lt;li>&lt;a href="#1-introduction">1. Introduction&lt;/a>&lt;/li>
&lt;li>&lt;a href="#2-achievements">2. Achievements&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#21-major-achievements">2.1. Major achievements&lt;/a>&lt;/li>
&lt;li>&lt;a href="#22-minor-achievements">2.2. Minor achievements&lt;/a>&lt;/li>
&lt;li>&lt;a href="#23-our-brand-new-and-renewed-partnerships">2.3. Our brand new and renewed partnerships&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#3-highlights">3. Highlights&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#31-openshift-4-architecture">3.1. Openshift 4: architecture&lt;/a>&lt;/li>
&lt;li>&lt;a href="#32-openshift-4-virtualization-networking">3.2. Openshift 4: virtualization networking&lt;/a>&lt;/li>
&lt;li>&lt;a href="#33-openshift-4-image-builds">3.3. Openshift 4: image builds&lt;/a>&lt;/li>
&lt;li>&lt;a href="#34-openshift-4-cluster-backups">3.4. Openshift 4: cluster backups&lt;/a>&lt;/li>
&lt;li>&lt;a href="#35-gitlab-on-openshift-4-setup">3.5. GitLab on Openshift 4: setup&lt;/a>&lt;/li>
&lt;li>&lt;a href="#36-gitlab-on-openshift-4-early-days">3.6. GitLab on Openshift 4: early days&lt;/a>&lt;/li>
&lt;li>&lt;a href="#37-gitlab-on-openshift-4-logging">3.7. GitLab on Openshift 4: logging&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#future-plans">Future plans&lt;/a>&lt;/li>
&lt;li>&lt;a href="#expressing-my-gratitude">Expressing my gratitude&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="1-introduction">1. Introduction&lt;/h2>
&lt;p>I believe it&amp;rsquo;s kind of vital for the GNOME Infrastructure Team to outline not only the amazing work that was put into place throughout the year, but also the challenges we faced including some of the architectural designs we implemented over the past 12 months. This year has been extremely challenging for multiple reasons, the top one being Openshift 3 (which we deployed in 2018) going EOL in June 2022. We also wanted to make sure we were keeping up with OS currency, specifically finalizing the migration of all our VM-based workloads to RHEL 8 and most importantly to Ansible. The main challenges there being adapting our workflow away from the Source-To-Image (s2i) mechanism into building our own infrastructure images directly through GitLab CI/CD pipelines by ideally also dropping the requirement of hosting an internal containers registry.&lt;/p>
&lt;p>With the community also deciding to move away from Mailman, we also had an hard deadline to finalize the migration to Discourse that was started back in 2018. At the same time the GNOME community was also looking towards a better Matrix to IRC integration while irc.gimp.org (GIMPNet) showing aging sypmptoms and being put into very low maintenance mode due to a lack of IRC operators/admins time.&lt;/p>
&lt;h2 id="2-achievements">2. Achievements&lt;/h2>
&lt;p>A list of each of the individual tasks and projects we were able to fulfill during 2022. This particular section will be particularly long but I want to stress the importance of each of these items and the efforts we put in to make sure they were delivered in a timely manner. A subset of these tasks will also receive further explanation in the sections to come.&lt;/p>
&lt;h3 id="21-major-achievements">2.1. Major achievements&lt;/h3>
&lt;ol>
&lt;li>Architected, deployed, operated an Openshift 4 cluster that replaced our former OCP 3 installation. This was a major undertaking that required a lot of planning, testing and coordination with the community. We also had to make sure we were able to migrate all our existing tenants from OCP 3 to OCP 4. A total of 46 tenants were migrated and/or created during these past 12 months.&lt;/li>
&lt;li>Developed a brand new workflow moving away from Source-To-Image (s2i) and towards GitLab CI/CD pipelines.&lt;/li>
&lt;li>Migrated from individual NSD based internal resolvers to FreeIPA&amp;rsquo;s self managed BIND resolvers, this gave us the possibility to use APIs and other IPA&amp;rsquo;s goodies to manage our internal DNS views.&lt;/li>
&lt;li>For existing virtual machines we wanted to keep around, we leveraged the Openshift Virtualization operator which allows you to benefit from kubevirt&amp;rsquo;s features and effectively run virtual machines from within an OCP cluster. That also includes support for VM templates and automatic bootstraping of VMs out of existing PVCs and/or externally hosted ISO files.&lt;/li>
&lt;li>We &lt;a href="https://gitlab.gnome.org/Infrastructure/openshift-images/accounts-automation-app">developed and deployed automation&lt;/a> for handling Membership and Accounts related requests. The &lt;a href="https://wiki.gnome.org/Infrastructure/NewAccounts">documentation&lt;/a> has also been updated accordingly.&lt;/li>
&lt;li>GitLab was migrated from a monolithic virtual machine to Openshift.&lt;/li>
&lt;li>We introduced DKIM/SPF support for GNOME Foundation members, please see my &lt;a href="https://discourse.gnome.org/t/announcement-upcoming-changes-to-gnomes-mail-infrastructure/11568">announcement&lt;/a> for a list of changes.&lt;/li>
&lt;li>We rebuilt all the VMs that were not retired due to the migration to OCP to RHEL 8&lt;/li>
&lt;li>We successfully migrated away from our Puppet infrastructure to Ansible (and Ansible collections). This particular task is a major milestone, Puppet has been around the GNOME Infrastructure for more than 15 years.&lt;/li>
&lt;/ol>
&lt;h3 id="22-minor-achievements">2.2. Minor achievements&lt;/h3>
&lt;ol>
&lt;li>Identified root cause and blocked a brute force attempt (from 600+ unique IP addresses) against our LDAP database directory. Some of you surely remind the times where you found your GNOME Account locked and you were unsure around why that was happening. This was the exact reason why. A particular remediation was applied temporarily, that also had the side effect of blocking HTTPs based git clones/pushes. That was resolved by moving GitLab to OpenID (via Keycloak) and using token based authentication.&lt;/li>
&lt;li>We moved static.gnome.org to S3 and put our CDN in front of it.&lt;/li>
&lt;li>Re-deployed bastion01, nsd01, nsd02, smtp, master, logs (rsyslog) using Ansible (this also includes building Ansible roles and replicating what we had in Puppet to Ansible)&lt;/li>
&lt;li>Deployed Minio S3 GW (cache) to avoid incurring in extra AWS S3 costs&lt;/li>
&lt;li>Deprecated OpenVPN in favor of Wireguard&lt;/li>
&lt;li>We deprecated GlusterFS entirely and completed our migration to Ceph RBD + CephFS&lt;/li>
&lt;li>We retired several VM based workloads that were either migrated to Openshift or superseded including reverse proxies, Puppet masters, GitLab, the entirety of OCP 3 virtual machines (with OCP 4 being installed on bare metals directly)&lt;/li>
&lt;li>Configured blackbox Prometheus exporter and moved services availability checks to it&lt;/li>
&lt;li>We retired people.gnome.org, barely used by anyone due to the multitude of alternatives we currently provide when it comes to host GNOME related files including GitLab pages, static.gnome.org, GitLab releases, Nextcloud.&lt;/li>
&lt;li>Started ingesting Prometheus metrics into our existing Prometheus cluster via federation, a wide set of dashboards were also created to keep track of the status of OCP, Ceph, general OS related metrics and databases.&lt;/li>
&lt;li>We migrated our databases to OCP: Percona MySQL operator, Crunchy PostgreSQL operator&lt;/li>
&lt;li>Rotated KSK and ZSK DNSSEC keys on gnome.org, gtk.org, gimp.{org,net} domains&lt;/li>
&lt;li>We migrated from obtaining Let&amp;rsquo;s Encrypt certificates using getssl to OCP CertManager operator. For edge routers, we migrated to certbot and deployed specific hooks to automate the handling of DNS-01 challenges.&lt;/li>
&lt;li>We migrated GIMP downloads from a plain httpd setup to use mirrorbits to match what the GNOME Project is operating.&lt;/li>
&lt;li>We deployed AAP (Red Hat Ansible Automation Platform) in order to be able to recreate hourly configuration management runs as we had before with Puppet. These runs are particularly crucial as they make sure the latest content from our Ansible repository is pulled and enforced across all the systems Ansible manages.&lt;/li>
&lt;li>&lt;a href="https://discourse.gnome.org/t/gnome-moves-away-from-gimpnet-on-nov-25-15-00-utc/12046">irc.gnome.org migration to Libera.Chat&lt;/a>, thanks Thibault Martin and Element for the amazing continued efforts supporting GNOME&amp;rsquo;s Matrix to IRC bridge integration!&lt;/li>
&lt;li>Migrated away from Mailman to Discourse. This particular item has been part of community discussions since 2018, after evaluation by the community itself and the GNOME Project governance the migration to Discourse started and was finalized this year, please read here for a list of &lt;a href="https://discourse.gnome.org/t/common-questions-re-mailman-to-discourse/11841">FAQs&lt;/a>.&lt;/li>
&lt;li>We introduced OpenID authentication (via Keycloak) to help resolve the fragmentation multiple different authentication backends were causing.&lt;/li>
&lt;li>We introduced &lt;a href="https://hedgedoc.gnome.org/">Hedgedoc&lt;/a>, an Etherpad replacement.&lt;/li>
&lt;li>We enhanced our Splunk cluster with additional dashboards, log based alerts, new sourcetypes&lt;/li>
&lt;li>We deprecated MeetBot (unused since several years) and CommitsBot, which we replaced with a beta Matrix bot called &lt;a href="https://matrix-org.github.io/matrix-hookshot/latest/">Hookshot&lt;/a>, which leverages GitLab webhooks in order to send notifications to Matrix rooms&lt;/li>
&lt;li>We upgraded FreeIPA to version 4.9.10, and on RHEL 8. We enhanced IPA backups to include hourly file system snapshots (on top of the existing rdiff-backup runs) and daily ipa-backup runs.&lt;/li>
&lt;li>&lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2022.html">We presented at GUADEC 2022&lt;/a>.&lt;/li>
&lt;/ol>
&lt;h3 id="23-our-brand-new-and-renewed-partnerships">2.3. Our brand new and renewed partnerships&lt;/h3>
&lt;ol>
&lt;li>Red Hat kindly sponsored subscriptions for RHEL, Ceph, Openshift, AAP&lt;/li>
&lt;li>Splunk doubled the sponsorship to a total of 10GB/day traffic&lt;/li>
&lt;li>AWS confirmed their partnership with a total of 5k USD credit&lt;/li>
&lt;li>CDN77 provided unlimited bandwidth / traffic on their CDN offering&lt;/li>
&lt;li>We&amp;rsquo;re extremely close to finalize our partnership with Fastly! They&amp;rsquo;ll be providing us with their Traffic Load Balancing product&lt;/li>
&lt;li>and thanks to OSUOSL, Packet, DigitalOcean for the continued hosting and sponsorship of a set of GitLab runners, virtual machines and ARM builders!&lt;/li>
&lt;/ol>
&lt;h2 id="3-highlights">3. Highlights&lt;/h2>
&lt;p>Without going too much deep into technical details I wanted to provide an overview of how we architected and deployed our Openshift 4 cluster and GitLab as these questions pop up pretty frequently among contributors.&lt;/p>
&lt;h3 id="31-openshift-4-architecture">3.1. Openshift 4: architecture&lt;/h3>
&lt;p>The cluster is currently setup with a total of 3 master nodes having similar specs (256G of RAM, 62 Cores, 2x10G NICs, 2x1G NICs) and acting in a hyperconverged setup. That implies we&amp;rsquo;re also hosting a Ceph cluster (in addition to the existing one we setup a while back) we deployed via the Red Hat Openshift Data Foundations operator on the same nodes. OCP (release 4.10), in this scenario, is deployed directly on bare metal with an ingress endpoint per individual node. The current limitation to this particular architecture is there&amp;rsquo;s no proper load balancing (other than DNS Round Robin) in front of these ingresses due to the fact external load balancers are particularly expensive. As I&amp;rsquo;ve mentioned earlier we&amp;rsquo;re really close to finalize a partnership with Fastly to help fill the gap here. These nodes receive their configuration using Ignition, we made sure a specific set of MachineConfigs is there to properly configure these systems once they boot due to the way CoreOS works in this regard. At boot time, it fetches an Ignition definition from the Machine Config Operator controller and applies it to the target node.&lt;/p>
&lt;h3 id="32-openshift-4-virtualization-networking">3.2. Openshift 4: virtualization networking&lt;/h3>
&lt;p>As I previously mentioned we&amp;rsquo;ve been leveraging OCP CNV to support our VM based workloads. I wanted to quickly highlight how we handled the configuration of our internal and public networks in order for these VMs to successfully consume these subnets and be able to communicate back and forth with other data center resources and services:&lt;/p>
&lt;ol>
&lt;li>A set of bonded interfaces was setup for both the 10G and the 1G NICs&lt;/li>
&lt;li>A bridge was configured on top of these bonded interfaces, that is required by Openshift Multus to effectively append the VM interfaces to each of these bridges depending what kind of subnet(s) they&amp;rsquo;re required to access&lt;/li>
&lt;li>We configured OCP Multus (bridge mode) and its dependant NetworkAttachmentDefinition&lt;/li>
&lt;li>From within an OCP CNV CRD, pass in:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">multus&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">networkName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">internal-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">nic-1&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>And a sample of the internal-network NetworkAttachmentDefinition:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">k8s.cni.cncf.io/v1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">NetworkAttachmentDefinition&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">internal-network&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">infrastructure&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">&amp;gt;-&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {&amp;#34;name&amp;#34;:&amp;#34;internal-network&amp;#34;,&amp;#34;cniVersion&amp;#34;:&amp;#34;0.3.1&amp;#34;,&amp;#34;plugins&amp;#34;:[{&amp;#34;type&amp;#34;:&amp;#34;cnv-bridge&amp;#34;,&amp;#34;bridge&amp;#34;:&amp;#34;br0-internal&amp;#34;,&amp;#34;mtu&amp;#34;:9000,&amp;#34;ipam&amp;#34;:{}},{&amp;#34;type&amp;#34;:&amp;#34;cnv-tuning&amp;#34;}]}&lt;/span>&lt;span class="w"> &lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="33-openshift-4-image-builds">3.3. Openshift 4: image builds&lt;/h3>
&lt;p>One of the major changes we implemented with the migration to OCP 4 was the way we built infrastructure related container images. In early days we were leveraging the s2i OCP feature which allowed building images out of a git repository, those builds were directly happening from within OCP worker nodes and pushed to the internal OCP registry. With the new setup what happens instead is:&lt;/p>
&lt;ol>
&lt;li>We create a new git repository containing an application and an associated Dockerfile&lt;/li>
&lt;li>From within that repository, we define a .gitlab-ci.yml file that inherits the build templates from a &lt;a href="https://gitlab.gnome.org/Infrastructure/openshift-images/ci-templates">common set of templates &lt;/a> we created&lt;/li>
&lt;li>The image is then built using GitLab CI/CD and pushed to quay.io&lt;/li>
&lt;li>On the target OCP tenant, we define an ImageStream and point it to the quay.io registry namespace/image combination&lt;/li>
&lt;li>From there the Deployment/DeploymentConfig resource is updated to re-use the previously created ImageStream, whenever the ImageStream changes, the deployment/deploymentconfig is triggered (via ImageChange triggers)&lt;/li>
&lt;/ol>
&lt;h3 id="34-openshift-4-cluster-backups">3.4. Openshift 4: cluster backups&lt;/h3>
&lt;p>When it comes to cluster backups we decided to take the following approach:&lt;/p>
&lt;ol>
&lt;li>&lt;a href="https://gitlab.gnome.org/Infrastructure/openshift-images/openshift-etcd-backup">Run daily etcd backups&lt;/a>&lt;/li>
&lt;li>Backup and dump all the tenants CRDs as json files to an encrypted S3 bucket using Velero&lt;/li>
&lt;/ol>
&lt;h3 id="35-gitlab-on-openshift-4-setup">3.5. GitLab on Openshift 4: setup&lt;/h3>
&lt;p>Moving away from hosting GitLab on a monolithic virtual machine was surely one of our top goals for 2022. The reason was particularly simple, anytime we needed to perform a maintenance we were required to cause a service downtime, even during a plain minor platform upgrade. On top of that, we couldn&amp;rsquo;t easily scale the cluster in case of sudden peeks in traffic, but generally when we originally designed our GitLab offering back in 2018 we missed a lot of the goodies OCP provides, the installation has worked well during all these years but the increasing usage of the service, the multitude of new GitLab sub-components made us rethink the way we had to design this particular offering to the community.&lt;/p>
&lt;p>These are the main reasons why we migrated GitLab to OCP using the GitLab OCP Operator. Using operator&amp;rsquo;s built-in declarative resources functionalities we could easily replicate our entire cluster config in a single yaml file, the operator at that point picked up each of our definitions and generated individual configmaps, deployments, scaleapps, services, routes and associated CRDs automatically. The only component we decided to not host via OCP directly but use a plain VM on OCP Virt was gitaly. The reason is particularly simple: gitaly requires port 22 to be accessible from outside of the cluster, that is currently not possible with the default haproxy based OCP ingress. We analyzed whether it made sense to deploy the NGINX ingress which also supports reverse proxying non-HTTP ports, we thought that&amp;rsquo;d have added additional complexity with no particular benefit. MetalL was also a possibility but the product itself is still a WIP, required sending out gARPs on the public network block we
share with other community tenants for L2, for L3 there was a need to setup BGP peering between each of the individual nodes (speakers using MetalLB terminology) and an adiacent router, overkill for a single VIP.&lt;/p>
&lt;h3 id="36-gitlab-on-openshift-4-early-days">3.6. GitLab on Openshift 4: early days&lt;/h3>
&lt;p>Right after the migration we started observing some instability with specific pods (webservice, sidekiq) backtracing after a few hours they were running, specifically:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">Nov &lt;span class="m">16&lt;/span> 05:08:03 master2.openshift4.gnome.org kernel: cgroup: fork rejected by pids controller in /kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podc69234f3_8596_477c_b7ea_5b51f6d86cce.slice/crio-d36391a108570d6daecf316d6d19ffc6650a3fa3a82ee616944b9e51266c901f.scope&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>also on kubepods.slice:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>core@master2 ~&lt;span class="o">]&lt;/span>$ cat /sys/fs/cgroup/pids/kubepods.slice/pids.max
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">4194304&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>It was clear the target pods were spawning a major set of new processes that were remaining around for the entire pod lifetime:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ ps aux &lt;span class="p">|&lt;/span> grep gpg &lt;span class="p">|&lt;/span> wc -l
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">773&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>And a sample out of the previous &amp;lsquo;ps aux&amp;rsquo; run:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">git &lt;span class="m">19726&lt;/span> 0.0 0.0 &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ? Z 09:58 0:00 &lt;span class="o">[&lt;/span>gpg&lt;span class="o">]&lt;/span> &amp;lt;defunct&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git &lt;span class="m">19728&lt;/span> 0.0 0.0 &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ? Z 09:58 0:00 &lt;span class="o">[&lt;/span>gpg&lt;span class="o">]&lt;/span> &amp;lt;defunct&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git &lt;span class="m">19869&lt;/span> 0.0 0.0 &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ? Z 10:06 0:00 &lt;span class="o">[&lt;/span>gpg&lt;span class="o">]&lt;/span> &amp;lt;defunct&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git &lt;span class="m">19871&lt;/span> 0.0 0.0 &lt;span class="m">0&lt;/span> &lt;span class="m">0&lt;/span> ? Z 10:06 0:00 &lt;span class="o">[&lt;/span>gpg&lt;span class="o">]&lt;/span> &amp;lt;defunct&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>It appears this specific bug was troubleshooted &lt;a href="https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/3989">already&lt;/a> by the GitLab Infrastructure Team around 4 years ago already. This misbehaviour is related to the intimate nature of GnuPG which requires calling its binaries (gpgconf, gpg, gpgsm, gpg-agent) for every required operation GitLab (webservice or sidekiq) asks it to perform. For some reason these processes never notified their parent process (PID 1 on that particular container) with a SIGCHLD and remained hanging around on the pods until pod&amp;rsquo;s dismissal. We&amp;rsquo;re in touch with the GitLab Open Source program support to understand next steps in order to have a fix implemented upstream.&lt;/p>
&lt;h3 id="37-gitlab-on-openshift-4-logging">3.7. GitLab on Openshift 4: logging&lt;/h3>
&lt;p>As part of our intent to migrate as much services as possible to our centralized rsyslog cluster (which then injects those logs into Splunk) we decided to approach GitLab&amp;rsquo;s logging on OCP this way:&lt;/p>
&lt;ol>
&lt;li>We mounted a shared PVC on each of the webservice/sidekiq pods, the target directory was the one GitLab was expected to send its logs by default (/var/log/gitlab)&lt;/li>
&lt;li>From there we deployed a separate rsyslogd deployment that was also mounting the same shared PVC&lt;/li>
&lt;li>We configured rsyslogd to relay those logs to our centralized rsyslog facility making sure proper facilities, tags, severities were also forwarded as part of the process&lt;/li>
&lt;li>Relevant configs, Dockerfile and associated deployment files are &lt;a href="https://gitlab.gnome.org/Infrastructure/openshift-images/gitlab-rsyslog">publicly available&lt;/a>&lt;/li>
&lt;/ol>
&lt;h2 id="future-plans">Future plans&lt;/h2>
&lt;p>Some of the tasks we have planned for the upcoming months:&lt;/p>
&lt;ol>
&lt;li>Move away from ftpadmin and replace it with a web application and/or CLI to securely install a sources tarball without requiring shell access. (Also introduced tarball signatures?)&lt;/li>
&lt;li>Introduce OpenID on GNOME&amp;rsquo;s Matrix homeserver, merge existing Foundation member accounts&lt;/li>
&lt;li>Migrate OCP ingress endpoints to Fastly LBs&lt;/li>
&lt;li>Upgrade Ceph to Ceph 5&lt;/li>
&lt;li>Look at migrating OCP to OVNKubernetes to start supporting IPv6 endpoints (again) - (minor priority)&lt;/li>
&lt;li>Load balance IPA&amp;rsquo;s DNS and LDAPs traffic (minor priority)&lt;/li>
&lt;li>Migrate GitLab runners Ansible roles and playbooks to AAP (minor priority)&lt;/li>
&lt;/ol>
&lt;h2 id="expressing-my-gratitude">Expressing my gratitude&lt;/h2>
&lt;p>I wanted to take a minute to thank all the individuals who helped us accomplishing this year amazing results! And a special thank you to Bartłomiej Piotrowski for his precious insights, technical skills and continued friendship.&lt;/p></description><link>https://www.dragonsreach.it/2022/12/14/gnome-infrastructure-annual-review/</link><guid>https://www.dragonsreach.it/2022/12/14/gnome-infrastructure-annual-review/</guid><pubDate>Mon, 12 Dec 2022 17:53:26 +0100</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>GNOME Infrastructure updates</title><description>&lt;p>As you may have noticed from outage and maintenance notes we sent out last week the GNOME Infrastructure has been undergoing a major redesign due to the need of moving to a different datacenter. It&amp;rsquo;s probably a good time to update the Foundation membership, contributors and generally anyone consuming the multitude of services we maintain of what we&amp;rsquo;ve been up to during these past months.&lt;/p>
&lt;h2 id="new-data-center">New Data Center&lt;/h2>
&lt;p>One of the core projects for 2020 was moving off services from the previous DC we were in (located in PHX2, Arizona) over to the Red Hat community cage located in RAL3. This specific task was made possible right after we received a new set of machines that allowed us to refresh some of the ancient hardware we had (with the average box dating back to 2013). The new layout is composed of a total of 5 (five) bare metals and 2 (two) core technologies: Openshift (v. 3.11) and Ceph (v. 4).&lt;/p>
&lt;p>The major improvements that are worth being mentioned:&lt;/p>
&lt;ol>
&lt;li>VMs can be easily scheduled across the hypervisors stack without having to copy disks over across hypervisors themselves. VM disks and data is now hosted within Ceph.&lt;/li>
&lt;li>IPv6 is available (not yet enabled/configured at the OS, Openshift router level)&lt;/li>
&lt;li>Overall better external internet uplink bandwidth&lt;/li>
&lt;li>Most of the VMs that we had running were turned into pods and are now successfully running from within Openshift&lt;/li>
&lt;/ol>
&lt;h2 id="rhel-8-and-ansible">RHEL 8 and Ansible&lt;/h2>
&lt;p>One of the things we had to take into account was running Ceph on top of RHEL 8 to benefit from its containarized setup. This originally presented itself as a challenge due to the fact RHEL 8 ships with a much newer Puppet release than the one RHEL 7 provides. At the same time we didn&amp;rsquo;t want to invest much time in upgrading our Puppet code base due to the amount of VMs we were able to migrate to Openshift and to the general willingess of slowly moving to use Ansible (client-side, no more need of maintaining server side pieces). On this specific regard we:&lt;/p>
&lt;ol>
&lt;li>Landed support for RHEL 8 provisioning&lt;/li>
&lt;li>Started experimenting with Image Based deployments (much more faster than Cobbler provisioning)&lt;/li>
&lt;li>Cooked a set of &lt;a href="https://gitlab.gnome.org/Infrastructure/ansible/-/tree/master/roles">base Ansible roles&lt;/a> to support our RHEL 8 installs including IDM, chrony, Satellite, Dell OMSA , NRPE etc.&lt;/li>
&lt;/ol>
&lt;h2 id="openshift">Openshift&lt;/h2>
&lt;p>As &lt;a href="https://www.dragonsreach.it/2018/10/18/2018-10-18-gnome-infrastructure-moving-to-openshift">originally announced&lt;/a>, the migration to the Openshift Container Platform (OSCP) has progressed and we now count a total of 34 tenants (including the entirety of GIMP websites). This allowed us to:&lt;/p>
&lt;ol>
&lt;li>Retire running VMs and prevented the need to upgrade their OS whenever they&amp;rsquo;re close to EOL. Also, in general, less maintenance burden&lt;/li>
&lt;li>Allow the community to easily provision services on top of the platform with total autonomy by choosing from a wide variety of frameworks, programming languages and database types (currently Galera and PSQL, both managed outside of OSCP itself)&lt;/li>
&lt;li>Easily scale the platform by adding more nodes/masters/routers whenever that is made necessary by additional load&lt;/li>
&lt;li>Data replicated and made redundant across a GlusterFS cluster (next on the list will be introducing Ceph support for pods persistent storage)&lt;/li>
&lt;li>Easily set up services such as Rocket.Chat and Discourse without having to mess much around with Node.JS or Ruby dependencies&lt;/li>
&lt;/ol>
&lt;h2 id="special-thanks">Special thanks&lt;/h2>
&lt;p>I&amp;rsquo;d like to thank Bartłomiej Piotrowski for all the efforts in helping me out with the migration during the past couple of weeks and Milan Zink from the Red Hat Storage Team who helped out reviewing the Ceph infrastructure design and providing useful information about possible provisioning techniques.&lt;/p></description><link>https://www.dragonsreach.it/2020/03/30/2020-03-30-gnome-infrastructure-updates/</link><guid>https://www.dragonsreach.it/2020/03/30/2020-03-30-gnome-infrastructure-updates/</guid><pubDate>Mon, 30 Mar 2020 12:20:23 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>The GNOME Infrastructure is moving to Openshift</title><description>&lt;p>During GUADEC 2018 we &lt;a href="https://www.dragonsreach.it/2018/07/30/back-from-guadec-2018">announced&lt;/a> one of the core plans of this and the coming year: it being moving as many GNOME web applications as possible to the GNOME Openshift instance we architected, deployed and configured back in July. Moving to Openshift will allow us to:&lt;/p>
&lt;ol>
&lt;li>Save up on resources as we&amp;rsquo;re deprecating and decommissioning VMs only running a single service&lt;/li>
&lt;li>Allow app maintainers to use the most recent Python, Ruby, preferred framework or programming language release without being tied to the release RHEL ships with&lt;/li>
&lt;li>Additional layer of security: containers&lt;/li>
&lt;li>Allow app owners to modify and publish content without requiring external help&lt;/li>
&lt;li>Increased apps redundancy, scalability, availability&lt;/li>
&lt;li>Direct integration with any VCS that ships with webhooks support as we can trigger the Openshift provided endpoint whenever a commit has occurred to generate a new build / deployment&lt;/li>
&lt;/ol>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;p>The cluster consists of 3 master nodes (controllers, api, etcd), 4 compute nodes and 2 infrastructure nodes (internal docker registry, cluster console, haproxy-based routers, SSL edge termination). For the persistent storage we&amp;rsquo;re currently making good use of the Red Hat Gluster Storage (RHGS) product that Red Hat is kindly sponsoring together with the Openshift subscriptions. For any app that might require a database we have an external (as not managed as part of Openshift) fully redundant, synchronous, multi-master MariaDB cluster based on Galera (2 data nodes, 1 arbiter).&lt;/p>
&lt;p>The release we&amp;rsquo;re currently running is the &lt;a href="https://docs.openshift.com/container-platform/3.11/release_notes/ocp_3_11_release_notes.html">recently released&lt;/a> 3.11, which comes with the so-called &amp;ldquo;Cluster Console&amp;rdquo;, a web UI that allows you to manage a wide set of the underlying objects that previously were only available to the oc cli client and with a set of Monitoring and Metrics toolings (Prometheus, Grafana) that can be accessed as part of the Cluster Console (Grafana dashboards that show how the cluster is behaving) or externally via their own route.&lt;/p>
&lt;h2 id="ssl-termination">SSL Termination&lt;/h2>
&lt;p>The SSL termination is currently happening on the edge routers via a wildcard certificate for the gnome.org and guadec.org zones. The process of renewing these certificates is automated via Puppet as we&amp;rsquo;re using Let&amp;rsquo;s Encrypt behind the scenes (domain verification for the wildcard certs happen at the DNS level, we built &lt;a href="https://gitlab.gnome.org/Infrastructure/sysadmin-bin/tree/master/letsencrypt">specific hooks&lt;/a> in order to make that happen via the &lt;a href="https://github.com/srvrco/getssl">getssl&lt;/a> tool). The backend connections are following two different paths:&lt;/p>
&lt;ol>
&lt;li>edge termination with no re-encryption in case of pods containing static files (no logins, no personal information ever entered by users): in this case the traffic is encrypted between the client and the edge routers, plain text between the routers and the pods (as they&amp;rsquo;re running on the same local broadcast domain)&lt;/li>
&lt;li>re-encrypt for any service that requires authentication or personal information to be entered for authorization: in this case the traffic is encrypted from end to end&lt;/li>
&lt;/ol>
&lt;h2 id="app-migrations">App migrations&lt;/h2>
&lt;p>App migrations have started already, we&amp;rsquo;ve successfully migrated and deprecated a set of GUADEC-related web applications, specifically:&lt;/p>
&lt;ol>
&lt;li>$year.guadec.org where $year spaces from 2013 to 2019&lt;/li>
&lt;li>wordpress.guadec.org has been deprecated&lt;/li>
&lt;/ol>
&lt;p>We&amp;rsquo;re currently working on migrating the GNOME Paste website making sure we also replace the current unmaintained software to a &lt;a href="https://github.com/LINKIWI/modern-paste">supported one&lt;/a>. Next on the list will be the Wordpress-based websites such as &lt;a href="https://www.gnome.org">www.gnome.org&lt;/a> and blogs.gnome.org (Wordpress Network). I&amp;rsquo;d like to thank the GNOME Websites Team and specifically &lt;strong>Tom Tryfonidis&lt;/strong> for taking the time to migrate existing assets to the new platform as part of the GNOME websites refresh program.&lt;/p></description><link>https://www.dragonsreach.it/2018/10/18/2018-10-18-gnome-infrastructure-moving-to-openshift/</link><guid>https://www.dragonsreach.it/2018/10/18/2018-10-18-gnome-infrastructure-moving-to-openshift/</guid><pubDate>Thu, 18 Oct 2018 10:27:23 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Back from GUADEC 2018</title><description>&lt;p>Been a while since GUADEC 2018 has ended but subsequent travels and tasks reduced the time to write up a quick summary of what happened during this year&amp;rsquo;s GNOME conference. The topics I&amp;rsquo;d like to emphasize mainly are:&lt;/p>
&lt;ul>
&lt;li>We&amp;rsquo;re hiring another Infrastructure Team member&lt;/li>
&lt;li>We&amp;rsquo;ve successfully finalized the cgit to GitLab migration&lt;/li>
&lt;li>Future plans including the migration to Openshift&lt;/li>
&lt;/ul>
&lt;h2 id="gnome-foundation-hirings">GNOME Foundation hirings&lt;/h2>
&lt;p>With the recent donation of 1M the Foundation has started recruiting on a variety of different new professional roles including a new Infrastructure team member. On this side I want to make sure that although the &lt;a href="https://www.gnome.org/foundation/careers/devops-sysadmin/">job description&lt;/a> mentions the word &lt;strong>sysadmin&lt;/strong> the figure we&amp;rsquo;re looking for is a systems engineer with a proven experience on Cloud computing platforms and tools such as AWS, Openshift and generally configuration management softwares such as Puppet and Ansible. Additionally this person should prove to have a clear understanding of the network and operating system (mainly RHEL) layers.&lt;/p>
&lt;p>We&amp;rsquo;ve already identified a set of candidates and will be proceeding with interviews in the coming weeks. This doesn&amp;rsquo;t mean we&amp;rsquo;ve hired anyone already, please keep sending CVs if interested and feeling the position would match your skills and expectations.&lt;/p>
&lt;h2 id="cgit-to-gitlab">cgit to GitLab&lt;/h2>
&lt;p>As announced on several occasions the GNOME Infrastructure has &lt;a href="https://mail.gnome.org/archives/desktop-devel-list/2018-May/msg00051.html">successfully finalized the cgit to GitLab migration&lt;/a>. From a read-only view against .git directories to a fully compliant CI/CD infrastructure. The next step on this side will be deprecating Bugzilla which has already started with bugmasters turning products read-only in case they were migrated to the new platform or by identifying whether any of the not-yet-migrated products can be archived. The idea here is waiting to see zero activity on BZ in terms of new comments to existing bugs and no new bugs being submitted at all (we have redirects in place to make sure whenever enter_bug.cgi is triggered the request gets sent to the /issues/new endpoint for that specific GitLab project) and then turn the entire BZ instance into an HTML archive for posterity and to reduce the maintenance burden of keeping an instance up-to-date with upstream in terms of CVEs.&lt;/p>
&lt;p>Thanks to all the involved parties including Carlos, Javier and GitLab itself given the prompt and detailed responses they always provided to our queries. Also thanks for sponsoring our AWS activities related to GitLab!&lt;/p>
&lt;h2 id="future-plans">Future plans&lt;/h2>
&lt;p>With the service == VM equation we&amp;rsquo;ve been following for several years it&amp;rsquo;s probably time for us to move to a more scalable infrastructure. The next generation platform we&amp;rsquo;ve picked up is going to be Openshift, its benefits:&lt;/p>
&lt;ol>
&lt;li>It&amp;rsquo;s not important where a service runs behind scenes: it only has to run (VM vs pods and containers that are part of a pod that get scheduled randomly on the available Openshift nodes)&lt;/li>
&lt;li>Easily scalable in case additional resources are needed for a small period of time&lt;/li>
&lt;li>Built-in monitoring starting from Openshift 3.9 (the release we&amp;rsquo;ll be running) based on Prometheus (+ Grafana for dashboarding)&lt;/li>
&lt;li>GNOME services as containers&lt;/li>
&lt;li>Individual application developers to schedule their own builds and see their code deployed with one click directly in production&lt;/li>
&lt;/ol>
&lt;p>The base set of VMs and bare metals has been already configured. Red Hat has been so great to provide the GNOME Project with a set of Red Hat Container Platform (and GlusterFS for heketi-based brick provisioning) subscriptions. We&amp;rsquo;ll start moving over to the infrastructure in the coming weeks. It&amp;rsquo;s going to take some good time but in the end we&amp;rsquo;ll be able to free up a lot of resources and retire several VMs and related deprecated configurations.&lt;/p>
&lt;h2 id="misc">Misc&lt;/h2>
&lt;p>Slides from the Foundation AGM Infrastructure team report are available &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec2018.html">here&lt;/a>.&lt;/p>
&lt;p>Many thanks to the GNOME Foundation for the sponsorship of my travel!&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/img/2018-GUADEC-badge.png" alt="GUADEC 2018 Badge">&lt;/p></description><link>https://www.dragonsreach.it/2018/07/30/back-from-guadec-2018/</link><guid>https://www.dragonsreach.it/2018/07/30/back-from-guadec-2018/</guid><pubDate>Mon, 30 Jul 2018 10:27:23 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Adding reCAPTCHA v2 support to Mailman</title><description>&lt;p>As a follow-up to the reCAPTCHA v1 &lt;a href="https://www.dragonsreach.it/2014/05/03/adding-recaptcha-support-to-mailman/">post&lt;/a> published back in 2014 here it comes an updated version for migrating your Mailman instance off from version 1 (being decommissioned on the 31th of March 2018) to version 2. The &lt;a href="https://pypi.python.org/pypi/recaptcha-client">original python-recaptcha library&lt;/a> was forked into &lt;a href="https://github.com/redhat-infosec/python-recaptcha">https://github.com/redhat-infosec/python-recaptcha&lt;/a> and made compatible with reCAPTCHA version 2.&lt;/p>
&lt;p>The relevant changes against the original library can be resumed as follows:&lt;/p>
&lt;ol>
&lt;li>Added ‘version=2’ against displayhtml, load_scripts functions&lt;/li>
&lt;li>Introduce the v2submit (along with submit to keep backwards compatibility) function to support reCAPTCHA v2&lt;/li>
&lt;li>The updated library is backwards compatible with version 1 to avoid unexpected code breakages for instances still running version 1&lt;/li>
&lt;/ol>
&lt;p>The required changes are located on the following files:&lt;/p>
&lt;p>&lt;strong>/usr/lib/mailman/Mailman/Cgi/listinfo.py&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span> &lt;span class="n">listinfo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span> &lt;span class="mi">2018&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">26&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">56&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mf">48.000000000&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">0000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+++&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">usr&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">lib&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">listinfo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span> &lt;span class="mi">2018&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">26&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">08&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mf">34.000000000&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">0000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">7&lt;/span> &lt;span class="o">@@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">i18n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.htmlformat&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.Logging.Syslog&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">syslog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>&lt;span class="kn">from&lt;/span> &lt;span class="nn">recaptcha.client&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">captcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Set up i18n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">i18n&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">_&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">244&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">245&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">10&lt;/span> &lt;span class="o">@@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;&amp;lt;mm-lang-form-start&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">FormatFormStart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;listinfo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;&amp;lt;mm-fullname-box&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">FormatBox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;fullname&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="c1"># Captcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;&amp;lt;mm-recaptcha-javascript&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">captcha&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">displayhtml&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mm_cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RECAPTCHA_PUBLIC_KEY&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">use_ssl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">version&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;&amp;lt;mm-recaptcha-script&amp;gt;&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">captcha&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load_script&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">version&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Do the expansion.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">AddItem&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ParseTags&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;listinfo.html&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">replacements&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lang&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span> &lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Format&lt;/span>&lt;span class="p">()&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>/usr/lib/mailman/Mailman/Cgi/subscribe.py&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span> &lt;span class="n">subscribe&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span> &lt;span class="mi">2018&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">26&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">56&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mf">38.000000000&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">0000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+++&lt;/span> &lt;span class="o">/&lt;/span>&lt;span class="n">usr&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">lib&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">subscribe&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span> &lt;span class="mi">2018&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">02&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">26&lt;/span> &lt;span class="mi">14&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">08&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mf">18.000000000&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">0000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">7&lt;/span> &lt;span class="o">@@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.UserDesc&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">UserDesc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.htmlformat&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.Logging.Syslog&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">syslog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>&lt;span class="kn">from&lt;/span> &lt;span class="nn">recaptcha.client&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">captcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">SLASH&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ERRORSEP&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="se">\n\n&lt;/span>&lt;span class="s1">&amp;lt;p&amp;gt;&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">165&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">166&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">17&lt;/span> &lt;span class="o">@@&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">results&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;There was no hidden token in your submission or it was corrupted.&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">results&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;You must GET the form before submitting it.&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="c1"># recaptcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">captcha_response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">captcha&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">v2submit&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">cgidata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getvalue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;g-recaptcha-response&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">mm_cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RECAPTCHA_PRIVATE_KEY&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">remote&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">captcha_response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_valid&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">results&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Invalid captcha: &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">captcha_response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">error_code&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Was an attempt made to subscribe the list to itself?&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">email&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">GetListEmail&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">syslog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;mischief&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Attempt to self subscribe &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s1">: &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">email&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">remote&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>
&lt;strong>/usr/lib/mailman/templates/en/listinfo.html&lt;/strong>
&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">--- listinfo.html 2018-02-26 15:02:34.000000000 +0000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+++ /usr/lib/mailman/templates/en/listinfo.html 2018-02-26 14:18:52.000000000 +0000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">@@ -3,7 +3,7 @@
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">HTML&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">HEAD&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">TITLE&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">MM-List-Name&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> Info Page&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">TITLE&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">MM-Recaptcha-Script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">HEAD&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">BODY&lt;/span> &lt;span class="na">BGCOLOR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;#ffffff&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">@@ -116,6 +116,11 @@
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">mm-digest-question-end&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Please fill out the following captcha&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">mm-recaptcha-javascript&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">TD&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">td&lt;/span> &lt;span class="na">colspan&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;3&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">center&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;&lt;/span>&lt;span class="nt">MM-Subscribe-Button&lt;/span>&lt;span class="p">&amp;gt;&amp;lt;/&lt;/span>&lt;span class="nt">center&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>
The updated RPMs are being rolled out to Fedora, EPEL 6 and EPEL 7. In the meantime you can find them &lt;a href="https://fedorapeople.org/~averi/RPMs/python-recaptcha-client">here&lt;/a>.
&lt;/p></description><link>https://www.dragonsreach.it/2018/02/26/adding-recaptcha-v2-support-mailman/</link><guid>https://www.dragonsreach.it/2018/02/26/adding-recaptcha-v2-support-mailman/</guid><pubDate>Mon, 26 Feb 2018 15:13:09 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>A childhood’s dream</title><description>&lt;p>Six months since my &lt;a href="https://www.dragonsreach.it/2015/12/02/three-years-and-counting/">latest blog post&lt;/a> is definitely a lot and reminds me how difficult this year has been for me in many ways. Back in June 2015 I received a job proposal as a Systems and Network Engineer from a company located in Padova, a city in the north-east part of Italy which is around 150km (around 93 miles) away from my home-town. The offer looked very interesting and I went for it. The idea I originally had was to relocate there but the extremely high costs of rents (the city is well known in Italy as one of the best places to take University courses on several faculties) and the fact I really wanted to experiment on whether the job description was actually going to match the expectations I had, I opted to not relocate at all and travel daily to work by train (a total of 4 hours per day spent travelling).&lt;/p>
&lt;p>I still recall one of my friends saying me “I am sure you won’t make it for more than two weeks” and how satisfying has been mentioning him a few days ago I &lt;strong>did make&lt;/strong> it for roughly one year. Spending around 4 hours every day on a train hasn’t been that fun but the passion and love for what I’ve been doing has helped me overcoming the difficulties I encountered. At some point something I honestly was expecting arrived: my professional grow at the company was completely stuck. While I initially told myself the moment was surely going to not persist much longer, the opposite happened.&lt;/p>
&lt;p>For a passionate, enthusiast and “hungry” person like I am that was one of the worst situations that could ever happened and it was definitely time for me to look at new opportunities. That’s where my childhood’s dream became reality: I will be joining the &lt;strong>Platform Operations Team&lt;/strong> at &lt;strong>Red Hat&lt;/strong> as a &lt;strong>System Administrator&lt;/strong> starting from mid-July! Being part of a great family which cares about Open Source and its values makes me proud and I would really like to thank Red Hat for this incredible opportunity.&lt;/p>
&lt;p>On a side note I will be in Brno between the 14th and the 16th of July, please drop me a note if you want to have a drink together!&lt;/p></description><link>https://www.dragonsreach.it/2016/07/05/a-childhood-dream/</link><guid>https://www.dragonsreach.it/2016/07/05/a-childhood-dream/</guid><pubDate>Tue, 05 Jul 2016 21:26:39 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Three years and counting</title><description>&lt;p>It’s been a while since my last “what’s been happening behind the scenes” e-mail so I’m here to report on what has been happening within the GNOME Infrastructure, its future plans and my personal sensations about a challenge that started around three (3) years ago when &lt;a href="https://plus.google.com/115250422803614415116/posts" target="_blank">Sriram Ramkrishna&lt;/a> and &lt;a href="http://www.digitalprognosis.com/" target="_blank">Jeff Schroeder&lt;/a> proposed my name as a possible candidate for coordinating the team that runs the systems behind the GNOME Project. All this followed by the &lt;a href="https://www.gnome.org/news/2013/03/behind-the-scene-andrea-veri-is-new-gnome-part-time-sysadmin/" target="_blank">official hiring&lt;/a> achieved by &lt;a href="https://en.wikipedia.org/wiki/Karen_Sandler" target="_blank">Karen Sandler&lt;/a> back in February 2013.&lt;/p>
&lt;p>The &lt;strong>GNOME Infrastructure&lt;/strong> has finally reached stability both in terms of reliability and uptime, we didn’t have any service disruption this and the past year and services have been running smoothly as they were expected to in a project like the one we are managing.&lt;/p>
&lt;p>As many of you know service disruptions and a total lack of maintenance were very common before I joined back in 2013, I’m so glad the situation has dramatically changed and developers, users, passionates are now able to reach our websites, code repositories, build machines without experiencing slowness, downtimes or&lt;/p>
&lt;p>unreachability. Additionally all these groups of people now have a reference point they can contact in case they need help when coping with the infrastructure they daily use. The ticketing system allows users to get in touch with the members of the &lt;span class="il">Sysadmin&lt;/span> Team and receive support right away within a very short period of time (Also thanks to &lt;a href="https://www.pagerduty.com" target="_blank">Pagerduty&lt;/a>, service the Foundation is kindly sponsoring)&lt;/p>
&lt;p>Before moving ahead to the future plans I’d like to provide you a summary of what has been done during these roughly three years so you can get an idea of why I define the changes that happened to the infrastructure a complete revamp:&lt;/p>
&lt;ol>
&lt;li>Recycled several ancient machines migrating services off of them while consolidating them by placing all their configuration on our central configuration management platform ran by Puppet. This includes a grand total of 7 machines that were replaced by new hardware and extended warranties the Foundation kindly sponsored.&lt;/li>
&lt;li>We strenghten our websites security by introducing SSL certificates everywhere and recently replacing them with SHA2 certificates.&lt;/li>
&lt;li>We introduced several services such as Owncloud, the Commits Bot, the Pastebin, the Etherpad, Jabber, the GNOME Github mirror.&lt;/li>
&lt;li>We restructured the way we backup our machines also thanks to the Fedora Project sponsoring the disk space on their backup facility. The way we were used to handle backups drastically changed from early years where a magnetic tape facility was in charge of all the burden of archiving our data to today where a NetApp is used together with &lt;a href="http://www.nongnu.org/rdiff-backup/" target="_blank">rdiff-backup&lt;/a>.&lt;/li>
&lt;li>We upgraded Bugzilla to the latest release, a huge thanks goes to Krzesimir Nowak who kindly helped us building the migration tools.&lt;/li>
&lt;li>We introduced the &lt;a href="https://wiki.gnome.org/Sysadmin/Apprentices" target="_blank">GNOME Apprentice program&lt;/a> open-sourcing our internal Puppet repository and cleansing it (shallow clones FTW!) from any sensitive information which now lives on a different repository with restricted access.&lt;/li>
&lt;li>We retired Mango and our OpenLDAP instance in favor of &lt;a href="https://account.gnome.org" target="_blank">FreeIPA&lt;/a> which allows users to modify their account information on their own without waiting for the Accounts Team to process the change.&lt;/li>
&lt;li>We &lt;a href="https://wiki.gnome.org/Sysadmin/SOP" target="_blank">documented&lt;/a> how our internal tools are customized to play together making it easy for future &lt;span class="il">Sysadmin&lt;/span> Team members to learn how the infrastructure works and supersede existing members in case they aren’t able to keep up their position anymore.&lt;/li>
&lt;li>We started providing hosting to the GIMP and GTK projects which now completely rely on the GNOME Infrastructure. (DNS, email, websites and other services infrastructure hosting)&lt;/li>
&lt;li>We started providing hosting not only to the GIMP and GTK projects but to localized communities as well such as GNOME Hispano and GNOME Greece&lt;/li>
&lt;li>We configured proper monitoring for all the hosted services thanks to Nagios and Check-MK&lt;/li>
&lt;li>We migrated the IRC network to a newer ircd with proper IRC services (Nickserv, Chanserv) in place.&lt;/li>
&lt;li>We made sure each machine had a configured management (mgmt) and KVM interface for direct remote access to the bare metal machine itself, its hardware status and all the operations related to it. (hard reset, reboot, shutdown etc.)&lt;/li>
&lt;li>We &lt;a href="https://mail.gnome.org/archives/infrastructure-announce/2013-May/msg00000.html" target="_blank">upgraded MoinMoin&lt;/a> to the latest release and made a substantial cleanup of old accounts, pages marked as spam and trashed pages.&lt;/li>
&lt;li>We deployed DNSSEC for several domains we manage including gnome.org, guadec.es, gnomehispano.es, guadec.org, gtk.org and gimp.org&lt;/li>
&lt;li>We &lt;a href="https://mail.gnome.org/archives/infrastructure-announce/2014-March/msg00000.html" target="_blank">introduced an account de-activation policy&lt;/a> which comes into play when a contributor not committing to any of the hosted repositories at git.gnome.org since two years is caught by the script. The account in question is marked as inactive and the gnomecvs (from the old cvs days) and ftpadmin groups are removed.&lt;/li>
&lt;li>We planned mass reboots of all the machines roughly every month for properly applying security and kernel updates.&lt;/li>
&lt;li>We introduced &lt;a href="http://mirrorbrain.org/" target="_blank">Mirrorbrain&lt;/a> (MB), the mirroring service serving GNOME and related modules tarballs and software all over the world. Before introducing MB GNOME had several mirrors located in all the main continents and at the same time a very low amount of users making good use of them. Many organizations and companies behind these mirrors decided to not host GNOME sources anymore as the statistics of usage were very poor and preferred providing the same service to projects that really had a demand for these resources. MB solved all this allowing a proper redirect to the closest mirror (through mod_geoip) and making sure the sources checksum matched across all the mirrors and against the original tarball uploaded by a GNOME maintainer and hosted at master.gnome.org.&lt;/li>
&lt;/ol>
&lt;p>I can keep the list going for dozens of other accomplished tasks but I’m sure many of you are now more interested in what the future plans actually are in terms of where the &lt;strong>GNOME Infrastructure&lt;/strong> should be in the next couple of years.&lt;/p>
&lt;p>One of the main topics we’ve been discussing will be migrating our Git infrastructure away from cgit (which is mainly serving as a code browsing tool) to a more complete platform that is surely going to include a code review tool of some sort. (Gerrit, Gitlab, Phabricator)&lt;/p>
&lt;p>Another topic would be migrating our mailing lists to Mailman 3 / Hyperkitty. This also means we definitely need a staging infrastructure in place for testing these kind of transitions ideally bound to a separate Puppet / Ansible repository or branch. Having a different repository for testing purposes will also mean helping apprentices to test their changes directly on a live system and not on their personal computer which might be running a different OS / set of tools than the ones we run on the GNOME Infrastructure.&lt;/p>
&lt;p>What I also aim would be seeing &lt;strong>GNOME&lt;/strong> Accounts being the only authentication resource in use within the whole GNOME Infrastructure. That means one should be able to login to a specific service with the same username / password in use on the other hosted services. That’s been on my todo list for a while already and it’s probably time to push it forward together with Patrick Uiterwijk, responsible of &lt;a href="https://fedorahosted.org/ipsilon/" target="_blank">Ipsilon&lt;/a>‘s development at Red Hat and GNOME Sysadmin.&lt;/p>
&lt;p>While these are the top priority items we are soon receiving new hardware (plus extended warranty renewals for two out of the three machines that had their warranty renewed a while back) and migrating some of the VMs off from the current set of machines to the new boxes is definitely another task I’d be willing to look at in the next couple of months (one machine (ns-master.gnome.org) is being decommissioned giving me a chance to migrate away from BIND into NSD).&lt;/p>
&lt;p>The &lt;strong>GNOME Infrastructure&lt;/strong> is evolving and it’s crucial to have someone maintaining it. On this side I’m bringing to your attention the fact the assigned &lt;span class="il">Sysadmin&lt;/span> funds are running out as reported on the Board minutes from the &lt;a href="https://mail.gnome.org/archives/foundation-announce/2015-November/msg00003.html" target="_blank">27th of October&lt;/a>. On this side &lt;a href="http://jeff.ecchi.ca/" target="_blank">Jeff Fortin&lt;/a> started looking for possible sponsors and came up with the idea of making a brochure with a set of accomplished tasks that couldn’t have been possible without the &lt;a href="https://mail.gnome.org/archives/foundation-announce/2010-June/msg00000.html" target="_blank">&lt;span class="il">Sysadmin &lt;/span>fundraising campaign&lt;/a> launched by &lt;a href="https://en.wikipedia.org/wiki/Stormy_Peters" target="_blank">Stormy Peters&lt;/a> back in &lt;a href="http://stormyscorner.com/2010/03/one-step-closer-to-a-sys-admin.html" target="_blank">June 2010&lt;/a> being a success. The Board is well aware of the importance of having someone looking at the infrastructure that runs the GNOME Project and is making sure the brochure will be properly reviewed and published.&lt;/p>
&lt;p>And now some stats taken from the Puppet Git Repository:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">$ &lt;span class="nb">cd&lt;/span> /git/GNOME/puppet &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> git shortlog -ns
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">3520&lt;/span> Andrea Veri
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">506&lt;/span> Olav Vitters
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">338&lt;/span> Owen W. Taylor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">239&lt;/span> Patrick Uiterwijk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">112&lt;/span> Jeff Schroeder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">71&lt;/span> Christer Edwards
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">4&lt;/span> Daniel Mustieles
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">4&lt;/span> Matanya Moses
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">3&lt;/span> Tobias Mueller
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">2&lt;/span> John Carr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">2&lt;/span> Ray Wang
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> Daniel Mustieles García
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">1&lt;/span> Peter Baumgarten&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and from the &lt;a href="https://www.bestpractical.com/rt/" target="_blank">Request Tracker&lt;/a> database (52388 being my assigned ID):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-MySQL" data-lang="MySQL">&lt;span class="line">&lt;span class="cl">&lt;span class="n">mysql&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Tickets&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">where&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LastUpdatedBy&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;52388&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+----------+&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+----------+&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3613&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+----------+&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">row&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">01&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sec&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">mysql&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">select&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">from&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Tickets&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">where&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LastUpdatedBy&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;52388&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">and&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Status&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;Resolved&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+----------+&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">count&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+----------+&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1596&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">|&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="o">+----------+&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">row&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">set&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">03&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sec&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>It’s been a long run which made me proud, for the things I learnt, for the tasks I’ve been able to accomplish, for the great support the GNOME community gave me all the time and most of all for the same fact of being part of the team responsible of the systems hosting the GNOME Project. &lt;strong>Thank you&lt;/strong> GNOME community for your continued and never ending backing, we daily work to improve how the services we host are delivered to you and the support we receive back is fundamental for our passion and enthusiasm to remain high!&lt;/p>
&lt;p> &lt;/p></description><link>https://www.dragonsreach.it/2015/12/02/three-years-and-counting/</link><guid>https://www.dragonsreach.it/2015/12/02/three-years-and-counting/</guid><pubDate>Wed, 02 Dec 2015 16:32:41 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>The GNOME Infrastructure Apprentice Program</title><description>&lt;p>Many times it happened seeing someone joining the #sysadmin IRC channel requesting participation to the team after having spent around 5 minutes trying to explain what the skills and the knowledge were and why this person felt it was the right figure for the position. And it was always very disappointing for me having to reject all these requests as we just didn’t have the infrastructure in place to let new people join the rest of the team with limited privileges.&lt;/p>
&lt;p>With the introduction of &lt;a href="https://www.dragonsreach.it/2014/10/07/the-gnome-infrastructure-is-now-powered-by-freeipa/" target="_blank">FreeIPA&lt;/a>, more fine-grained ACLs (and hiera-eyaml-gpg for securing tokens, secrets, passwords out of Puppet itself) we are so glad to announce the launch of the “&lt;strong>GNOME Infrastructure Apprentice Program&lt;/strong>” (from now till the end of the post just “Program”). If you are familiar with the Fedora Infrastructure and how it works you might know what this is about already. If you don’t please read further ahead.&lt;/p>
&lt;p>The Program will allow apprentices to join the Sysadmin Team with a limited set of privileges which mainly consist in being able to access the Puppet repository and all the stored configuration files that run the machines powering the GNOME Infrastructure every day. Once approved to the Program apprentices will be able to submit patches for review to the team and finally see their work merged on the production environment if the proposed changes matched the expectations and addressed comments.&lt;/p>
&lt;p>While the Program is open to everyone to join, we have some prerequisites in place. The interested person should be:&lt;/p>
&lt;ol>
&lt;li>Part of an existing FOSS community&lt;/li>
&lt;li>Familiar with how a FOSS Project works behind the scenes&lt;/li>
&lt;li>Familiar with popular tools like Puppet, Git&lt;/li>
&lt;li>Familiar with RHEL as the OS of choice&lt;/li>
&lt;li>Familiar with popular Sysadmin tools, softwares and procedures&lt;/li>
&lt;li>Eager to learn new things, make constructive discussions with a team, provide feedback and new ideas&lt;/li>
&lt;/ol>
&lt;p>If you feel like having all the needed prerequisites and would be willing to join follow these steps:&lt;/p>
&lt;ol>
&lt;li>Subscribe to the &lt;a href="https://mail.gnome.org/mailman/listinfo/gnome-infrastructure" target="_blank">gnome-infrastructure&lt;/a> and &lt;a href="https://mail.gnome.org/mailman/listinfo/infrastructure-announce" target="_blank">infrastructure-announce&lt;/a> mailing lists&lt;/li>
&lt;li>Join the &lt;strong>#sysadmin&lt;/strong> IRC channel on irc.gnome.org&lt;/li>
&lt;li>Send a presentation e-mail to the gnome-infrastructure mailing list stating who you are, what your past experiences and plans are as an Apprentice&lt;/li>
&lt;li>Once the presentation has been sent an existing Sysadmin Team member will evaluate your application and follow-up with you introducing you to the Program&lt;/li>
&lt;/ol>
&lt;p>More information about the Program is available &lt;a href="https://wiki.gnome.org/Sysadmin/Apprentices" target="_blank">here&lt;/a>.&lt;/p></description><link>https://www.dragonsreach.it/2015/01/28/the-gnome-infrastructure-apprentice-program/</link><guid>https://www.dragonsreach.it/2015/01/28/the-gnome-infrastructure-apprentice-program/</guid><pubDate>Wed, 28 Jan 2015 16:59:46 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Kerberos over HTTP: getting a TGT on a firewalled network</title><description>&lt;p>One of the benefits I originally wanted to bring with the &lt;a href="https://www.dragonsreach.it/2014/10/07/the-gnome-infrastructure-is-now-powered-by-freeipa/" target="_blank">FreeIPA move&lt;/a> to GNOME contributors was the introduction of an additional authentication system to connect to to the services hosted on the &lt;strong>GNOME&lt;/strong> Infrastructure. The authentication system that comes with the FreeIPA bundle that I had in mind was Kerberos. Users willing to use Kerberos as their preferred authentication system would just be required to get a TGT (Ticket-Granting Ticket) from the KDC (Key Distribution Center) through the &lt;strong>kinit&lt;/strong> command. Once done authenticating to the services currently supporting Kerberos will be as easy as pointing a configured browser (Google for how to configure your browser to use Krb logins) to account.gnome.org without being prompted for entering the usual username / password combination or pushing to git without using the public-private key mechanism. That theoretically means you won’t be required to use a SSH key for loggin in to any of the GNOME services at all as entering your password to the &lt;strong>kinit&lt;/strong> password prompt will be enough (for at least 24 hours as that’s the life of the TGT itself on our setup) for doing all you were used to do before the Kerberos support introduction.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/10/kerberos-over-http.png" alt="A successful SSH login using the most recent Kerberos package on Fedora 21">&lt;/p>
&lt;p>The issue we faced at first was the underlying networking infrastructure firewalling all Kerberos ports blocking the use of &lt;strong>kinit&lt;/strong> itself which kept timing out reaching port 88. A few days later I was contacted by RH’s developer &lt;strong>&lt;span class="gD">Nathaniel McCallum &lt;/span>&lt;/strong>&lt;span class="gD">who worked out a way to bypass this restriction by creating a KDC proxy that accepts requests from port 443 and proxies them to the internal KDC running on port 88. With the &lt;a href="http://web.mit.edu/kerberos/krb5-1.13/" target="_blank">recent Kerberos release&lt;/a> (released on October 15th, 2014 and following the &lt;a href="http://msdn.microsoft.com/en-us/library/hh553774.aspx" target="_blank">MS-KKDCP protocol&lt;/a>) a patched &lt;strong>kinit &lt;/strong>allows users to retrieve their TGTs directly from the HTTPS proxy completely bypassing the need for port 88 to stay open on the firewall. &lt;/span>The &lt;strong>GNOME Infrastructure&lt;/strong> now runs the KDC Proxy and we’re glad to announce Kerberos authentications are working as expected on the hosted services.&lt;/p>
&lt;p>If you are facing the same problem and you are curious to know more about the setup, here they come all the details:&lt;/p>
&lt;p>On the &lt;strong>KDC&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>No changes are needed on the KDC itself, just make sure to install the &lt;strong>python-kdcproxy&lt;/strong> package which is available for RHEL 7, &lt;a href="http://koji.fedoraproject.org/koji/taskinfo?taskID=7937527" target="_blank">HERE&lt;/a>.&lt;/li>
&lt;li>Tweak your vhost accordingly by following the &lt;a href="https://github.com/npmccallum/kdcproxy" target="_blank">provided documentation&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>On the &lt;strong>client&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>Install the krb5-workstation package, make sure it’s at least version &lt;strong>1.12.2-9&lt;/strong> as that’s the release which had the additional features we are talking about backported. Right now it’s only available for Fedora 21.&lt;/li>
&lt;li>Adjust /etc/krb5.conf accordingly and finally get a TGT through kinit $userid@GNOME.ORG.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[realms]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">GNOME.ORG&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> kdc = https://account.gnome.org/KdcProxy
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> kpasswd_server = https://account.gnome.org/KdcProxy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>That should be all for today!&lt;/p></description><link>https://www.dragonsreach.it/2014/10/24/kerberos-over-http-on-a-firewalled-network/</link><guid>https://www.dragonsreach.it/2014/10/24/kerberos-over-http-on-a-firewalled-network/</guid><pubDate>Fri, 24 Oct 2014 13:50:52 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>The GNOME Infrastructure’s FreeIPA move behind the scenes</title><description>&lt;p>A few days ago I wrote about the &lt;a href="https://www.dragonsreach.it/2014/10/07/the-gnome-infrastructure-is-now-powered-by-freeipa/" target="_blank">GNOME Infrastructure moving to FreeIPA&lt;/a>, the post was mainly an announcement to the relevant involved parties with many informative details for contributors to properly migrate their account details off from the old authentication system to the new one. Today’s post is a follow-up to that announcement but it’s going to take into account the reasons about our choice to migrate to &lt;strong>FreeIPA&lt;/strong>, what we found interesting and compelling about the software and why we think more projects (them being either smaller or bigger) should migrate to it. Additionally I’ll provide some details about how I performed the migration from our previous &lt;strong>OpenLDAP&lt;/strong> setup with a step-by-step guide that will hopefully help more people to migrate the infrastructure they manage themselves.&lt;/p>
&lt;h2 id="the-gnome-case">The GNOME case&lt;/h2>
&lt;p>It’s very clear to everyone an infrastructure should reflect the needs of its user base, in the case of &lt;strong>GNOME&lt;/strong> a multitude between developers, translators, documenters and between them a very good number of Foundation members, contributors that have proven their non-trivial contributions and have received the status of members of the GNOME Foundation with all the relevant benefits connected to it.&lt;/p>
&lt;p>The situation we had before was very tricky, LDAP accounts were managed through our LDAP istance while Foundation members were being stored on a MySQL database with many of the tables being related to the yearly Board of Director’s elections and one specifically meant to store all the information from each of the members. One of the available fields on that table was defined as ‘userid’ and was supposed to store the LDAP ‘uid’ field the Membership Committee member processing a certain application had to update when accepting the application. This procedure had two issues:&lt;/p>
&lt;ol>
&lt;li>Membership Committee members had no access to LDAP information&lt;/li>
&lt;li>No checks were being run on the web UI to verify the ‘userid’ field was populated correctly taking in multiple inconsistencies between LDAP and the MySQL database&lt;/li>
&lt;/ol>
&lt;p>In addition to the above Mango (the software that helped the GNOME administrative teams to manage the user data for multiple years had no maintainer, no commits on its core since 2008 and several limitations)&lt;/p>
&lt;h2 id="what-were-we-looking-for-as-a-replacement-for-the-current-setup">What were we looking for as a replacement for the current setup?&lt;/h2>
&lt;p>It was very obvious to me we would have had to look around for possible replacements to Mango. What we were aiming for was a software with the following characteristics:&lt;/p>
&lt;ol>
&lt;li>It had to come with a &lt;strong>pre-built web UI&lt;/strong> providing a wide view on several LDAP fields&lt;/li>
&lt;li>The web UI had to be &lt;strong>extensible in some form&lt;/strong> as we had some custom LDAP schemas we wanted users to see and modify&lt;/li>
&lt;li>The sofware had to be &lt;strong>actively developed&lt;/strong> and responsive to eventual security reports (given the high security impact a breach on LDAP could take in)&lt;/li>
&lt;/ol>
&lt;p>FreeIPA clearly matched all our expectations on all the above points.&lt;/p>
&lt;h2 id="the-migration-process-8211-rfc2307-vs-rfc2307bis">The Migration process – RFC2307 vs RFC2307bis&lt;/h2>
&lt;p>Our previous OpenLDAP setup was following &lt;a href="https://www.ietf.org/rfc/rfc2307.txt">RFC 2307&lt;/a>, which means that above all the other available LDAP attributes (listed on the RFC under point &lt;strong>2.2&lt;/strong>) group’s membership was being represented through the ‘memberUid’ attribute. An example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">cn&lt;/span>&lt;span class="o">=&lt;/span>foundation,cn&lt;span class="o">=&lt;/span>groups,cn&lt;span class="o">=&lt;/span>compat,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">objectClass: posixGroup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">objectClass: top
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gidNumber: &lt;span class="m">524&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">memberUid: foo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">memberUid: bar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">memberUid: foobar&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>As you can each of the members of the group ‘foundation’ are represented using the ‘memberUid’ attribute followed by the ‘uid’ of the user itself. FreeIPA does not make directly use of RFC2307 for its trees, but RFC2307bis instead. (RFC2307bis was not published as a RFC by the &lt;strong>IETF&lt;/strong> as the author didn’t decide to pursue it nor the companies (HP, Sun) that then adopted it)&lt;/p>
&lt;p>RFC2307bis uses a different attribute to represent group’s membership, it being ‘member’. Another example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">cn&lt;/span>&lt;span class="o">=&lt;/span>foundation,cn&lt;span class="o">=&lt;/span>groups,cn&lt;span class="o">=&lt;/span>accounts,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">objectClass: posixGroup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">objectClass: top
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gidNumber: &lt;span class="m">524&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">member: &lt;span class="nv">uid&lt;/span>&lt;span class="o">=&lt;/span>foo,cn&lt;span class="o">=&lt;/span>users,cn&lt;span class="o">=&lt;/span>accounts,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">member: &lt;span class="nv">uid&lt;/span>&lt;span class="o">=&lt;/span>bar,cn&lt;span class="o">=&lt;/span>users,cn&lt;span class="o">=&lt;/span>accounts,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">member: &lt;span class="nv">uid&lt;/span>&lt;span class="o">=&lt;/span>foobar,cn&lt;span class="o">=&lt;/span>users,cn&lt;span class="o">=&lt;/span>accounts,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>As you can see the &lt;strong>DN&lt;/strong> representing the group ‘foundation’ differs between the two examples. That is why FreeIPA comes with a &lt;strong>Compatibility plugin&lt;/strong> (cn=compat) which automatically creates RFC2307-compliant trees and entries whenever an append / modify / delete operation happens on any of the hosted RFC2307bis-compliant trees. What’s the point of doing this when we could just stick with RFC2307bis trees and go with it? As the plugin name points out the Compatibility plugin is there to prevent breakages between the directory server and any of the clients or softwares out there still retrieving information and data by using the ‘memberUid’ attribute as specified on RFC2307.&lt;/p>
&lt;p>FreeIPA migration tools (ipa migrate-ds) do come with a ‘–schema’ flag you can use to specify what attribute the istance you are migrating from was following (values are RFC2307 and RFC2307bis as you may have guessed already), in the case of GNOME the complete command we ran (after installing all the relevant tools through ‘ipa-server-install’ and copying the custom schemas under /etc/dirsrv/slapd-$ISTANCE-NAME/schema) was:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ipa migrate-ds --bind-dn&lt;span class="o">=&lt;/span>&lt;span class="nv">cn&lt;/span>&lt;span class="o">=&lt;/span>Manager,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org --user-container&lt;span class="o">=&lt;/span>&lt;span class="nv">ou&lt;/span>&lt;span class="o">=&lt;/span>people,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org --group-container&lt;span class="o">=&lt;/span>&lt;span class="nv">ou&lt;/span>&lt;span class="o">=&lt;/span>groups,dc&lt;span class="o">=&lt;/span>gnome,dc&lt;span class="o">=&lt;/span>org --group-objectclass&lt;span class="o">=&lt;/span>posixGroup ldap://internal-IP:389 --schema&lt;span class="o">=&lt;/span>RFC2307&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Please &lt;strong>note&lt;/strong> that before running the command you should make sure custom schemas you had on the istance you are migrating from are available to the directory server you are migrating your tree to.&lt;/p>
&lt;p>More information on the &lt;strong>migration process&lt;/strong> from an existing OpenLDAP istance can be found &lt;a href="http://docs.fedoraproject.org/en-US/Fedora/15/html/FreeIPA_Guide/Migrating_from_a_Directory_Server_to_IPA-Performing_a_Server_based_Migration.html" target="_blank">HERE&lt;/a>.&lt;/p>
&lt;h2 id="the-migration-process-8211-extending-the-directory-server-with-custom-schemas">The Migration process – Extending the directory server with custom schemas&lt;/h2>
&lt;p>One of the other challenges we had to face has been extending the available LDAP schemas to include Foundation membership attributes. This operation requires the following changes:&lt;/p>
&lt;ol>
&lt;li>Build the LDIF (that will include two new custom fields: FirstAdded and LastRenewedOn)&lt;/li>
&lt;li>Adding the LDIF in place on &lt;strong>/etc/dirsrv/slapd-$ISTANCE-NAME/schema&lt;/strong>&lt;/li>
&lt;li>Extend the web UI to include the new attributes&lt;/li>
&lt;/ol>
&lt;p>I won’t be explaining how to build a LDIF on this post but I’m however pasting the schema I made to help you getting an idea:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">attributeTypes: &lt;span class="o">(&lt;/span> 1.3.6.1.4.1.3319.8.2 NAME &lt;span class="s1">&amp;#39;LastRenewedOn&amp;#39;&lt;/span> SINGLE-VALUE EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch DESC &lt;span class="s1">&amp;#39;Last renewed on date&amp;#39;&lt;/span> SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 &lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">attributeTypes: &lt;span class="o">(&lt;/span> 1.3.6.1.4.1.3319.8.3 NAME &lt;span class="s1">&amp;#39;FirstAdded&amp;#39;&lt;/span> SINGLE-VALUE EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch DESC &lt;span class="s1">&amp;#39;First added date&amp;#39;&lt;/span> SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 &lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">objectClasses: &lt;span class="o">(&lt;/span> 1.3.6.1.4.1.3319.8.1 NAME &lt;span class="s1">&amp;#39;FoundationFields&amp;#39;&lt;/span> AUXILIARY MAY &lt;span class="o">(&lt;/span> LastRenewedOn $ FirstAdded &lt;span class="o">)&lt;/span> &lt;span class="o">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>After copying the schema in place and restarting the directory server, extend the web UI:&lt;/p>
&lt;p>on &lt;strong>/usr/lib/python2.7/site-packages/ipalib/plugins/foundation.py&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">ipalib.plugins&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">user&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">ipalib.parameters&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Str&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">ipalib&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">_&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">time&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">strftime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">re&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">validate_date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ugettext&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="k">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;^[0-9]&lt;/span>&lt;span class="si">{4}&lt;/span>&lt;span class="s2">-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;The entered date is wrong, please make sure it matches the YYYY-MM-DD syntax&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">user&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">user&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">takes_params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">user&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">user&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">takes_params&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;firstadded?&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">validate_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cli_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;firstadded&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;First Added date&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;lastrenewedon?&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">validate_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">cli_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;lastrenewedon&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Last Renewed on date&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>on &lt;strong>/usr/share/ipa/ui/js/plugins/foundation/foundation.js&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-JavaScript" data-lang="JavaScript">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">define&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;freeipa/phases&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">&amp;#39;freeipa/user&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">phases&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">user_mod&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// helper function
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">get_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">array&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">attr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nx">l&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">array&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="nx">lt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="nx">l&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">array&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="nx">attr&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">array&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">foundation_plugin&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">foundation_plugin&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add_foundation_fields&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kd">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">facet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">get_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">user_mod&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">entity_spec&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">facets&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;$type&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;details&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">var&lt;/span> &lt;span class="nx">section&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">get_item&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">facet&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sections&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;name&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;identity&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fields&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">push&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;firstadded&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">label&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;Foundation Member since&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fields&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">push&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;lastrenewedon&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">label&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;Last Renewed on date&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">section&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">fields&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">push&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;description&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">label&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;Previous account changes&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">phases&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">on&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;customization&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">foundation_plugin&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">add_foundation_fields&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="nx">foundation_plugin&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Once done, restart the web server. The next step would be migrating all the &lt;strong>FirstAdded&lt;/strong> and &lt;strong>LastRenewedOn&lt;/strong> attributes off from MySQL into LDAP now that our custom schema has been injected.&lt;/p>
&lt;p>The relevant MySQL fields were following the YYYY-MM-DD syntax to store the dates and a little Python script to read from MySQL and populate the LDAP attributes was then made. If interested or you are in a similar situation you can find it &lt;a href="https://git.gnome.org/browse/sysadmin-bin/tree/membership/migrate-foundation-field-to-freeipa.py" target="_blank">HERE&lt;/a>.&lt;/p>
&lt;h2 id="the-migration-process-8211-own-ssl-certificates-for-httpd">The Migration process – Own SSL certificates for HTTPD&lt;/h2>
&lt;p>As you may be aware of FreeIPA comes with its own certificate tools (powered by &lt;strong>Certmonger&lt;/strong>), that means a &lt;strong>CA&lt;/strong> is created (during the ipa-server-install run) and certificates for the various services you provide are then created and signed with it. This is definitely great and removes the burden to maintain an underlying self-hosted PKI infrastructure. At the same time this seems to be a problem for publicly-facing web services as browsers will start complaining they don’t trust the CA that signed the certificate the website you are trying to reach is using.&lt;/p>
&lt;p>The problem is not really a problem as you can specify what certificate HTTPD should be using for displaying FreeIPA’s web UI. The procedure is simple and involves the NSS database at /etc/httpd/alias:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">certutil -d /etc/httpd/alias/ -A -n &lt;span class="s2">&amp;#34;StartSSL CA&amp;#34;&lt;/span> -t CT,C, -a -i sub.class2.server.ca.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">certutil -d /etc/pki/nssdb -A -n &lt;span class="s2">&amp;#34;StartSSL CA&amp;#34;&lt;/span> -t CT,C, -a -i sub.class2.server.ca.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">openssl pkcs12 -inkey freeipa.example.org.key -in freeipa.example.org.crt -export -out freeipa.example.org.p12 -nodes -name &lt;span class="s1">&amp;#39;HTTPD-Server-Certificate&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pk12util -i freeipa.example.org.p12 -d /etc/httpd/alias/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Once done, update /etc/httpd/conf.d/nss.conf with the correct NSSNickname value. (which should match the one you entered after ‘-name’ on the third of the above commands)&lt;/p>
&lt;h2 id="the-migration-process-8211-equivalent-of-authorized_keys8217-8220command8221">The Migration process – Equivalent of authorized_keys’ “command”&lt;/h2>
&lt;p>At GNOME we do run several services that require users to login to specific machines and run a command. At the same time and for security purposes we don’t want all the users to reach a shell. Originally we were making use of SSH’s authorized_keys file to specify the “command” these users should have been restricted to. FreeIPA handles Public Key authentications differently (through the &lt;strong>sss_ssh_authorizedkeys&lt;/strong> binary) which means we had to find an alternative way to restrict groups to only a specific command. SSH’s &lt;strong>ForceCommand&lt;/strong> came in help, an example given a group called ‘foo’:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">Match Group foo,!bar
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">X11Forwarding no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PermitTunnel no
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ForceCommand /home/admin/bin/reset-my-password.py&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The above &lt;strong>Match Group&lt;/strong> will be applied to all the users of the ‘foo’ group except the ones that are also part of the ‘bar’ group. If you are interested in the reset-my-password.py script which resets a certain user password and sends a temporary one to the registered email address (by checking the mail LDAP attr) for the user, click &lt;a href="https://git.gnome.org/browse/sysadmin-bin/tree/reset-my-password.py" target="_blank">HERE&lt;/a>.&lt;/p>
&lt;h2 id="the-migration-process-8211-kerberos-host-keytabs">The Migration process – Kerberos host Keytabs&lt;/h2>
&lt;p>Here, at &lt;strong>GNOME&lt;/strong>, we still have one or two RHEL 5 hosts hanging around and SSSD reported a failure when trying to authenticate with the given Keytab (generated with RHEL 7 default values) to the KDC running (as you may have guessed) RHEL 7. The issue is simple as RHEL 5 does not support many of the encryption types which the Keytab was being encrypted with. Apparently the only currently supported Keytab encryption type on a RHEL 5 machine is &lt;strong>rc4-hmac&lt;/strong>. Creating a Keytab on the KDC accordingly can be done this way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ipa-getkeytab -s server.example.org -p host/client.example.org -e rc4-hmac -k /root/keytabs/client.example.org.keytab&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>That should be all for today, I’ll make sure to update this post with further details or answers to possible comments.&lt;/p></description><link>https://www.dragonsreach.it/2014/10/12/the-gnome-infrastructures-freeipa-move-behind-the-scenes/</link><guid>https://www.dragonsreach.it/2014/10/12/the-gnome-infrastructures-freeipa-move-behind-the-scenes/</guid><pubDate>Sun, 12 Oct 2014 18:02:02 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>The GNOME Infrastructure is now powered by FreeIPA!</title><description>&lt;p>As preannounced &lt;a href="https://mail.gnome.org/archives/infrastructure-announce/2014-October/msg00000.html" target="_blank">here&lt;/a> the GNOME Infrastructure switched to a new Account Management System which is reachable at &lt;a href="https://account.gnome.org" target="_blank">&lt;a href="https://account.gnome.org">https://account.gnome.org&lt;/a>&lt;/a>. All the details will follow.&lt;/p>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>It’s been a while since someone actually touched the underlying authentication infrastructure that powers the GNOME machines. The very first setup was originally configured by &lt;strong>Jonathan Blandford&lt;/strong> (jrb) who configured an &lt;strong>OpenLDAP&lt;/strong> istance with several customized schemas. (pServer fields in the old CVS days, pubAuthorizedKeys and GNOME modules related fields in recent times)&lt;/p>
&lt;p>While OpenLDAP-server was living on the GNOME machine called clipboard (aka ldap.gnome.org) the clients were configured to synchronize users, groups, passwords through the nslcd daemon. After several years &lt;strong>Jeff Schroeder&lt;/strong> joined the Sysadmin Team and during one cold evening (date is Tue, February 1st 2011) spent some time configuring SSSD to replace the nslcd daemon which was missing one of the most important SSSD features: caching. What surely convinced Jeff to adopt SSSD (a very new but promising sofware at that time as the first release happened right before 2010’s Christmas) and as the commit log also states (“New sssd module for ldap information caching”) was SSSD’s caching feature.&lt;/p>
&lt;p>It was enough for a certain user to log in once and the ‘/var/lib/sss/db’ directory was populated with its login information preventing the LDAP daemon in charge of picking up login details (from the LDAP server) to query the LDAP server itself every single time a request was made against it. This feature has definitely helped in many occasions especially when the LDAP server was down for a particular reason and sysadmins needed to access a specific machine or service: without SSSD this wasn’t ever going to work and sysadmins were probably going to be locked out from the machines they were used to manage. (except if you still had ‘/etc/passwd’, ‘/etc/group’ and ‘/etc/shadow’ entries as fallback)&lt;/p>
&lt;p>Things were working just fine except for a few downsides that appeared later on:&lt;/p>
&lt;ol>
&lt;li>the web interface (view) on our LDAP user database was managed by &lt;a href="https://wiki.gnome.org/Attic/Mango" target="_blank">&lt;strong>Mango&lt;/strong>&lt;/a>, an outdated tool which many wanted to rewrite in Django that slowly became a huge dinosaur nobody ever wanted to look into again&lt;/li>
&lt;li>the Foundation membership information were managed through a MySQL database, so two databases, two sets of users unrelated to each other&lt;/li>
&lt;li>users were not able to modify their own account information on their own but even a single e-mail change required them to mail the GNOME Accounts Team which was then going to authenticate their request and finally update the account.&lt;/li>
&lt;/ol>
&lt;p>Today’s infrastructure changes are here to finally say the issues outlined at (1, 2, 3) are now fixed.&lt;/p>
&lt;h2 id="what-has-changed">What has changed?&lt;/h2>
&lt;p>The GNOME Infrastructure is now powered by Red Hat’s &lt;strong>FreeIPA&lt;/strong> which bundles several FOSS softwares into one big “bundle” all surrounded by an easy and intuitive web UI that will help users update their account information on their own without the need of the Accounts Team or any other administrative entity. Users will also find two custom fields on their “Overview” page, these being “Foundation Member since” and “Last Renewed on date”. As you may have understood already we finally managed to migrate the Foundation membership database into LDAP itself to store the information we want once and for all. As a side note it might be possible that some users that were Foundation members in the past won’t find any detail stored on the Foundation fields outlined above. That is actually expected as we were able to migrate all the current and old Foundation members that had an LDAP account registered at the time of the migration. If that’s your case and you still would like the information to be stored on the new setup please get in contact with the Membership Committee at stating so.&lt;/p>
&lt;h2 id="where-can-i-get-my-first-login-credentials">Where can I get my first login credentials?&lt;/h2>
&lt;p>Let’s make a little distinction between users that previously had access to Mango (usually maintainers) and users that didn’t. If you were used to access Mango before you should be able to login on the new Account Management System by entering your GNOME username and the password you were used to use for loggin in into Mango. (after loggin in the very first time you will be prompted to update your password, please choose a strong password as this account will be unique across all the GNOME Infrastructure)&lt;/p>
&lt;p>If you never had access to Mango, you lost your password or the first time you read the word Mango on this post you thought “why is he talking about a fruit now?” you should be able to reset it by using the following command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ssh -l yourgnomeuserid account.gnome.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The command will start an SSH connection between you and account.gnome.org, once authenticated (with the SSH key you previously had registered on our Infrastructure) you will trigger a command that will directly send your brand new password on the e-mail registered for your account. From my tests seems GMail sees the e-mail as a phishing attempt probably because the body contains the word “password” twice. That said if the e-mail won’t appear on your INBOX, please &lt;strong>double-check&lt;/strong> your Spam folder.&lt;/p>
&lt;h2 id="now-that-mango-is-gone-how-can-i-request-a-new-account">Now that Mango is gone how can I request a new account?&lt;/h2>
&lt;p>With Mango we used to have a form that automatically e-mailed the maintainer of the selected GNOME module which was then going to approve / reject the request. From there and in the case of a positive vote from the maintainer the Accounts Team was going to create the account itself.&lt;/p>
&lt;p>With the &lt;a href="https://mail.gnome.org/archives/gnome-i18n/2014-February/msg00000.html" target="_blank">recent introduction of a commit robot directly on l10n.gnome.org&lt;/a> the number of account requests reduced its numbers. In addition to that users will now be able to perform pretty much all the needed maintenance on their accounts themselves. That said and while we will probably work on building a form in the future we feel that requesting accounts can definitely be achieved directly by mailing the Accounts Team itself which will mail the maintainer of the respective module and create the account. As just said the number of account creations has become very low and the queue is currently clear. The documentation has been updated to reflect these changes at:&lt;/p>
&lt;p>&lt;a href="https://wiki.gnome.org/AccountsTeam" target="_blank">&lt;a href="https://wiki.gnome.org/AccountsTeam">https://wiki.gnome.org/AccountsTeam&lt;/a>&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://wiki.gnome.org/AccountsTeam/NewAccounts" target="_blank">&lt;a href="https://wiki.gnome.org/AccountsTeam/NewAccounts">https://wiki.gnome.org/AccountsTeam/NewAccounts&lt;/a>&lt;/a>&lt;/p>
&lt;h2 id="i-was-used-to-have-access-to-a-specific-service-but-i-don8217t-anymore-what-should-i-do">I was used to have access to a specific service but I don’t anymore, what should I do?&lt;/h2>
&lt;p>The migration of all the user data and ACLs has been massive and I’ve been spending a lot of time reviewing the existing HBAC rules trying to spot possible errors or misconfigurations. If you happen to not being able to access a certain service as you were used to in the past, please get in contact with the Sysadmin Team. All the possible ways to contact us are available at &lt;a href="https://wiki.gnome.org/Sysadmin/Contact" target="_blank">&lt;a href="https://wiki.gnome.org/Sysadmin/Contact">https://wiki.gnome.org/Sysadmin/Contact&lt;/a>&lt;/a>.&lt;/p>
&lt;h2 id="what-is-missing-still">What is missing still?&lt;/h2>
&lt;p>Now that the Foundation membership information has been moved to LDAP I’ll be looking at porting some of the existing membership scripts to it. What I managed to port already are welcome e-mails for new or existing members. (renewals)&lt;/p>
&lt;p>Next step will be generating a membership page from LDAP (to populate &lt;a href="http://www.gnome.org/foundation/membership" target="_blank">&lt;a href="http://www.gnome.org/foundation/membership">http://www.gnome.org/foundation/membership&lt;/a>&lt;/a>) and all the your-membership-is-going-to-lapse e-mails that were being sent till today.&lt;/p>
&lt;h2 id="other-news-8211-homeusers-mount-on-mastergnomeorg">Other news – /home/users mount on master.gnome.org&lt;/h2>
&lt;p>You will notice that loggin in into &lt;strong>master.gnome.org&lt;/strong> will result in your home directory being empty, don’t worry, you did not lose any of your files but master.gnome.org is now currently hosting your home directories itself. As you may have been aware of adding files to the public_html directory on master resulted in them appearing on your &lt;strong>people.gnome.org/~userid&lt;/strong> space. That was unfortunately expected as both master and webapps2 (the machine serving people.gnome.org’s webspaces) were mounting the same GlusterFS share.&lt;/p>
&lt;p>We wanted to prevent that behaviour to happen as we wanted to know who has access to what resource and where. From today master’s home directories will be there just as a temporary spot for your tarballs, just scp and use ftpadmin against them, that should be all you need from master. If you are interested in receiving or keeping using your people.gnome.org’s webspace please mail &lt;a href="mailto:accounts@gnome.org" target="_blank">&lt;accounts AT gnome DOT org>&lt;/a> stating so.&lt;/p>
&lt;h2 id="other-news-8211-a-shiny-and-new-error-500-page-has-been-deployed">Other news – a shiny and new error 500 page has been deployed&lt;/h2>
&lt;p>Thanks to &lt;strong>Magdalen Berns&lt;/strong> (magpie) a new error 500 web page has been deployed on all the Apache istances we host. The page contains an iframe of &lt;strong>status.gnome.org&lt;/strong> and will appear every single time the web server behind the service you are trying to reach will be unreachable for maintenance or other purposes. While I hope you won’t see the page that often you can still enjoy it at &lt;a href="https://static.gnome.org/error-500/500.html" target="_blank">&lt;a href="https://static.gnome.org/error-500/500.html">https://static.gnome.org/error-500/500.html&lt;/a>&lt;/a>. Make sure to whitelist status.gnome.org on your browser as it currently loads it without https. (as the service is currently hosted on OpenShift which provides us with a *.rhcloud.com wildcard certificate, which differs from the CN the browser would expect it to be)&lt;/p>
&lt;h2 id="updates">Updates&lt;/h2>
&lt;p>&lt;strong>UPDATE&lt;/strong> on status.gnome.org’s SSL certificate: the certificate has been provisioned and it should result in the 500’s page to be displayed correctly with no warnings from your browser.&lt;/p>
&lt;p>&lt;strong>UPDATE&lt;/strong> from Adam Young on Kerberos ports being closed on many DC’s firewalls:&lt;/p>
&lt;blockquote>
&lt;p>The next version of upstream MIT Kerberos will have support for fetching a ticket via ports 443 and marshalling the request over HTTPS. We’ll need to run a proxy on the server side, but we should be able to make it work:&lt;/p>
&lt;p>Read up here&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;a href="http://adam.younglogic.com/2014/06/kerberos-firewalls/" rel="nofollow">&lt;a href="http://adam.younglogic.com/2014/06/kerberos-firewalls">http://adam.younglogic.com/2014/06/kerberos-firewalls&lt;/a>&lt;/a>&lt;/p>
&lt;/blockquote></description><link>https://www.dragonsreach.it/2014/10/07/the-gnome-infrastructure-is-now-powered-by-freeipa/</link><guid>https://www.dragonsreach.it/2014/10/07/the-gnome-infrastructure-is-now-powered-by-freeipa/</guid><pubDate>Tue, 07 Oct 2014 09:21:33 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Back from GUADEC 2014</title><description>&lt;p>Coming back from &lt;strong>GUADEC&lt;/strong> has never been easy, so much fun, so much great people to speak with and amazing talks to watch but this year has definitely been harder as I totally felt in love with the city that was hosting the event. Honestly speaking I’ve been amazed by how Strasbourg looks like: alsace houses and buildings are just delightful, the cathedral is stunning and people have been so welcoming during my whole stay. (cooks at the Canteen even prepared a few italian dishes and welcomed us in italian every time we were heading there…how cool is that?)&lt;/p>
&lt;p>But let’s get back to our business now as I would probably never stop talking about Strasbourg and how great it was staying there! I did not have a personal talk this year but I presented the yearly Sysadmin Team report during the Foundation’s AGM. If you weren’t there all the slides are available &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2014.html" target="_blank">here&lt;/a>.&lt;/p>
&lt;p>Apart from presenting what we did and what the changes we introduced on the GNOME Infrastructure were I participated to Patrick Uiterwijk’s talk about FedOAuth and all the upcoming changes that are planned on the infrastructure during the next months. If you were not able to attend Patrick’s talk this little resume should be for you:&lt;/p>
&lt;p>&lt;strong>Current problems&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>The GNOME Infrastructure currently has a lot of different user databases which implies different users and passwords across the services we host&lt;/li>
&lt;li>The Foundation’s database is currently MySQL-based while we do have LDAP in place for all our other needs already&lt;/li>
&lt;li>Some of the tools we do use for managing our LDAP istance are not being maintained properly&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Possible solutions&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Introduce FedOAuth, a SSO solution written and developed by Patrick Uiterwijk&lt;/li>
&lt;li>Unify the various databases and make sure our LDAP istance is used for authentication everywhere&lt;/li>
&lt;li>Remove Mango and configure FreeIPA&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Benefits after the move&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Users will be able to manage their accounts on their own, no more need to poke the accounts team for updating passwords, emails, SSH keys. The accounts team will still be around to adjust ACLs&lt;/li>
&lt;li>No more need for dozen of accounts, one for every single service we provide&lt;/li>
&lt;li>More freedom when managing sudo accesses and accounts on the various machines we manage, this will help new people contributing to the Sysadmin Team (Making our puppet repository public and introducing a GNOME Infrastructure Apprentice group for newcomers is something we will be seriously evaluating after the FreeIPA move)&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Where we are now:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Our SSO infrastructure is live at &lt;a href="https://id.gnome.org" target="_blank">&lt;a href="https://id.gnome.org">https://id.gnome.org&lt;/a>&lt;/a>&lt;/li>
&lt;li>Your OpenID URL is &lt;strong>https://$GNOME_USERID.id.gnome.org&lt;/strong>&lt;/li>
&lt;li>Right now you can login with your GNOME account at the following services: l10n.gnome.org, opw.gnome.org. We are slowly migrating all the existing services to the new SSO infrastructure, please be patient and bear with us!&lt;/li>
&lt;/ul>
&lt;p>More information, slides and screenshots from Patrick’s talk are available &lt;a href="http://patrick.uiterwijk.org/2014/07/28/gnome-authentication/#1" target="_blank">here&lt;/a>. Stay tuned and many thanks to the &lt;strong>GNOME Foundation&lt;/strong> for sponsoring my travel and accomodation expenses!&lt;/p>
&lt;div class="gallery">
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/08/14581494979_18c62c3083_z.jpg" alt="The GUADEC 2014 group photo!"/>
&lt;figcaption>The GUADEC 2014 group photo!&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/08/IMG_20140729_193107.jpg" alt="A view of the Petite France district"/>
&lt;figcaption>A view of the Petite France district&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/08/IMG_20140729_195206.jpg" alt="Another great view of the Petite France district"/>
&lt;figcaption>Another great view of the Petite France district&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/08/IMG_20140725_103921.jpg" alt="The Notre Dame cathedral"/>
&lt;figcaption>The Notre Dame cathedral&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/08/IMG_20140725_103927.jpg" alt="Another view of the Notre Dame cathedral"/>
&lt;figcaption>Another view of the Notre Dame cathedral&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2014/08/IMG_20140725_103655.jpg" alt="Place Gutenberg"/>
&lt;figcaption>Place Gutenberg&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;p> &lt;/p></description><link>https://www.dragonsreach.it/2014/08/05/back-from-guadec-2014/</link><guid>https://www.dragonsreach.it/2014/08/05/back-from-guadec-2014/</guid><pubDate>Tue, 05 Aug 2014 17:27:23 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Adding reCAPTCHA support to Mailman</title><description>&lt;p>The &lt;strong>GNOME&lt;/strong> and many other infrastructures have been recently attacked by an huge amount of &lt;strong>subscription-based spam&lt;/strong> against their &lt;strong>Mailman&lt;/strong> istances. What the attackers were doing was simply launching a GET call against a specific REST API URL passing all the parameters it needed for a subscription request (and confirmation) to be sent out. Understanding it becomes very easy when you look at the following example taken from our apache.log:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-verilog" data-lang="verilog">&lt;span class="line">&lt;span class="cl">&lt;span class="n">May&lt;/span> &lt;span class="mh">3&lt;/span> &lt;span class="mh">04&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mh">14&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mh">38&lt;/span> &lt;span class="n">restaurant&lt;/span> &lt;span class="nl">apache:&lt;/span> &lt;span class="mf">81.17.17.90&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">127.0.0.1&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mh">03&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">May&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mh">2014&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mh">04&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mh">14&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mh">38&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mh">0000&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="s">&amp;#34;GET /mailman/subscribe/banshee-list?email=example@me.com&amp;amp;fullname=&amp;amp;pw=123456789&amp;amp;pw-conf=123456789&amp;amp;language=en&amp;amp;digest=0&amp;amp;email-button=Subscribe HTTP/1.1&amp;#34;&lt;/span> &lt;span class="mh">403&lt;/span> &lt;span class="mh">313&lt;/span> &lt;span class="s">&amp;#34;http://spam/index2.html&amp;#34;&lt;/span> &lt;span class="s">&amp;#34;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>As you can the see attackers were sending all the relevant details needed for the subscription to go forward (and specifically the full name, the email, the digest option and the password for the target list). At first we tried to either stop the spam by banning the subnets where the requests were coming from, then when it was obvious that more subnets were being used and manual intervention was needed we tried banning their &lt;strong>User-Agents&lt;/strong>. Again no luck, the spammers were smart enough to change it every now and then making it to match an existing browser User-Agent. (with a good percentage to have a lot of false-positives)&lt;/p>
&lt;p>Now you might be wondering why such an attack caused a lot of issues and pain, well, the attackers made use of addresses found around the web for their malicius subscription requests. That means we received a lot of emails from people that have never heard about the GNOME mailing lists but received around &lt;strong>10k subscription requests&lt;/strong> that were seemingly being sent by themselves.&lt;/p>
&lt;p>It was obvious we needed to look at a backup solution and luckily someone on our support channel suggested the freedesktop.org sysadmins recently added CAPTCHAs support to Mailman.  I’m now sharing the patch and providing a few more details on how to properly set it up on either DEB or RPM based distributions. Credits for the patch should be given to Debian Developer &lt;span style="font-weight: bold; color: #222222;">Tollef Fog Heen&lt;/span>&lt;span style="color: #222222;">, who has been so kind to share it with us.&lt;/span>&lt;/p>
&lt;p>Before patching your installation make sure to install the &lt;strong>python-recaptcha&lt;/strong> package (tested on Debian with Mailman 2.1.15) on DEB based distributions and &lt;strong>python-recaptcha-client&lt;/strong> on RPM based distributions. (I personally tested it against Mailman release 2.1.15, RHEL 6)&lt;/p>
&lt;h3 id="the-patch">The Patch&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">diff&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">git&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">listinfo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">listinfo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">index&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="n">a54517&lt;/span>&lt;span class="o">..&lt;/span>&lt;span class="n">d6417ca&lt;/span> &lt;span class="mi">100644&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">listinfo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+++&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">listinfo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">31&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">8&lt;/span> &lt;span class="o">@@&lt;/span> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Errors&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">i18n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.htmlformat&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="o">*&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman.Logging.Syslog&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">syslog&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>&lt;span class="kn">from&lt;/span> &lt;span class="nn">recaptcha.client&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">captcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Set up i18n&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">i18n&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">_&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">203&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">9&lt;/span> &lt;span class="o">@@&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">list_listinfo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mlist&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lang&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">FormatFormStart&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;listinfo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">FormatBox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;fullname&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="c1"># Captcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">replacements&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;mm-recaptcha-javascript&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">captcha&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">displayhtml&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mm_cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RECAPTCHA_PUBLIC_KEY&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">use_ssl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Do the expansion.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">AddItem&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ParseTags&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;listinfo.html&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">replacements&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lang&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span> &lt;span class="n">doc&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Format&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">diff&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">git&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">subscribe&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">subscribe&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">index&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="n">b0b0e4&lt;/span>&lt;span class="o">..&lt;/span>&lt;span class="n">c1c7b8c&lt;/span> &lt;span class="mi">100644&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">---&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">subscribe&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+++&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Mailman&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">Cgi&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">subscribe&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">21&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">8&lt;/span> &lt;span class="o">@@&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">import&lt;/span> &lt;span class="nn">cgi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">import&lt;/span> &lt;span class="nn">signal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>&lt;span class="kn">from&lt;/span> &lt;span class="nn">recaptcha.client&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">captcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">mm_cfg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">Mailman&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Utils&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">@@&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">132&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">6&lt;/span> &lt;span class="o">+&lt;/span>&lt;span class="mi">130&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">17&lt;/span> &lt;span class="o">@@&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">process_form&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mlist&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">doc&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cgidata&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lang&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">remote&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;REMOTE_HOST&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;REMOTE_ADDR&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;unidentified origin&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="c1"># recaptcha&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">captcha_response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">captcha&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">submit&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">cgidata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getvalue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;recaptcha_challenge_field&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">cgidata&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getvalue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;recaptcha_response_field&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">mm_cfg&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">RECAPTCHA_PRIVATE_KEY&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">remote&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">captcha_response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">is_valid&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span> &lt;span class="n">results&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Invalid captcha&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Was an attempt made to subscribe the list to itself?&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">email&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">mlist&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">GetListEmail&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">syslog&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;mischief&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Attempt to self subscribe &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s1">: &lt;/span>&lt;span class="si">%s&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">email&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">remote&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="additional-setup">Additional setup&lt;/h3>
&lt;p>Then on the &lt;em>/var/lib/mailman/templates/en/listinfo.html&lt;/em> template (right below &lt;em>&lt;mm-digest-question-end>&lt;/em>)  add:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Please fill out the following captcha
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">td&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">mm-recaptcha-javascript&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">TD&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">tr&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Make also sure to generate a public and private key at &lt;a href="https://www.google.com/recaptcha" target="_blank">&lt;a href="https://www.google.com/recaptcha">https://www.google.com/recaptcha&lt;/a>&lt;/a> and add the following paramaters on your &lt;em>mm_cfg.py&lt;/em> file:&lt;/p>
&lt;ul>
&lt;li>RECAPTCHA_PRIVATE_KEY&lt;/li>
&lt;li>RECAPTCHA_PUBLIC_KEY&lt;/li>
&lt;/ul>
&lt;p>Loading &lt;strong>reCAPTCHAs&lt;/strong> images from a trusted &lt;strong>HTTPS&lt;/strong> source can be done by changing the following line:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">replacements[&amp;#39;&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">mm-recaptcha-javascript&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&amp;#39;] = captcha.displayhtml(mm_cfg.RECAPTCHA_PUBLIC_KEY, use_ssl=False)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>to&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">replacements[&amp;#39;&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">mm-recaptcha-javascript&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&amp;#39;] = captcha.displayhtml(mm_cfg.RECAPTCHA_PUBLIC_KEY, use_ssl=True)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="epel-6-related-details">EPEL 6 related details&lt;/h3>
&lt;p>A few additional details should be provided in case you are setting this up against a &lt;strong>RHEL 6&lt;/strong> host: (or any other machine using the EPEL 6 package &lt;em>python-recaptcha-client-1.0.5-3.1.el6&lt;/em>)&lt;/p>
&lt;p>Importing the recaptcha.client module will fail for some strange reason, importing it correctly can be done this way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ln -s /usr/lib/python2.6/site-packages/recaptcha/client /usr/lib/mailman/pythonlib/recaptcha&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and then fix the imports also making sure &lt;em>sys.path.append(“/usr/share/pyshared”)&lt;/em> is not there:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">recaptcha&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">captcha&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>That’s not all, the package still won’t work as expected given the API_SSL_SERVER, API_SERVER and VERIFY_SERVER variables on captcha.py are outdated (filed as &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=1093855" target="_blank">bug #1093855&lt;/a>), substitute them with the following ones:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">API_SSL_SERVER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://www.google.com/recaptcha/api&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">API_SERVER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;http://www.google.com/recaptcha/api&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">VERIFY_SERVER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;www.google.com&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>And then on line 76:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;https://%s/recaptcha/api/verify&amp;#34; % VERIFY_SERVER,&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="recaptcha-v2">reCAPTCHA v2&lt;/h3>
&lt;p>Google’s reCAPTCHA v1 will be deactivated starting from the 31th of March 2018, read more on how to migrate your Mailman install to version 2 &lt;a href="https://www.dragonsreach.it/2018/02/26/adding-recaptcha-v2-support-mailman/">here&lt;/a>.&lt;/p>
&lt;p>That should be all! Enjoy!&lt;/p></description><link>https://www.dragonsreach.it/2014/05/03/adding-recaptcha-support-to-mailman/</link><guid>https://www.dragonsreach.it/2014/05/03/adding-recaptcha-support-to-mailman/</guid><pubDate>Sat, 03 May 2014 09:37:23 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Fedy’s installation of Brackets bricks your Fedora installation</title><description>&lt;p>I wanted to give &lt;a href="http://satya164.github.io/fedy/" target="_blank">Fedy&lt;/a> a try yesterday, specifically to install the **Brackets **code editor designed for web developers. I’m pretty lazy when it comes to install external packages (from the Brackets.io’s homepage it looked like only a DEB file was available) and after asking a few friends who made heavy use of Fedy in the past about its stability and credibility I went ahead and followed the provided instructions to set it up.&lt;/p>
&lt;p>The interface was pretty straightforward and installing Brackets was as easy and clicking on the relevant button. Before starting the installation I gave a fast look around to the various bash scripts used by Fedy to install the package I wanted and yeah, I admit I did not pay enough attention to a few lines of the code and went ahead with the installation.&lt;/p>
&lt;p>After hacking a bit with Brackets I decided it was time for me to head to bed but shutting down my laptop surprisingly returned various errors related to Systemd’s journal not being able to shutdown properly. I then tried to reboot the machine and found out the laptop was totally not bootable anymore.&lt;/p>
&lt;p>The error it was reported at boot (Systemd Journal not being able to start properly) was pretty strange and after looking around the web I couldn’t find any other report about similar failures. I then started digging around with a friend and made the following guesses:&lt;/p>
&lt;ol>
&lt;li>The root partition was running out of space (just 70M left), I then cleaned it a bit and rebooted with no luck. My first guess was &lt;em>/tmp&lt;/em> going out of space when Systemd tries to populate it at boot time.&lt;/li>
&lt;li>I checked yum history to find out what Fedy could have taken in, but nothing relevant was found given Fedy does not install RPM packages on its own, it usually retrieves a tarball (or in my case a DEB package) and installs it by extracting / cping the content&lt;/li>
&lt;li>I turned SELinux to Permissive and rebooted the machine, surprise, the machine was bootable again&lt;/li>
&lt;/ol>
&lt;p>The next move was running a &lt;em>restorecon -r -v /&lt;/em> against the root partition, the result was awful: the whole &lt;em>/usr&lt;/em>‘s context was turned into &lt;em>usr_tmp_t&lt;/em>. Digging around the code for the Brackets installer the following code was found:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">file&lt;/span>&lt;span class="p">%.*&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ar p &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$file&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;data.tar.gz&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> tar -C &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">file&lt;/span>&lt;span class="p">%.*&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> -xzf -
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -af &lt;span class="si">${&lt;/span>&lt;span class="nv">file&lt;/span>&lt;span class="p">%.*&lt;/span>&lt;span class="si">}&lt;/span>/* &lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&amp;lt;br&amp;gt;&lt;/p>
&lt;p>And previously:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">get_file_quiet &lt;span class="s2">&amp;#34;http://download.brackets.io/&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;brackets.htm&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">get&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>cat &lt;span class="s2">&amp;#34;brackets.htm&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> tr &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span> &lt;span class="s1">&amp;#39;\n&amp;#39;&lt;/span> &lt;span class="p">|&lt;/span> grep -o &lt;span class="s2">&amp;#34;file.cfm?platform=LINUX&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">arch&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;amp;build=[0-9]*&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> head -n &lt;span class="m">1&lt;/span> &lt;span class="p">|&lt;/span> sed -e &lt;span class="s1">&amp;#39;s/^/http:\/\/download.brackets.io\//&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">file&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;brackets-LINUX.deb&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&amp;lt;br&amp;gt;&lt;/p>
&lt;p>So what the installer was doing is:&lt;/p>
&lt;ol>
&lt;li>Downloading the DEB file from the Brackets website&lt;/li>
&lt;li>Extracting its content to &lt;em>/tmp/fedy&lt;/em> and copying the contents of the &lt;em>data.tar.gz&lt;/em> tarball in place&lt;/li>
&lt;/ol>
&lt;p>A tree view of the &lt;em>data.tar.gz&lt;/em> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>-- opt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="sb">`&lt;/span>-- brackets
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">`&lt;/span>-- usr
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span>-- bin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">`&lt;/span>-- share&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&amp;lt;br&amp;gt;&lt;/p>
&lt;p>Copying the extracted content of the &lt;em>data.tar.gz&lt;/em> tarball to the target directories will do exactly one thing: it will overwrite the SELinux context of your &lt;em>/usr&lt;/em>, &lt;em>/bin&lt;/em>, &lt;em>/share&lt;/em> directories breaking your system. I would advise everyone to &lt;strong>NOT&lt;/strong> make use of &lt;strong>Fedy&lt;/strong> for installing the Brackets editor until the issue has been fixed. Honestly speaking I didn’t have time / willingness to check other bash scripts but something nasty might be found there as well. Generally I would never recommend to install anything on your system without making use of an RPM package. Lesson learned for me to never trust such tools in the future on my local system.&lt;/p>
&lt;p>The issue seems it was reported already one month ago, we added our report to the same issue. You can track it at &lt;a href="https://github.com/satya164/fedy/issues/79" target="_blank">&lt;a href="https://github.com/satya164/fedy/issues/79">https://github.com/satya164/fedy/issues/79&lt;/a>&lt;/a>.&lt;/p>
&lt;p>Resources:&lt;/p>
&lt;ol>
&lt;li>Faulty bash script: &lt;a href="https://github.com/satya164/fedy/blob/master/plugins/soft/adobe_brackets.sh" target="_blank">&lt;a href="https://github.com/satya164/fedy/blob/master/plugins/soft/adobe_brackets.sh">https://github.com/satya164/fedy/blob/master/plugins/soft/adobe_brackets.sh&lt;/a>&lt;/a>&lt;/li>
&lt;li>Why &lt;em>usr_tmp_t&lt;/em> gets added as &lt;em>/usr&lt;/em>‘s context: &lt;a href="https://github.com/satya164/fedy/blob/master/fedy#L26" target="_blank">&lt;a href="https://github.com/satya164/fedy/blob/master/fedy#L26">https://github.com/satya164/fedy/blob/master/fedy#L26&lt;/a>&lt;/a>.&lt;/li>
&lt;/ol></description><link>https://www.dragonsreach.it/2014/04/02/fedy-installation-of-brackets-bricks-your-fedora-installation/</link><guid>https://www.dragonsreach.it/2014/04/02/fedy-installation-of-brackets-bricks-your-fedora-installation/</guid><pubDate>Wed, 02 Apr 2014 14:11:27 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Fedora 20 on a Samsung Chronos Series 7</title><description>&lt;p>It’s been a while now since the very first time I posed my hands on this shiny new &lt;strong>Samsung Chronos Series 7&lt;/strong> laptop and oh dear… how much pain did my metallic-grey fellow take me in order to figure out how properly have every single piece of the hardware working as expected?&lt;/p>
&lt;p>What I did right after unboxing it was dropping Windows 8 with a copy of Fedora 20 (yeah, stupid me, I could have booted Windows 8 at least once to check for UEFI / firmware updates) and setting everything up as usual. Right after booting the machine I disabled Windows 8’s Secure Boot, configured the laptop to boot from the USB Key I plugged in and restarted it to finally perform the real OS installation.&lt;/p>
&lt;p>The laptop booted back (with UEFI mode marked as on) and the installation started. The Chronos Series 7 came with an iSSD of 16G in size, not much but definitely enough for keeping the root partition, swap and home directory. (I don’t need an huge home dir given all the various data is stored and mounted through NFS directly from the NAS)&lt;/p>
&lt;p>The installation went just fine and no issues arised at all until I booted into the system. The laptop since the beginning started to reach high CPU and graphics card temperatures (sticking around &lt;strong>75-78 C&lt;/strong> for the CPU and &lt;strong>60 C&lt;/strong> for the NVIDIA card), the fans were constantly on and I could feel the heat of the machine while typing. But that’s not all, the backlit keyboard had its lights always set as on (even in the case of a locked screen) and the battery life was sticking around one hour and an half.&lt;/p>
&lt;p>I’m now going to list all my findings and solutions for the above issues after spending some time debugging and trying hard.&lt;/p>
&lt;h2 id="uefi-vs-csm-legacy-bios-compatibility-mode">UEFI vs CSM (Legacy BIOS Compatibility mode)&lt;/h2>
&lt;p>Installing Fedora 20 with UEFI will result in your laptop not loading the &lt;strong>samsung-laptop&lt;/strong> kernel module at all. That is the result of a known bug (with a good chance to brick your laptop) on Samsung laptops and UEFI boots (mainly related to the incompatibility between the samsung-laptop kernel module and the Samsung’s UEFI firmware and its corruption when the module is loaded) . More details &lt;a href="https://bugs.launchpad.net/ubuntu-cdimage/+bug/1040557" target="_blank">here&lt;/a> and &lt;a href="http://www.bit-tech.net/news/hardware/2013/01/31/linux-samsung-deaths/1" target="_blank">here&lt;/a>.&lt;/p>
&lt;p>That said, before starting the installation, press &lt;strong>Fn+F2&lt;/strong> right after powering up your laptop, you will be then prompted with the laptop’s Setup configuration. Switch to the &lt;strong>Boot&lt;/strong> tab and disable Secure Boot making sure &lt;strong>CSM&lt;/strong> is selected on the dropdown window. (before moving on make also sure to disable the &lt;strong>Fast BIOS Mode&lt;/strong> on the Advanced tab before proceeding)&lt;/p>
&lt;p>When done, boot up a copy of Fedora 20 with your preferred media (I did use the Live CD myself) and make your way through the installation. Make sure to read on before touching the disk partitioning schemas.&lt;/p>
&lt;h2 id="issd-not-recognized-with-csm-mode-marked-as-on">iSSD not recognized with CSM mode marked as on&lt;/h2>
&lt;p>During one of my trials I did try to install the OS directly on the iSSD (in our examples, &lt;em>/dev/sdb&lt;/em>) itself. The result was the system being completely un-bootable probably cause the EFI firmware being unable to recognize the iSSD on CSM mode. (the only disk that was getting recognized was the 750G HDD (in our examples, &lt;em>/dev/sda&lt;/em>) the laptop has as an additional storage)&lt;/p>
&lt;p>While the EFI firmware is not able to recognize the iSSD at all properly (when in CSM mode) it can flawlessly detect the HDD. That means one thing: we can keep the root, home and swap partitions on the iSSD and move the boot, bios boot partitions on the HDD itself and boot up the machine from there.&lt;/p>
&lt;h2 id="the-installation">The installation&lt;/h2>
&lt;p>We left our installation tutorial right before starting the installation itself through Anaconda. Let’s resume from there by making sure the following partitions are created on the HDD (from now on &lt;em>/dev/sda&lt;/em>):&lt;/p>
&lt;ol>
&lt;li>a &lt;strong>bios-boot&lt;/strong> partition (details on how to set it up at &lt;a href="http://wiki.gentoo.org/wiki/GRUB2#BIOS.2FMBR_or_BIOS.2FGPT" target="_blank">here&lt;/a>).&lt;/li>
&lt;li>a &lt;strong>boot&lt;/strong> partition (ext4, 500M in size)&lt;/li>
&lt;/ol>
&lt;p>Once done, perform the installation on the iSSD (from now on &lt;em>/dev/sdb&lt;/em>), my setup on the 16G iSSD:&lt;/p>
&lt;p>LVM Volume Group with three logical volumes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>5.12 G&lt;/strong> /home + Luks (5.12 G for an home directory seems not enough but that’s definitely more than enough when you have a local HDD and a NAS with more than 2T of storage)&lt;/li>
&lt;li>&lt;strong>7.8 G&lt;/strong> / (I prefer keeping root a big bigger than home to prevent the need to cleanup the yum cache and other packages cruft every now and then)&lt;/li>
&lt;li>&lt;strong>1.5 G&lt;/strong> swap space&lt;/li>
&lt;/ol>
&lt;p>Another working setup might be:&lt;/p>
&lt;ol>
&lt;li>A &lt;strong>15G&lt;/strong> / partition on the iSSD, no need for LVM here&lt;/li>
&lt;li>An LVM Volume Group that will store the /home and swap space so you can expand it to be more than just &lt;strong>5G / 1.5G&lt;/strong>. The LVM VolGroup should ideally go on its own partition on &lt;em>/dev/sda&lt;/em>&lt;/li>
&lt;/ol>
&lt;p>When the system has been installed, mount the &lt;em>/dev/sda&lt;/em> boot partition you previously created and install grub:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">mount /dev/sda3 /mnt/boot-sda
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">grub2-install /dev/sda&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>I did assume &lt;em>/dev/sda3&lt;/em> was your /boot partition, make sure to check that is right for your case as well. (just run &lt;em>fdisk -l /dev/sda&lt;/em> to find out)&lt;/p>
&lt;p>When done, mount the &lt;em>/dev/sdb1&lt;/em> partition and copy all the files to the previously created mount point /mnt/boot-sda. From there figure out the UUID (&lt;em>ls -l /dev/disk/by-uuid&lt;/em>) for the /dev/sda3 partition and modify the relevant entries on the &lt;em>/boot/grub2/grub.cfg&lt;/em> file removing the UUID for the &lt;em>/dev/sdb1&lt;/em> (in my case that was the partition containing /boot) partition with the one of &lt;em>/dev/sda3&lt;/em>. Save the file and reboot the machine.&lt;/p>
&lt;p>You should then be able to unmount the /boot partition from &lt;em>/dev/sdb1&lt;/em> and modify the relevant &lt;em>/etc/fstab&lt;/em> entry with &lt;em>/dev/sda3&lt;/em>‘s UUID. That way new kernel’s installations will be handled correctly without the need to manually edit &lt;em>/boot/grub2/grub.cfg&lt;/em> and moving around the initramfs / vmlinuz images. At this point it should be safe to remove the &lt;em>/dev/sdb1&lt;/em> partition completely.&lt;/p>
&lt;h2 id="things-to-do-after-installing-fedora-20">Things to do after installing Fedora 20&lt;/h2>
&lt;h3 id="installing-bumblebee">Installing Bumblebee&lt;/h3>
&lt;p>The &lt;strong>NP700Z3C&lt;/strong> has a &lt;strong>NVIDIA GeForce GT 630M&lt;/strong> that benefits from the &lt;strong>NVIDIA Optimus technology&lt;/strong> which allows the user to gather the maximum performance possible when launching specific high-demand applications (like during gameplay or while watching an HD movie) and fallback to the integrated GPU when the user is performing normal operations like browsing the web, writing emails or text editing.&lt;/p>
&lt;p>Luckily the Bumblebee project comes in help about this providing Optimus support for a variety of Linux distributions. More details on how to set it up &lt;a href="https://fedoraproject.org/wiki/Bumblebee" target="_blank">here&lt;/a>. (you will need &lt;strong>bumblebee&lt;/strong>, &lt;strong>bumblebee-nvidia&lt;/strong> and &lt;strong>bbswitch&lt;/strong>)&lt;/p>
&lt;h3 id="installing-tlp">Installing TLP&lt;/h3>
&lt;p>From the &lt;strong>tlp&lt;/strong>‘s website:&lt;/p>
&lt;blockquote>
&lt;p>TLP brings you the benefits of advanced power management for Linux without the need to understand every technical detail. TLP comes with a default configuration already optimized for battery life, so you may just install and forget it. Nevertheless TLP is highly customizable to fulfil your specific requirements.&lt;/p>
&lt;/blockquote>
&lt;p>I can tell you power management for your laptop has never been easier with tlp. Make sure to visit tlp’s &lt;a href="http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html" target="_blank">homepage&lt;/a> for more details on how to set it up.&lt;/p>
&lt;h3 id="samsung-tools">Samsung Tools&lt;/h3>
&lt;p>From the &lt;strong>samsung-tool&lt;/strong>‘s homepage:&lt;/p>
&lt;blockquote>
&lt;p>Samsung Tools is the successor of Samsung Scripts provided by the ‘Linux On My Samsung’ project.&lt;/p>
&lt;p>It enables control in a friendly way of the devices available on Samsung laptops (bluetooth, wireless, webcam, backlight, CPU fan, special keys) and the control of various aspects related to power management, like the CPU undervolting (when a PHC-enabled kernel is available).&lt;/p>
&lt;/blockquote>
&lt;p>Given there’s no RPM available for samsung-tools, downloading the tarball and running make as root should suffice for installing it on your laptop.&lt;/p>
&lt;h3 id="kernel-flags">Kernel flags&lt;/h3>
&lt;p>What seem to have helped me a lot with the high CPU temperatures (and thus with the noisy fans going on and on) are the following Kernel flags you should pass to Grub through the &lt;em>/etc/sysconfig/grub&lt;/em> file on the &lt;em>GRUB_CMDLINE_LINUX&lt;/em> line:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">pcie_aspm&lt;/span>&lt;span class="o">=&lt;/span>force i915.i915_enable_rc6&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> i915.i915_enable_fbc&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> i915.lvds_downclock&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> i915.semaphores&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> i915.modeset&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="nv">acpi_osi&lt;/span>&lt;span class="o">=&lt;/span>Linux &lt;span class="nv">rdblacklist&lt;/span>&lt;span class="o">=&lt;/span>nouveau&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="additional-notes">Additional notes&lt;/h3>
&lt;p>The above procedure has been tested with the laptop having the following &lt;a href="http://www.samsung.com/uk/consumer/pc-peripherals/notebook-computers/high-performance/NP700Z3C-S02UK-spec" target="_blank">specs&lt;/a>.&lt;/p>
&lt;p>The average temperature for the CPU is sticking around &lt;strong>47-51 C&lt;/strong>, while the discrete GPU at &lt;strong>49-51C&lt;/strong>. I could also get around 3.5 – 4 hours of battery life!&lt;/p>
&lt;p>That should be all! Please leave me a comment in case of questions, troubles with the above setup!&lt;/p></description><link>https://www.dragonsreach.it/2014/03/20/fedora-20-on-a-samsung-chronos-series-7/</link><guid>https://www.dragonsreach.it/2014/03/20/fedora-20-on-a-samsung-chronos-series-7/</guid><pubDate>Thu, 20 Mar 2014 15:36:38 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Manage passwords with ‘pass’</title><description>&lt;p>Fighting with passwords have always been one of my favorite battles in the past and unfortunately the former always won. I never liked using the root user that much for administering a machine and made a massive use of sudo, I won’t list all the benefits of using sudo, but the &lt;a href="https://help.ubuntu.com/community/RootSudo#Benefits_of_using_sudo" target="_blank">following wiki page&lt;/a> has a pretty nice overview of them.&lt;/p>
&lt;p>Said that, when using sudo it’s definitely ideal to combine a &lt;strong>strong password&lt;/strong> that is also easy to remember and type again when prompted. Sadly strong passwords that are also easy to remember can be considered an oxymoron. How hard would it be to recall a 30+ chars long password? Honestly that would be close to impossible for an human being but what if a little software available on the major GNU/Linux distributions could handle that for us? That’s where &lt;em>pass&lt;/em> comes handy, but what is pass? from the pass manpage itself:&lt;/p>
&lt;blockquote>
&lt;p>pass is a very simple password store that keeps passwords inside gpg2(1) encrypted files inside a simple directory tree residing at ~/.password-store. The pass utility provides a series of commands for manipulating the password store, allowing the user to add, remove, edit, synchronize, generate, and manipulate passwords.&lt;/p>
&lt;/blockquote>
&lt;p>I’m sure that a lot of you guys have been looking for a tool like this one for ages: &lt;em>pass&lt;/em> allows you to generate very strong passwords with &lt;a href="http://linux.die.net/man/1/pwgen" target="_blank">pwgen&lt;/a>, GPG encrypt them with your GPG Key, store them safely on your disk and make them available whenever you need them with a single command. But let’s move to the practice, give the following steps a try and enjoy how powerful your pass setup will be.&lt;/p>
&lt;h3 id="first-setup">First setup&lt;/h3>
&lt;p>Install the software:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">yum/apt-get install pass&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Generate a GPG Key if you don’t have one already, a detailed guide can be found &lt;a href="http://fedoraproject.org/wiki/Creating_GPG_Keys#Creating_GPG_Keys_Using_the_Command_Line" target="_blank">here&lt;/a>. Initialize your passwords storage. (&lt;strong>GPGKEYID&lt;/strong> can be retrieved by running &lt;strong>gpg –list-keys&lt;/strong> and then looking for a line similar to this one: &lt;strong>pub 4096R/B3A6223D 2012-06-25&lt;/strong>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass init GPGKEYID&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Generate your first password and call it ‘sudo_password’ given you are going to make use of it as your brand new sudo password. (we want it at least 30+ chars long)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass generate sudo_password &lt;span class="m">30&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>(Optional) Create as much passwords as you need and make sure to save them with unique names, that way you will be able to identify what a password is used for easily.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass generate gmail_password &lt;span class="m">30&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="additional-maintenance-commands-on-your-password-database">Additional maintenance commands on your password database&lt;/h3>
&lt;p>Look at the existing passwords on your database.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass ls&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Result:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">Password Store
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── gmail_password
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── sudo_password
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── root_password&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Manually edit a password.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass edit password_name&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Remove a password from your database.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass rm password_name&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Copy a password on your clipboard and paste it.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">pass -c password_name&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Are you wondering if &lt;em>pass&lt;/em> supports a VCS? Yeah, it does, it currently allows you to manage your passwords database with Git, so that each applied change to the database will be tracked through a VCS so that you won’t forget when and how you updated a specific password.&lt;/p></description><link>https://www.dragonsreach.it/2013/12/24/manage-passwords-with-pass/</link><guid>https://www.dragonsreach.it/2013/12/24/manage-passwords-with-pass/</guid><pubDate>Tue, 24 Dec 2013 15:51:20 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Configuring DNSSEC on your personal domain</title><description>&lt;p>Today I’ll be working out how to properly configure &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions" target="_blank">DNSSEC&lt;/a> on a &lt;strong>BIND9&lt;/strong> installation, I’ll also make sure to give you all the needed instructions to properly verify if a specific domain is being correctly covered by DNSSEC itself. In addition to that a few more details will be provided about adding the relevant &lt;strong>SSHFP&lt;/strong>‘s entries on your DNS zone files to be able to automatically verify the authenticity of your domain when connecting to it with SSH avoiding any possible &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack" target="_blank">MITM&lt;/a> attack.&lt;/p>
&lt;p>First of all, let’s create the Zone Signing Key (&lt;strong>ZSK&lt;/strong>) which is the key that will be responsible to sign any other record on the zone file which is not a DNSKEY record itself:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">dnssec-keygen -a RSASHA1 -b &lt;span class="m">1024&lt;/span> -n ZONE gnome.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Note:&lt;/strong> the dnssec-keygen binary file should be part of bind97 (RHEL 5) or bind (RHEL6) package according to yum whatprovides:&lt;/p>
&lt;p>RHEL 5:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">32:bind97-9.7.0-17.P2.el5_9.2.x86_64 : The Berkeley Internet Name Domain &lt;span class="o">(&lt;/span>BIND&lt;span class="o">)&lt;/span> DNS &lt;span class="o">(&lt;/span>Domain Name System&lt;span class="o">)&lt;/span> server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Repo : rhel-x86_64-server-5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Matched from:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filename : /usr/sbin/dnssec-keygen&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>RHEL 6:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">32:bind-9.8.2-0.17.rc1.el6.3.x86_64 : The Berkeley Internet Name Domain &lt;span class="o">(&lt;/span>BIND&lt;span class="o">)&lt;/span> DNS &lt;span class="o">(&lt;/span>Domain Name System&lt;span class="o">)&lt;/span> server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Repo : rhel-x86_64-server-6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Matched from:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filename : /usr/sbin/dnssec-keygen&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;span style="line-height: 1.5;">Then, create the Key Signing Key (&lt;strong>KSK&lt;/strong>), which will be used to sign all the DNSKEY records:&lt;/span>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">dnssec-keygen -a RSASHA1 -b &lt;span class="m">2048&lt;/span> -n ZONE -f KSK gnome.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Creating the above keys can take several minutes, when done copy the public keys to the zone file this way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">cat Kgnome.org*.key &amp;gt;&amp;gt; gnome.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>When done you can clean out the useless bits from the zone file and just leave the DNSKEY records (which are not commented out as you will notice)&lt;/p>
&lt;p>An additional and cleaner way of accomplishing the above is to use the INCLUDE rule on the zone file itself as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$INCLUDE&lt;/span> /srv/dnssec-keys/Kgnome.org+005+12345.key
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$INCLUDE&lt;/span> /srv/dnssec-keys/Kgnome.org+005+67890.key&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Choosing which method to use is really up to you.&lt;/p>
&lt;p>&lt;span style="line-height: 1.5;">Once that is done you can go ahead and sign the zone file. As of myself I’m making use of the &lt;/span>&lt;a style="line-height: 1.5;" href="http://infrastructure.fedoraproject.org/cgit/dns.git/tree/do-domains" target="_blank">do-domain&lt;/a> &lt;span style="line-height: 1.5;">script taken from the Fedora Infrastructure Team’s repositories. If you are going to use it yourself, make sure to adjust all the relevant variables to match your setup, especially &lt;/span>&lt;strong style="line-height: 1.5;">keyspath&lt;/strong>&lt;span style="line-height: 1.5;">, &lt;/span>&lt;strong style="line-height: 1.5;">region_zones&lt;/strong>&lt;span style="line-height: 1.5;">, &lt;/span>&lt;strong style="line-height: 1.5;">template_zone&lt;/strong>&lt;span style="line-height: 1.5;">, &lt;/span>&lt;strong style="line-height: 1.5;">signed_zones&lt;/strong> &lt;span style="line-height: 1.5;">and &lt;/span>&lt;strong style="line-height: 1.5;">&lt;span style="line-height: 1.5;">ARE&lt;/span>&lt;/strong>&lt;span style="line-height: 1.5;">&lt;strong>A&lt;/strong>. The do-domain script also checks your zone file through &lt;/span>&lt;strong style="line-height: 1.5;">named-checkzone&lt;/strong> &lt;span style="line-height: 1.5;">before signing it.&lt;/span>&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/11/gedit-code-assistance.png" alt="/me while editing the do-domains script with the preview of gnome-code-assistance!&amp;quot;">&lt;/p>
&lt;p>If instead you don’t want to use the script above, you can sign the zone file manually in the following way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">dnssec-signzone -K /path/to/your/dnssec/keys -e +3024000 -N INCREMENT gnome.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>By default, the above command will append ‘.signed’ to the file name, you can modify that behaviour by appending the ‘-f’ flag to the dnssec-signzone call. The ‘-N INCREMENT’ will increment the serial number automatically making use of the RFC 1982 arithmetics while the ‘-e’ flag will extend the zone signature end date from the default 30 days to 35. (this way we can safely run a monthly cron job that will sign the zone file automatically)&lt;/p>
&lt;p>You can make use of the following script to achieve the above:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nv">SIGNZONE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/usr/sbin/dnssec-signzone&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DNSSEC_KEYS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/srv/dnssec-keys&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">NAMEDCHROOT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/var/named/chroot&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ZONEFILES&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;gnome.org&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> &lt;span class="nv">$NAMEDCHROOT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> ZONE in &lt;span class="nv">$ZONEFILES&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SIGNZONE&lt;/span> -K &lt;span class="nv">$DNSSEC_KEYS&lt;/span> -e +3024000 -f &lt;span class="nv">$ZONE&lt;/span>.signed -N INCREMENT &lt;span class="nv">$ZONE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/sbin/service named reload&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Once the zone file has been signed just make sure to include it on named.conf and restart named:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">zone &lt;span class="s2">&amp;#34;gnome.org&amp;#34;&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">file &lt;span class="s2">&amp;#34;gnome.org.signed&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>&lt;span class="p">;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>When you’re done with that we should be moving ahead adding a &lt;strong>DS&lt;/strong> record for our domain at our domain registrar. My example is taken from the known &lt;strong>gandi.net&lt;/strong> registrar.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/11/gandi.png" alt="Gandi DNSSEC Interface">&lt;/p>
&lt;p>Select &lt;strong>KSK (257)&lt;/strong> and &lt;strong>(RSA/SHA-1)&lt;/strong> on the dropdown list and paste your public key on the box. You will find the public key you need on one of the Kgnome.org*.key files, you should look for the DNSKEY 257 entry as ‘&lt;em>dig DNSKEY gnome.org&lt;/em>‘ shows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="p">;;&lt;/span> ANSWER SECTION:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gnome.org. &lt;span class="m">888&lt;/span> IN DNSKEY &lt;span class="m">257&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">5&lt;/span> AwEAAbRD7AymDFuKc2iXta7HXZMleMkUMwjOZTsn4f75ZUp0of8TJdlU DtFtqifEBnFcGJU5r+ZVvkBKQ0qDTTjayL54Nz56XGGoIBj6XxbG8Es+ VbZCg0RsetDk5EsxLst0egrvOXga27jbsJ+7Me3D5Xp1bkBnQMrXEXQ9 C43QfO2KUWJVljo1Bii3fTfnHSLRUsbRn8Puz+orK71qxs3G9mgGR6rm n91brkpfmHKr3S9Rbxq8iDRWDPiCaWkI7qfASdFk4TLV0gSVlA3OxyW9 TCkPZStZ5r/WRW2jhUY/kjHERQd4qX5dHAuYrjJSV99P6FfCFXoJ3ty5 &lt;span class="nv">s3fl1RZaTo8&lt;/span>&lt;span class="o">=&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Once that is done you should have a fully covered DNSSEC domain, you can verify that this way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">dig . DNSKEY &lt;span class="p">|&lt;/span> grep -Ev &lt;span class="s1">&amp;#39;^($|;)&amp;#39;&lt;/span> &amp;gt; root.keys
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dig +sigchase +trusted-key&lt;span class="o">=&lt;/span>./root.keys gnome.org. A &lt;span class="p">|&lt;/span> cat -n&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The result:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">105&lt;/span> &lt;span class="p">;;&lt;/span> WE HAVE MATERIAL, WE NOW DO VALIDATION
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">106&lt;/span> &lt;span class="p">;;&lt;/span> VERIFYING DS RRset &lt;span class="k">for&lt;/span> org. with DNSKEY:59085: success
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">107&lt;/span> &lt;span class="p">;;&lt;/span> OK We found DNSKEY &lt;span class="o">(&lt;/span>or more&lt;span class="o">)&lt;/span> to validate the RRset
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">108&lt;/span> &lt;span class="p">;;&lt;/span> Ok, find a Trusted Key in the DNSKEY RRset: &lt;span class="m">19036&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">109&lt;/span> &lt;span class="p">;;&lt;/span> VERIFYING DNSKEY RRset &lt;span class="k">for&lt;/span> . with DNSKEY:19036: success
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">110&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">111&lt;/span> &lt;span class="p">;;&lt;/span> Ok this DNSKEY is a Trusted Key, DNSSEC validation is ok: SUCCESS&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Bonus content: Adding SSHFP entries for your domain and verifying them&lt;/strong>&lt;/p>
&lt;p>You can retrieve the SSHFP entries for a specific host with the following command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ssh-keygen -r &lt;span class="k">$(&lt;/span>hostname --fqdn&lt;span class="k">)&lt;/span> -f /etc/ssh/ssh_host_rsa_key.pub&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>When retrieved just add the &lt;strong>SSHFP&lt;/strong> entry on the zone file for your domain and verify it:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ssh -oVerifyHostKeyDNS&lt;span class="o">=&lt;/span>yes -v subdomain.gnome.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Or directly add the above parameter into your /etc/ssh/ssh_config file this way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">VerifyHostKeyDNS&lt;/span>&lt;span class="o">=&lt;/span>yes&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>And run ‘ssh -v subdomain.gnome.org’, the result you should receive:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">debug1: Server host key: RSA 00:39:fd:1a:a4:2c:6b:28:b8:2e:95:31:c2:90:72:03
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">debug1: found &lt;span class="m">1&lt;/span> secure fingerprints in DNS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">debug1: matching host key fingerprint found in DNS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">debug1: ssh_rsa_verify: signature correct&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>That’s it! Enjoy!&lt;/p></description><link>https://www.dragonsreach.it/2013/11/13/configuring-dnssec-personal-domain/</link><guid>https://www.dragonsreach.it/2013/11/13/configuring-dnssec-personal-domain/</guid><pubDate>Wed, 13 Nov 2013 13:53:31 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Back from GUADEC 2013</title><description>&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/08/av_guadec.jpg" alt=" Courtesy of Ana Rey, work licensed under the CC-BY-SA-2.0, available on Flickr.
">&lt;/p>
&lt;p>I wanna be really honest, getting back home from this year’s &lt;strong>GUADEC&lt;/strong> has been very painful for me but not because of the trip back home. I had such a very good time at Brno that I actually wanted to stay there for way more days! I must admit that I’ve been missing the italian food for a while until &lt;strong>Mattias Bengtsson&lt;/strong> suggested me to try having a dinner at the “&lt;strong>Flavours&lt;/strong>” indian restaurant. The result was simply amazing and I’ve been falling in love with the indian food we ate that evening so much that we went there again the day after.&lt;/p>
&lt;p>I had a lot of expectations from my very first GUADEC and I was very excited to meet all the people I’ve been contributing with during all these years. Meeting people up in person is fundamental and reminds you the fact that there is a human being with its own feelings and emotions behind a computer and that’s actually why I spent a lot of my time during the event speaking and hanging out with people, finding out their personal interests, their hobbies, the things they love doing on their free time.&lt;/p>
&lt;p>During the event, I had the great pleasure to present two talks:&lt;/p>
&lt;ol>
&lt;li>the &lt;strong>GNOME Infrastructure&lt;/strong>, the presentation is available &lt;a href="http://www.dragonsreach.it/wp-content/uploads/2013/08/The-GNOME-Infrastructure.odp" target="_blank">here&lt;/a> and the video is viewable at the following &lt;a href="http://www.superlectures.com/guadec2013/the-gnome-infrastructure" target="_blank">page&lt;/a>.&lt;/li>
&lt;li>a little resume of what we’ve been doing on the &lt;strong>GNOME Sysadmin team&lt;/strong> during this last year at the GNOME Foundation’s &lt;strong>Annual General Meeting&lt;/strong>. (AGM)&lt;/li>
&lt;/ol>
&lt;p>… and meet a lot of friends:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Mattias Bengtsson&lt;/strong>, you’ve been the greatest room mate of all times! Thanks for all your hints!&lt;/li>
&lt;li>&lt;strong>Andreas Nilsson&lt;/strong> and &lt;strong>Fabiana Simões&lt;/strong>, thanks for all your kind words, I’ll keep doing my best to provide you all the resources and work you need to make things happen!&lt;/li>
&lt;li>&lt;strong>Sriram Ramkrishna&lt;/strong>, you don’t know how much I enjoyed our nightly discussions and walks around the city centre, missing those times already!&lt;/li>
&lt;li>&lt;strong>Allan Day&lt;/strong> and &lt;strong>Jon McCann&lt;/strong>, it’s been truly amazing meeting you guys and hearing how much enthusiast you are about me and my work, thanks a *lot*!&lt;/li>
&lt;li>&lt;strong>Paul Frields&lt;/strong>, it’s been an absolute pleasure meeting you and your wife, I will never forget how you presented me to her at the &lt;strong>Starobrno Brewery&lt;/strong>: “&lt;em>He’s like the Kevin Fenzi of the GNOME Infrastructure!&lt;/em>“. That’s one of the greatest compliments someone can ever receive given the amount of work Kevin does on the Fedora Infrastructure. I’m also glad that we could remember &lt;strong>Seth&lt;/strong> together during my talk, thanks for coming!&lt;/li>
&lt;li>My italian friends, &lt;strong>Flavia&lt;/strong>, &lt;strong>Paolo&lt;/strong>, &lt;strong>Emanuele&lt;/strong>, &lt;strong>Giovanni&lt;/strong> and &lt;strong>Alessandro&lt;/strong>!&lt;/li>
&lt;li>&lt;strong>Tobias Mueller&lt;/strong>, glad we were finally able to meet in person! Thanks for your nano sessions!&lt;/li>
&lt;li>All the indian interns, &lt;strong>Saumya Dwivedi&lt;/strong>, &lt;strong>Saumya Pathak&lt;/strong>, &lt;strong>Sindhu Sundar&lt;/strong>, &lt;strong>Shivani Poddar&lt;/strong> who are definitely doing an amazing job! I was completely impressed by your talks and projects!&lt;/li>
&lt;li>&lt;strong>Ekaterina&lt;/strong>, &lt;strong>David&lt;/strong>, &lt;strong>Karen&lt;/strong>, &lt;strong>Marina&lt;/strong>, &lt;strong>Owen&lt;/strong>, &lt;strong>Rui&lt;/strong>, &lt;strong>Alberto&lt;/strong>: all you guys are simply great! It’s really unfortunate we weren’t able to spend a lot of time together during the event!&lt;/li>
&lt;/ol>
&lt;p>Overall the whole event has been a blast, thanks to the &lt;strong>GNOME Foundation&lt;/strong> making this possible by sponsoring my attendance at the event! I’m looking forward to &lt;strong>Strasburg 2014&lt;/strong> already and last but not least I’m preparing the greatest bid of all times for &lt;strong>GUADEC 2015&lt;/strong> to happen in &lt;strong>Italy&lt;/strong>. Stay tuned!&lt;/p>
&lt;div class="gallery">
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/08/seth_guadec.jpg"
&lt;figcaption>Seth at GUADEC&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/08/guadec_friends.jpg"
&lt;figcaption>GUADEC friends&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/08/mesri.jpg"
&lt;figcaption>Myself and Sri&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;p>Overall the whole event has been a blast, thanks to the &lt;strong>GNOME Foundation&lt;/strong> making this possible by sponsoring my attendance at the event! I’m looking forward to &lt;strong>Strasburg 2014&lt;/strong> already and last but not least I’m preparing the greatest bid of all times for &lt;strong>GUADEC 2015&lt;/strong> to happen in &lt;strong>Italy&lt;/strong>. Stay tuned!&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/08/sponsored-badge-simple.png" alt="sponsored-badge-simple">
&lt;br>&lt;/p></description><link>https://www.dragonsreach.it/2013/08/12/back-from-guadec-2013/</link><guid>https://www.dragonsreach.it/2013/08/12/back-from-guadec-2013/</guid><pubDate>Mon, 12 Aug 2013 15:51:30 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Two years later: Vim, Tmux and my Linux desktop</title><description>&lt;p>It’s been two years since my &lt;a href="http://www.dragonsreach.it/2011/09/04/new-desktop-mutt-and-irssi-setup/" target="_blank">latest blog post&lt;/a> about my Linux desktop and many things have changed since then. I completely moved all my machines to &lt;strong>GNOME 3&lt;/strong>, switched my main editor from &lt;strong>nano&lt;/strong> to &lt;strong>vim&lt;/strong> and my terminal multiplexer from &lt;strong>screen&lt;/strong> to &lt;strong>tmux&lt;/strong>. What didn’t change at all except for a tweaks on the theme is my &lt;strong>Irssi&lt;/strong> setup.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/06/dircolors_solarized.png" alt="dircolors_solarized">&lt;/p>
&lt;p>Switching from nano to vim has been a pain at first, nano is really a straightforward editor, it does what you actually need from a CLI editor but while it works just fine when modifying configuration or text files, it’s a bit limiting when it comes to programming. Vim on the other hand is highly customizable in every single part also thanks to its huge amount of plugins. Honestly I admit I spent several hours watching videos, reading documentation, trying out key bindings and I’m not completely used to vim to be as much productive I would like to be with it.&lt;/p>
&lt;p>What I found to be the common error of vim’s newcomers is their willingness to look around the web for a complete vimrc configuration file, full of key bindings, custom settings and personalizations. That’s definitely something you should avoid when learning to use vim, the perfect &lt;strong>vimrc&lt;/strong> doesn’t objectively exist, each of us should spend some time investigating what is the best configuration for your needs and build a vimrc accordingly time by time.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/06/vim.png" alt="vim">&lt;/p>
&lt;p>It will probably take months to have a complex vimrc file matching your needs completely, until then you won’t be able to define your vimrc to be “ultimate”. And that’s actually why wgetting someone else’s vimrc and copying it to your home folder won’t make you an expert of vim, it’ll probably make your life harder when trying a specific action with the stock settings will result in something you wouldn’t have expected thanks to a particular key binding on the vimrc you downloaded.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/06/tmux.png" alt="tmux">&lt;/p>
&lt;p>The other tool that definitely improved my productivity is &lt;strong>Tmux&lt;/strong> given the huge amount of open terminals I had every day during my sysadmin’s duties at GNOME. Each day usually started with one or two open terminals mainly meant for random maintenance issues, after a few hours the amount of open terminals jumped to around 30.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/06/irssi.png" alt="irssi">&lt;/p></description><link>https://www.dragonsreach.it/2013/06/27/two-years-later-vim-tmux-and-my-linux-desktop/</link><guid>https://www.dragonsreach.it/2013/06/27/two-years-later-vim-tmux-and-my-linux-desktop/</guid><pubDate>Thu, 27 Jun 2013 16:59:57 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>A second round of updates from the GNOME Sysadmin Team</title><description>&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/06/nagios.gnome_.org_.png" alt="nagios.gnome.org">&lt;/p>
&lt;p>I haven’t been blogging so much in the past months as I actually promised myself I would have but given the fact a lot has been done on the &lt;strong>GNOME Infrastructure&lt;/strong> lately it’s time for me to announce all the updates we did since my &lt;a href="http://www.dragonsreach.it/2013/03/07/some-updates-from-the-gnome-sysadmin-team/" target="_blank">latest blog post&lt;/a>. So here we come with all the items we’ve been looking at recently:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Our main &lt;strong>LDAP&lt;/strong> istance was moved from a very ancient machine (which unfortunately died with a broken disk a few weeks ago) to a newer box that currently contains several other admin tools like Mango and Daily Reports. (a little script written by &lt;strong>Owen Taylor&lt;/strong> for creating and storing several reports mainly related to backups and SSL certificates expiration dates) In addition to migrating our LDAP master to a newer machine, we did configure and setup replication to an LDAP slave to share a bit the load and most of all to link all the external (machines outside the RH’s internal network) machines to it.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>A lot of efforts have been spent in the so-called “&lt;strong>Puppet-ization&lt;/strong>” (Puppet allows you to reproduce a complete environment with just a few commands, it’s very very handy in the case of host’s migrations) and several new modules are now stored into our internal Puppet repository. Specifically all the &lt;strong>Iptables&lt;/strong> rules are currently managed in a centralized way, each node has its own rules and policies, finally there’s no need to ssh into each machine to retrieve the information we need for a specific firewall. In addition to the Iptables class, also Cobbler, Owncloud, Jabberd, Denyhosts and several other modules have been properly configured and currently reside in Puppet.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Another item that had top priority on the list was setting up another “webapps” virtual machine to migrate several services from one of the existing ancient machines to it. I can finally tell that the GNOME Infrastructure has get rid of all the old machines, all the services have been migrated to newer machines and most of all all the services are currently being served through SSL. (git, planet, &lt;a href="https://www.gnome.org">www.gnome.org&lt;/a>, l10n, guadec.org, bugzilla, blogs, developer, help, people, news etc.) In regard of SSL and &lt;strong>Bugzilla&lt;/strong>, we’ve configured our Bugzilla istance to serve attachments through a secondary domain which will look like: &lt;strong>&lt;em>&lt;a href="https://bug-id.bugzilla-attachments.gnome.org">https://bug-id.bugzilla-attachments.gnome.org&lt;/a>&lt;/em>&lt;/strong>, this to prevent cross-site scripting attacks in a better way than what we did before.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>We’ve also spent some time working on our Nagios istance hosted at &lt;strong>&lt;a href="https://nagios.gnome.org">https://nagios.gnome.org&lt;/a>&lt;/strong>. We’ve improved it dramatically by adding several new checks and covering all the services we currently take care of but that’s not all. &lt;strong>Event Handlers&lt;/strong> have been setup to help us addressing problems right after they occur on our web servers. The Nagios event handlers are currently configured to read the status of a specific Nagios service and in the case the status is set to CRITICAL, they restart httpd once, which is usually enough in the case of random Apache’s timeouts. But that’s again not all. A public view for &lt;strong>Nagios&lt;/strong> is now ready, every single GNOME contributor and developer should be able to check the current status of all the services we maintain just by loggin in with the username “&lt;strong>anonymous&lt;/strong>” and the password “&lt;strong>anonymous&lt;/strong>” at nagios.gnome.org.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Our wiki was upgraded to the latest &lt;strong>MoinMoin&lt;/strong> release, at the moment of writing, version &lt;strong>1.9.7&lt;/strong>. This release introduces stronger password hashes, please make sure to update your password as soon as you can to strenghten the security of your account. It was also clear that live.gnome.org was behaving a bit sluggish lately, we spent some time cleaning up spammers, old and deleted pages and things started flushing way better. More details about the cleanup can be found at &lt;a href="https://mail.gnome.org/archives/foundation-list/2013-May/msg00098.html">https://mail.gnome.org/archives/foundation-list/2013-May/msg00098.html&lt;/a>. (we cleaned up around 23000 spammers!)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The most exciting things I usually love to announce are new services. While I always prefer keeping the number of maintained services as low as possible it was time for the GNOME Infrastructure to broaden its horizons satisfying the requests coming from the community and the developers involved into the project. I won’t spend any more word about this since I’m sure you are all waiting for me to list the new services, so here they are:&lt;/p>
&lt;/li>
&lt;li>
&lt;p> A completely new &lt;strong>Jabber&lt;/strong> service hosted at jabber.gnome.org and accessible by all the GNOME Foundation members requesting access to it. More details about it can be found at &lt;a href="https://live.gnome.org/Sysadmin/Jabber" target="_blank">&lt;a href="https://live.gnome.org/Sysadmin/Jabber">https://live.gnome.org/Sysadmin/Jabber&lt;/a>&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>GNOME is extensively using IRC as its main communication tool, thus we’ve improved our Services IRC Bot to use a plugin called &lt;strong>MeetBot&lt;/strong>. Having a meeting and storing the logs in a public web server is currently possible with a really minor effort of learning a few commands to administer the plugin correctly. If you are going to have a meeting and you want to make use of MeetBot, make sure that Services is there, and give a look at &lt;a href="http://meetbot.gnome.org/Manual.html">http://meetbot.gnome.org/Manual.html&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Do you want to be always up-to-date with the status of the GNOME Infrastructure? and are you actually wondering what’s the best way to do so? if yes, you should probably have a look at &lt;a href="http://status.gnome.org" target="_blank">&lt;a href="http://status.gnome.org">http://status.gnome.org&lt;/a>&lt;/a>. This service makes use of &lt;a href="http://git.fedorahosted.org/git/fedora-status" target="_blank">Fedora-Status&lt;/a> by &lt;strong>Patrick Uiterwijk&lt;/strong> and allows the GNOME Sysadmin Team to let everyone know whether there is a problem with any of the services listed in the page. This service, together with the public view for Nagios and the brand new &lt;a href="https://mail.gnome.org/mailman/listinfo/infrastructure-announce" target="_blank">&lt;a href="mailto:infrastructure-announce@gnome.org">infrastructure-announce@gnome.org&lt;/a> &lt;/a>mailing list will definitely help everyone finding out what’s going on, where and how long it’ll take for the issue to be fixed.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>It took me a lot of pain having the &lt;strong>KGB IRC Collaboration bot&lt;/strong> packaged into the EPEL repositories but I finally managed to set it up on the GNOME Infrastructure. KGB has become very handy since the time Cia.vc closed its hosting and it’s available for anyone requesting access to it at &lt;strong>irc.gnome.org&lt;/strong>. If you are looking for Git commit notifications of a specific module directly on your IRC channel, this is what you want :-)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>An Owncloud instance is also available, more reading about what are the requirements for requesting access to it at the following &lt;a href="https://live.gnome.org/MembershipCommittee/MembershipBenefits#Account_on_cloud.gnome.org" target="_blank">link&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>An Etherpad istance is also available at &lt;a href="http://etherpad.gnome.org" target="_blank">&lt;a href="https://etherpad.gnome.org">https://etherpad.gnome.org&lt;/a>&lt;/a> to all the GNOME Teams that need it! Please drop me an e-mail at &lt;av at gnome dot org> if you are interested. (Pad’s creation is currently disabled for preventing spam)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Build.gnome.org has been revived and it’s currently hosting an &lt;a href="https://live.gnome.org/OSTree" target="_blank">OSTree&lt;/a> istance. GNOME Daily images are costantly being generated, interested in testing one the those images? give this &lt;a href="http://worldofgnome.org/how-to-try-gnome-os-yes-gnome-os/" target="_blank">article&lt;/a> a look.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>That’s all for now! See you all at &lt;strong>GUADEC&lt;/strong> and thanks everyone for all the hints, suggestions and mails you’ve been sending me in the past months! And a special thanks to &lt;strong>Ekaterina Gerasimova&lt;/strong> for taking the time to brainstorm with me suggesting new features and improvements over the GNOME Infrastructure!&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/06/status.gnome_.org_.png" alt="status.gnome.org">&lt;/p></description><link>https://www.dragonsreach.it/2013/06/14/a-second-round-of-updates-from-the-gnome-sysadmin-team/</link><guid>https://www.dragonsreach.it/2013/06/14/a-second-round-of-updates-from-the-gnome-sysadmin-team/</guid><pubDate>Fri, 14 Jun 2013 11:37:06 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Setting up your SSL certificates on OpenLDAP by using a Mozilla NSS database</title><description>&lt;p>I’ve recently spent some time setting up &lt;strong>TLS/SSL&lt;/strong> encryption (&lt;strong>SSSD&lt;/strong> won’t send a password in clear text when an user will try to authenticate against your LDAP server) on an &lt;strong>OpenLDAP&lt;/strong> istance and as you may know the only way for doing that on a &lt;strong>RHEL / CentOS&lt;/strong> environment is dealing with a &lt;strong>Mozilla NSS&lt;/strong> database (which is, in fact, a &lt;strong>SQLite&lt;/strong> database). I’ve been reading all the man pages of the relevant tools available to manipulate Mozilla NSS databases and I thought I would have shared the whole procedure and commands I used to achieve my goal. Even if you aren’t running an RPM based system you can opt to use a Mozilla NSS database to store your certificates as your preferred setup.&lt;/p>
&lt;h3 id="on-the-ldap-slapd-server">On the LDAP (SLAPD) server&lt;/h3>
&lt;p>*&lt;em>Re-create &lt;em>.db files&lt;/em>&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">mkdir /etc/openldap/certs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">modutil -create -dbdir /etc/openldap/certs&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Setup a CA Certificate&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">certutil -d /etc/openldap/certs -A -n &lt;span class="s2">&amp;#34;My CA Certificate&amp;#34;&lt;/span> -t TCu,Cu,Tuw -a -i /etc/openldap/cacerts/ca.pem&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>where &lt;strong>ca.pem&lt;/strong> should be your CA’s certificate file.&lt;/p>
&lt;p>&lt;strong>Remove the password from the Database&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">modutil -dbdir /etc/openldap/certs -changepw &lt;span class="s1">&amp;#39;NSS Certificate DB&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Creates the .p12 file and imports it on the Database&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">openssl pkcs12 -inkey domain.org.key -in domain.org.crt -export -out domain.org.p12 -nodes -name &lt;span class="s1">&amp;#39;LDAP-Certificate&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pk12util -i domain.org.p12 -d /etc/openldap/certs&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>where **domain.org.key **and **domain.org.crt **are the names of the certificates you previously created at your CA’s website.&lt;/p>
&lt;p>&lt;strong>List all the certificates on the database and make sure all the informations are correct&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">certutil -d /etc/openldap/certs -L&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Configure /etc/openldap/slapd.conf and make sure the TLSCACertificatePath points to your Mozilla NSS database&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">TLSCACertificateFile /etc/openldap/cacerts/ca.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TLSCACertificatePath /etc/openldap/certs/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TLSCertificateFile LDAP-Certificate&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="additional-commands">Additional commands&lt;/h3>
&lt;p>&lt;strong>Modify the trust flags if necessary&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">certutil -d /etc/openldap/certs -M -n &lt;span class="s2">&amp;#34;My CA Certificate&amp;#34;&lt;/span> -t &lt;span class="s2">&amp;#34;TCu,Cu,Tuw&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Delete a certificate from the database&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">certutil -d /etc/openldap/certs -D -n &lt;span class="s2">&amp;#34;My LDAP Certificate&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="on-the-clients-nslcd-uses-ldapconf-while-sssd-uses-etcsssdsssdconf">On the clients (nslcd uses ldap.conf while sssd uses /etc/sssd/sssd.conf)&lt;/h3>
&lt;p>&lt;strong>On /etc/openldap/ldap.conf&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">BASE &lt;span class="nv">dc&lt;/span>&lt;span class="o">=&lt;/span>domain,dc&lt;span class="o">=&lt;/span>org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">URI ldaps://ldap.domain.org
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TLS_REQCERT demand
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TLS_CACERT /etc/openldap/cacerts/ca.pem&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>On /etc/sssd/sssd.conf&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ldap_tls_cacert&lt;/span> &lt;span class="o">=&lt;/span> /etc/openldap/cacerts/ca.pem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ldap_tls_reqcert&lt;/span> &lt;span class="o">=&lt;/span> demand
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ldap_uri&lt;/span> &lt;span class="o">=&lt;/span> ldaps://ldap.domain.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="How_to_test_the_whole_setup">How to test the whole setup&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ldapsearch -x -b &lt;span class="s1">&amp;#39;dc=domain,dc=org&amp;#39;&lt;/span> -D &lt;span class="s2">&amp;#34;cn=Manager,dc=domain,dc=org&amp;#34;&lt;/span> &lt;span class="s1">&amp;#39;(objectclass=*)&amp;#39;&lt;/span> -H ldaps://ldap.domain.org -W -v&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Troubleshooting&lt;/strong>&lt;/p>
&lt;p>If anything goes wrong you can run SLAPD with the following args for its debug mode:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">/usr/sbin/slapd -d &lt;span class="m">256&lt;/span> -f /etc/openldap/slapd.conf -h &lt;span class="s2">&amp;#34;ldaps:/// ldap:///&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>**Possible errors: **&lt;/p>
&lt;p>If you happen to see an error similar to this one: “&lt;strong>TLS error -8049:Unrecognized Object Identifier.&lt;/strong>“, try running ldapsearch with its debug mode this way:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ldapsearch -d &lt;span class="m">1&lt;/span> -x -ZZ -H ldap://ldap.domain.org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Make also sure that the &lt;strong>FQDN&lt;/strong> you are trying to connect to is listed on the trusted FQDN’s list of your &lt;strong>domain.org.crt&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Update&lt;/strong>: as SSSD’s developer &lt;strong>Stephen Gallagher&lt;/strong> correctly pointed out on the comments using ldap_tls_reqcert = allow isn’t a best practice since it may take in &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack" target="_blank">Man in the Midle Attacks&lt;/a>, adjusting the how to to match his suggestions.&lt;/p></description><link>https://www.dragonsreach.it/2013/03/27/setting-ssl-certificates-openldap-mozilla-nss-database/</link><guid>https://www.dragonsreach.it/2013/03/27/setting-ssl-certificates-openldap-mozilla-nss-database/</guid><pubDate>Wed, 27 Mar 2013 12:04:02 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Some updates from the GNOME Sysadmin Team</title><description>&lt;p>It’s been more than a month now since I started looking into the many outstanding items we had waiting on our To Do list here at the &lt;strong>GNOME Infrastructure&lt;/strong>. A lot has been done and a lot has yet to come during the next months, but I would like to share with you some of the things I managed to look at during these weeks.&lt;/p>
&lt;p>As you may understand many Sysadmin’s tasks are not perceived at all by users especially the ones related to the so-called “Puppet-ization” which refers to the process of creating / modifying / improving our internal Puppet repository. A lot of work has been done on that side and several new modules have been added, specifically Cobbler, Amavisd, SpamAssassin, ClamAV, Bind, Nagios / Check_MK (enabling Apache eventhandlers for automatic restart of faulty httpd processes), Apache.&lt;/p>
&lt;p>Another top priority item was migrating some of our services off to the old physical machines to virtual machines I did setup earlier. The machines that are now recycled are the following: (Two more are missing on the list, specifically window (which still hosts art.gnome.org, people.gnome.org and projects.gnome.org due to be migrated to another host in the next weeks) and label. (which still hosts our Jabberd, an &lt;a href="https://mail.gnome.org/archives/foundation-list/2013-March/msg00000.html" target="_blank">interesting discussion&lt;/a> on its future is currently ongoing on Foundation-list)&lt;/p>
&lt;ol>
&lt;li>&lt;strong>menubar&lt;/strong>, our old Postfix host served the GNOME Foundation since 2004 and processed millions of e-mails from and to @gnome.org addresses.&lt;/li>
&lt;li>&lt;strong>container&lt;/strong>, our old main NFS node was serving the GNOME Foundation since 2003, it hosted our mail archives, our FTP archives and all the /home/users/* directories.&lt;/li>
&lt;li>&lt;strong>button&lt;/strong> hosted many services (MySQL databases, LDAP, Mango) and served the Foundation since 2004, a faulty hardware took it down on January 2012.&lt;/li>
&lt;/ol>
&lt;p>And if you ever wanted to see how menubar, container and button look like, I have two photos for you with the machines being pulled out the &lt;strong>GNOME&lt;/strong> rack:&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/03/old-machines.jpg" alt="old-machines">
&lt;br>
&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2013/03/old-machines-2.jpg" alt="old-machines-2">&lt;/p>
&lt;p>Some of the things you may have perceived directly on your skin should be the following:&lt;/p>
&lt;ol>
&lt;li>Our live.gnome.org istance has been upgraded to the latest MoinMoin stable release, 1.9.6.&lt;/li>
&lt;li>The Services bot has been added to the &lt;strong>GIMPNET&lt;/strong> network and currently manages all GNOME channels, it currently acts as a Nickserv, Chanserv. More information about how you can register your nickname and gain the needed ACLs at the following &lt;a href="https://live.gnome.org/Sysadmin/IRC" target="_blank">wiki page&lt;/a>.&lt;/li>
&lt;li>Several &lt;strong>GNOME&lt;/strong> services and domains are now covered by SSL as you may have noticed on planet.gnome.org, news.gnome.org, blogs.gnome.org, l10n.gnome.org, git.gnome.org, help.gnome.org, developer.gnome.org.&lt;/li>
&lt;li>Re-design of our Mailman archives as you can see at &lt;a href="https://mail.gnome.org/archives/foundation-list/">https://mail.gnome.org/archives/foundation-list&lt;/a>. A big “thank you” goes to Olav Vitters for taking the time to rebuild our “archive” script from Perl to Python. About the Mailman topic, someone proposed me the use of &lt;a href="https://fedorahosted.org/hyperkitty/" target="_blank">HyperKitty&lt;/a>, that’s something we will evaluate in the next coming months but I find it a very interesting alternative to the current mail archiving.&lt;/li>
&lt;/ol>
&lt;p>What should you expect next?&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Bugzilla&lt;/strong> will be moved to another virtual machine and will be upgraded to the latest release.&lt;/li>
&lt;li>An &lt;strong>Owncloud&lt;/strong> istance will be setup for all the GNOME Foundation members and GNOME Teams that will need access to it.&lt;/li>
&lt;li>A discussion will be started for setting up a &lt;strong>Gitorious&lt;/strong> istance on the GNOME Infrastructure.&lt;/li>
&lt;li>A long-term item will be rewriting &lt;a href="https://live.gnome.org/Mango" target="_blank">Mango&lt;/a> in Django and adding several other features to it than the ones it has now. (ideally voting for Board elections, logins for managing your LDAP information such as your @gnome.org’s alias forward, shutdown of old an unused accounts after a certain period of time, automatic @gnome.org’s alias creation after the “Foundation Membership” flag is selected on LDAP, etc.)&lt;/li>
&lt;/ol>
&lt;p>Thanks a lot for all the mails I’ve received during these weeks containing reports and suggestions about how we should improve our Infrastructure! Please stay tuned, a lot more news are yet to come!&lt;/p></description><link>https://www.dragonsreach.it/2013/03/07/some-updates-from-the-gnome-sysadmin-team/</link><guid>https://www.dragonsreach.it/2013/03/07/some-updates-from-the-gnome-sysadmin-team/</guid><pubDate>Thu, 07 Mar 2013 14:49:26 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>IPv6 tunneling with Hurricane Electrics (HE)</title><description>&lt;p>I’ve been looking around for a possible way to connect to the IPv6 internet for some time now and given the fact my provider didn’t allow me to run IPv6 natively I had to find an alternative solution. &lt;strong>Hurricane Electrics&lt;/strong> (HE) provides (for free) five configurable &lt;strong>IPv4-to-IPv6&lt;/strong> tunnels together with a free &lt;strong>DNS service&lt;/strong> and an interesting &lt;strong>certification program&lt;/strong>.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2012/12/certificate_badge.png" alt="Hurricane Electrics IPv6 Certification">&lt;/p>
&lt;p>Willing to test the latest revision of the Internet Protocol on your &lt;strong>Debian&lt;/strong>, &lt;strong>Ubuntu&lt;/strong>, &lt;strong>Fedora&lt;/strong> machines? Here’s &lt;strong>how&lt;/strong>:&lt;/p>
&lt;p>&lt;strong>1.&lt;/strong> Register yourself at Hurricane Electrics by visiting &lt;a href="http://tunnelbroker.net/" target="_blank">tunnelbroker.net&lt;/a>.&lt;/p>
&lt;p>&lt;strong>2.&lt;/strong> &lt;a href="http://tunnelbroker.net/new_tunnel.php" target="_blank">Create a new tunnel&lt;/a> and make sure to use your &lt;strong>public IP&lt;/strong> address as your &lt;strong>IPv4 Endpoint&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>3.&lt;/strong> Write down the relevant details of your tunnel, specifically:&lt;/p>
&lt;ol>
&lt;li>Server IPv6 Address: 2001:470:&lt;strong>1f0a&lt;/strong>:a6f::1 /64&lt;/li>
&lt;li>Server IPv4 Address: 216.66.84.46 (this actually depends on which server did you choose on the previous step)&lt;/li>
&lt;li>Client IPv6 Address: 2001:470:&lt;strong>1f0a&lt;/strong>:a6f::2/64&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2012/12/tunnel_broker.png" alt="Tunnel Broker">&lt;/p>
&lt;p>&lt;strong>4.&lt;/strong> Create a little script that will update your &lt;strong>IPv4 tunnel endpoint&lt;/strong> every time your internet IP &lt;strong>changes&lt;/strong>. (this step is not needed if you have an internet connection with a &lt;strong>static IP&lt;/strong>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nv">USERNAME&lt;/span>&lt;span class="o">=&lt;/span>yourHEUsername
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>yourHEPassword
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TUNNELID&lt;/span>&lt;span class="o">=&lt;/span>yourHETunnelID
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GET &lt;span class="s2">&amp;#34;https://&lt;/span>&lt;span class="nv">$USERNAME&lt;/span>&lt;span class="s2">:&lt;/span>&lt;span class="nv">$PASSWORD&lt;/span>&lt;span class="s2">@ipv4.tunnelbroker.net/ipv4_end.php?tid=&lt;/span>&lt;span class="nv">$TUNNELID&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>5.&lt;/strong> Create the networking &lt;strong>configuration&lt;/strong> files on your computer:&lt;/p>
&lt;p>&lt;strong>Debian / Ubuntu&lt;/strong>, on the &lt;strong>/etc/network/interfaces&lt;/strong> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">auto he-ipv6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">iface he-ipv6 inet6 v4tunnel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">address 2001:470:&amp;lt;b&amp;gt;1f0a&amp;lt;/b&amp;gt;:a6f::2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">netmask &lt;span class="m">64&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">endpoint 216.66.80.30
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">local&lt;/span> 192.168.X.X &lt;span class="o">(&lt;/span>Your PC&lt;span class="err">&amp;#39;&lt;/span>s LAN IP address&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ttl &lt;span class="m">255&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gateway 2001:470:&amp;lt;b&amp;gt;1f0a&amp;lt;/b&amp;gt;:a6f::1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pre-up /home/user/bin/update_tunnel.sh&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Fedora&lt;/strong>, on the ** /etc/sysconfig/network-scripts/ifcfg-he-ipv6** file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DEVICE&lt;/span>&lt;span class="o">=&lt;/span>he-ipv6
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TYPE&lt;/span>&lt;span class="o">=&lt;/span>sit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BOOTPROTO&lt;/span>&lt;span class="o">=&lt;/span>none
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ONBOOT&lt;/span>&lt;span class="o">=&lt;/span>yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6INIT&lt;/span>&lt;span class="o">=&lt;/span>yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6TUNNELIPV4&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;216.66.80.30&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6TUNNELIPV4LOCAL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;192.168.X.X&amp;#34;&lt;/span> &lt;span class="o">(&lt;/span>Your PC&lt;span class="err">&amp;#39;&lt;/span>s LAN IP address&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6ADDR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2001:470:&amp;lt;b&amp;gt;1f0a&amp;lt;/b&amp;gt;:a6f::2/64&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and on the &lt;strong>/etc/sysconfig/network&lt;/strong> file, add:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">NETWORKING_IPV6&lt;/span>&lt;span class="o">=&lt;/span>yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6_DEFAULTGW&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2001:470:&amp;lt;b&amp;gt;1f0a&amp;lt;/b&amp;gt;:a6f::1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">IPV6_DEFAULTDEV&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;he-ipv6&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>You can then set up a little &lt;strong>/sbin/ifup-pre-local&lt;/strong> script to update the IPv4 tunnel endpoint when your dynamic IP changes or simply add the script on the &lt;strong>/etc/cron.daily&lt;/strong> directory and have it executed when you turn up your computer.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2012/12/ipv6_test.png" alt="A sample image taken from ipv6-test.com.">&lt;/p>
&lt;p>&lt;strong>6.&lt;/strong> Change the DNS servers on &lt;strong>/etc/resolv.conf&lt;/strong>:&lt;/p>
&lt;p>&lt;strong>OpenDNS:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">nameserver 2620:0:ccc::2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nameserver 2620:0:ccd::2&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Google DNS&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">nameserver 2001:4860:4860::8888
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nameserver 2001:4860:4860::8844&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>7.&lt;/strong> Restart your network and enjoy IPv6!&lt;/p>
&lt;p>&lt;strong>8.&lt;/strong> If you want to know more about IPv6 take some time for the &lt;a href="http://ipv6.he.net/certification" target="_blank">HE Certification program&lt;/a>, you will learn a lot and eventually win a sponsored &lt;strong>t-shirt&lt;/strong>, I just finished mine :-)&lt;/p>
&lt;p>&lt;strong>EDIT&lt;/strong>: Be aware of the fact that as soon as the tunnel is up, your computer will be exposed to to the internet without any kind of firewall (the tunnel sets up a direct connection to the internet, even bypassing your router’s firewall), you can secure your machine by using &lt;strong>ip6tables&lt;/strong>. Thanks Michael Zanetti for pointing this out!&lt;/p></description><link>https://www.dragonsreach.it/2012/12/21/ipv6-tunneling-hurricane-electrics/</link><guid>https://www.dragonsreach.it/2012/12/21/ipv6-tunneling-hurricane-electrics/</guid><pubDate>Fri, 21 Dec 2012 13:08:20 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>The future is Cloudy</title><description>&lt;p>Have you ever heard someone talking extensively about &lt;strong>Cloud Computing&lt;/strong> or generally &lt;strong>Clouds&lt;/strong>? and have you ever noticed the fact many people (even the ones who present themselves as experts) don’t really understand what a Cloud is at all? That happened to me multiple times and one of the most common misunderstandings is many see the Cloud as something being on the &lt;strong>internet&lt;/strong>. Many companies add a little &lt;strong>logo&lt;/strong> representing a cloud on their frontpage and without a single change on their infrastructure (but surely with a &lt;strong>price increment&lt;/strong>) they start calling their products as being on the Cloud. Given the lack of knowledge about this specific topic people tend to buy the product presented as being on the Cloud without understanding what they really bought.&lt;/p>
&lt;img class="aligncenter size-full wp-image-706" title="cloud-computing" src="http://www.dragonsreach.it/wp-content/uploads/2012/12/cloud-computing.png" alt="" width="400" height="362" />
&lt;p>But what Cloud Computing really means? it took several years and more than fifteen drafts to the &lt;strong>National Institute of Standards and Technology&lt;/strong>‘s (&lt;strong>NIST&lt;/strong>) to find a definition. The final accepted proposal:&lt;/p>
&lt;blockquote>
&lt;p style="text-align: left;">
&lt;em>&lt;strong>Cloud computing is a model for enabling ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources (e.g., networks, servers, storage, applications and services) that can be rapidly provisioned and released with minimal management effort or service provider interaction.&lt;/strong>&lt;/em>
&lt;/p>
&lt;/blockquote>
&lt;p>The above definition requires a few more clarifications specifically when it comes to understand where should we focus on while checking for a Cloud Computing solution. A few key points:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>On-demand self-service&lt;/strong>: every consumer will be able to unilaterally provision multiple computing capabilities like server time, storage, bandwidth, dedicated RAM or CPU without requiring any sort of human interaction from their respective Cloud providers.&lt;/li>
&lt;li>&lt;strong>Rapid elasticity and scalability&lt;/strong>: all the computing capabilities outlined above can be elastically provisioned and released depending on how much demand my company will have in a specific period of time. Suppose the X company is launching a new product today and it expects a very large number of customers. The X company will add more resources to their  Cloud for the very first days (where they suppose the load to be very high) and then it’ll scale the resources back as they were before. Elasticity and scalability permit the X company to improve and enhance their infrastructure when they need it with an huge saving in monetary terms.&lt;/li>
&lt;li>&lt;strong>Broad network access&lt;/strong>: capabilities are available over the network and accessed through standard mechanisms that promote use by heterogeneous thin or thick client platforms (e.g., mobile phones, tablets, laptops, and workstations).&lt;/li>
&lt;li>&lt;strong>Measured service&lt;/strong>: Cloud systems allow maximum transparency between the provider and the consumer, the usage of all the resources is monitored, controlled, and reported. The consumer knows how much will spend, when and in how long.&lt;/li>
&lt;li>&lt;strong>Resource pooling&lt;/strong>: each provider’s computing resources are pooled to serve multiple consumers at the same time. The consumer has no control or knownledge over the exact location of the provided resources but may be able to specify location at a higher level of abstraction (e.g., country, state, or datacenter).&lt;/li>
&lt;li>&lt;strong>Resources price&lt;/strong>: when buying a Cloud service make sure the cost for two units of RAM, storage, CPU, bandwidth, server time is exactly the double of the price of one unit of the same capability. An example, if a provider offers you one hour of bandwitdh for 1 Euro, the price of  two hours will have to be 2 Euros.&lt;/li>
&lt;/ol>
&lt;div>
Another common error I usually hear is people feeling Cloud Computing just as a place to put their files online as a backup or for sharing them with co-workers and friends. That is just one of the available Cloud &amp;#8220;&lt;strong>features&lt;/strong>&amp;#8220;, specifically the &amp;#8220;&lt;strong>Cloud Storage&lt;/strong>&amp;#8220;, where typical examples are companies like &lt;strong>Dropbox&lt;/strong>, &lt;strong>Spideroak&lt;/strong>, &lt;strong>Google Drive&lt;/strong>,&lt;strong> iCloud&lt;/strong> and so on. But let&amp;#8217;s make a little note about the other three &amp;#8220;features&amp;#8221;:
&lt;/div>
&lt;div>
&lt;ol>
&lt;li>
&lt;strong>Infrastructure as a Service&lt;/strong> (&lt;strong>IaaS&lt;/strong>): the capability provided to the consumer is to provision processing, storage, networks, and other fundamental computing resources where the consumer is able to deploy and run arbitrary software, which can include operating systems and applications. In this specific case the consumer has still no control or management over the underlying Cloud infrastructure but has control over operating systems, storage, and deployed applications. A customer will be able to add and destroy virtual machines (VMs), install an operating system on them based on custom kickstart files and eventually manage selected networking components like firewalls, hosted domains, accounts.
&lt;/li>
&lt;li>
&lt;strong>Platform as a Service&lt;/strong> (&lt;strong>PaaS&lt;/strong>). the capability provided to the consumer is to deploy onto the cloud infrastructure consumer-created or acquired applications created using programming languages, libraries, services, and tools  (like Mysql + PHP + PhpMyAdmin or Ruby on Rails) supported by the provider. In this specific case the consumer has still no control or management over the Cloud infrastructure itself (servers, OSs, storage, bandiwitdh etc.) but has control over the deployed applications and configuration settings for the application-hosting environment.
&lt;/li>
&lt;li>
&lt;strong>Software as a Service&lt;/strong> (&lt;strong>SaaS&lt;/strong>): the capability provided to the consumer is to use the provider’s applications running on a Cloud infrastructure. The applications are accessible through various client devices, such as a browser, a mobile phone or a program interface. The consumer doesn&amp;#8217;t not manage nor control the Cloud infrastructure (servers, OSs, storage, bandwidth, etc.) that allows the applications to run. Even the provided applications aren&amp;#8217;t customizable by the consumer, which should rely on limited configuration settings.
&lt;/li>
&lt;/ol>
&lt;/div>
&lt;p>&lt;a href="http://www.dragonsreach.it/wp-content/uploads/2012/12/cloud-service-models.jpg">&lt;img class="size-full wp-image-704 aligncenter" title="cloud-service-models" src="http://www.dragonsreach.it/wp-content/uploads/2012/12/cloud-service-models.jpg" alt="" width="550" height="322" />&lt;/a>&lt;/p>
&lt;p>The Cloud Computing technology is reasonably the future but can we trust Cloud providers? Are we sure that no one will ever have access to our files except us? and what about governments interested in acquiring a specific customer data hosted on the Cloud?&lt;/p>
&lt;p>I always suggest to read deeply both the &lt;strong>Privacy Policy&lt;/strong> and &lt;strong>Terms of Use&lt;/strong> of a certain service before signing in especially when it comes to choose a Cloud storage provider. Many providers have the same aspect, they seem to provide the same resources, the same amount of storage for the same price but legally they may present different problems, and that is the case of &lt;strong>Spideroak&lt;/strong> vs &lt;strong>Dropbox&lt;/strong>. Quoting from the Dropbox’s &lt;strong>Privacy Policy&lt;/strong>:&lt;/p>
&lt;blockquote>
&lt;div>
&lt;strong>&lt;em>Compliance with Laws and Law Enforcement Requests; Protection of DropBox’s Rights. We may disclose to parties outside Dropbox files stored in your Dropbox and information about you that we collect when we have a good faith belief that disclosure is reasonably necessary to (a) comply with a law, regulation or compulsory legal request; (b) protect the safety of any person from death or serious bodily injury; (c) prevent fraud or abuse of DropBox or its users; or (d) to protect Dropbox’s property rights. If we provide your Dropbox files to a law enforcement agency as set forth above, we will remove Dropbox’s encryption from the files before providing them to law enforcement. However, Dropbox will not be able to decrypt any files that you encrypted prior to storing them on Dropbox.&lt;/em>&lt;/strong>
&lt;/div>
&lt;/blockquote>
&lt;p>It’s evident that Dropbox employees can access your data or be forced by legal process to turn over your data &lt;strong>unencrypted&lt;/strong>. On the other side, Spideroak on its latest update to its &lt;a href="https://spideroak.com/blog/20120502022627-spideroak-privacy-policy-update">Privacy Policy&lt;/a> states that data stored on their  Cloud  is &lt;strong>encrypted&lt;/strong> and &lt;strong>inaccessible&lt;/strong> without user’s key, which is stored locally on user’s computers.&lt;/p>
&lt;p>And what about the latest research paper, titled “&lt;strong>&lt;a href="http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2181534" target="_blank">Cloud Computing in Higher Education and Research Institutions and the USA Patriot Act&lt;/a>&lt;/strong>” written by the legal experts of the &lt;strong>University of Amsterdam’s Institute for Information Law&lt;/strong> stating the anti-terror &lt;strong>Patriot Act&lt;/strong> could be theoretically used by U.S. law enforcement to bypass strict European privacy laws to acquire citizen data within the European Union without their consensus?&lt;/p>
&lt;p>The only requirement for the data acquisition is the provider being an U.S company or an European company conducting systematic business in the U.S. For example an Italian company storing their documents (protected by the European privacy laws and under the general Italian jurisdiction) on a provider based in Europe but conducting systematic business in the United States, could be forced by U.S. law enforcement to transfer data to the U.S. territory for inspection by law enforcement agencies.&lt;/p>
&lt;p>Does someone really &lt;strong>care&lt;/strong> about the &lt;strong>privacy&lt;/strong> of companies, consumers and users at all? or better does &lt;strong>privacy&lt;/strong> exists at all for the millions of the people that connect to the internet every day?&lt;/p></description><link>https://www.dragonsreach.it/2012/12/13/the-future-is-cloudy/</link><guid>https://www.dragonsreach.it/2012/12/13/the-future-is-cloudy/</guid><pubDate>Thu, 13 Dec 2012 14:22:25 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>The Linux’s perception of my neighbours</title><description>&lt;p>I live in a little village close to the city and one of the houses close to my property is for rent since more than ten years. A lot of families and people succeeded in that house and every time someone new joined my &lt;strong>Linux&lt;/strong> evangelist hat jumped in my head.&lt;/p>
&lt;p>I’ve always presented myself as a &lt;strong>Linux&lt;/strong> geek to my neighbours and it has been nice seeing how the Linux word evolved (with funny and surprising quotes) during the past ten years in their minds. A friend of mine (&lt;a href="mailto:aretha.battistutta@gmail.com">Aretha Battistutta&lt;/a>) made a little comic strip out of the topic and the result is simply amazing.&lt;/p>
&lt;p>&lt;a href="http://www.dragonsreach.it/wp-content/uploads/2012/11/Linux.jpg">&lt;img class="alignnone size-large wp-image-597" title="The Linux's perception of my neighbours" src="http://www.dragonsreach.it/wp-content/uploads/2012/11/Linux-466x1024.jpg" alt="" width="466" height="1024" />&lt;/a>&lt;/p>
&lt;p>Enjoy!&lt;/p></description><link>https://www.dragonsreach.it/2012/11/22/the-linux-perception-of-my-neighbours/</link><guid>https://www.dragonsreach.it/2012/11/22/the-linux-perception-of-my-neighbours/</guid><pubDate>Thu, 22 Nov 2012 11:45:04 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Report: FAD Milan 2012</title><description>&lt;p>Exactly one week ago I was attending the &lt;a href="http://fedoraproject.org/wiki/FAD_LinuxDayMi_2012" target="_blank">Fedora Activity Day&lt;/a> organized in &lt;strong>Milan&lt;/strong> in concomitance with the &lt;strong>Linux Day&lt;/strong> event being organized in several italian cities. Meeting the Fedora italian team has been simply great, we’ve been collaborating remotely since more than an year now and finding out all them being so friendly and pleasant has been a great pleasure.&lt;/p>
&lt;p>Each of us presented a specific &lt;strong>Fedora&lt;/strong>-related topic (I personally talked about Fedora and its Infrastructure, my presentation is publicly viewable at the following &lt;a href="http://averi.fedorapeople.org/The-Fedora-Infrastructure.odp" target="_blank">link&lt;/a>) and I must admit everyone did an awesome job, we taught and learnt from each other at the same time and given the fact it was the very first time the team was put together, well, I can say our mission was accomplished.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2012/11/fad.jpg" alt="fad">&lt;/p>
&lt;p>Unfortunately something didn’t work as expected and the number of visitors that joined our event was very limited. The lack of marketing is apparently one of the most common problems within Linux and its derivative distributions especially when it comes to attending specific events. I feel our event’s concomitance with the Linux Day was one of the main causes, especially when the &lt;strong>LuG&lt;/strong> (Linux User Group) behind the event sponsors a distribution which is not the same as the one you promote. I’m pretty much sure there is a lot of space for improvements but the team is still very young and a lot of work will be put together to improve our next events, that said I would like to thank &lt;strong>Gabriele Trombini&lt;/strong> and &lt;strong>Marina Latini&lt;/strong> for taking the time and efforts for organizing everything in an awesome location like Milan is.&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2012/11/swag.jpg" alt="fad">&lt;/p>
&lt;p>We also had the luck to have a Gnomer sitting in one of the chairs of the &lt;a href="http://www.polimi.it" target="_blank">Politecnico&lt;/a>‘s classroom where we were presenting our Fedora activities: &lt;strong>Paolo Borelli&lt;/strong>, the father of &lt;strong>Gedit&lt;/strong> and one of the most active GNOME developers. His first question right after meeting up? “hey Andrea, given the fact &lt;a href="http://shadowm.rewound.net/blog/archives/245-CIA.vc-is-dead.html" target="_blank">CIA.vc is dead&lt;/a>, are you going to set up a &lt;a href="http://kgb.alioth.debian.org" target="_blank">KGB&lt;/a> istance sooner or later for GNOME? being a sysadmin has never been easy :-)&lt;/p></description><link>https://www.dragonsreach.it/2012/11/03/fad-milan-2012-report/</link><guid>https://www.dragonsreach.it/2012/11/03/fad-milan-2012-report/</guid><pubDate>Sat, 03 Nov 2012 16:38:28 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>SSH Tunneling for VNC</title><description>&lt;p>Logging in into a Linux machine and executing the hundreds commands available is just one of the most common usages of &lt;strong>OpenSSH&lt;/strong>. Another interesting and very useful usage is tunneling some specific (or even all) traffic from your local machine to an external machine you have access to.&lt;/p>
&lt;p>Today we’ll analyze how to access a certain virtual machine’s &lt;strong>console&lt;/strong> by tunneling the relevant &lt;strong>VNC&lt;/strong> port locally and accessing it through your favorite VNC client. The scenario:&lt;/p>
&lt;ol>
&lt;li>Machine &lt;strong>A&lt;/strong> is our main virtualization machine and hosts several virtual machines. (VMs)&lt;/li>
&lt;li>Each &lt;strong>VM&lt;/strong> has its own VNC port assigned. (usually the port range goes from &lt;strong>5900&lt;/strong> to &lt;strong>5910&lt;/strong> or even more if the hosted VMs are more than 10)&lt;/li>
&lt;li>We’ll be using libvirt, thus virsh.&lt;/li>
&lt;/ol>
&lt;p>We first need to find out which port got assigned to the VM we want to have console access to:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">sudo virsh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">virsh &lt;span class="c1"># list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Id Name Status
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">----------------------------------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">5&lt;/span> foo running
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">6&lt;/span> bar running
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">7&lt;/span> foobar running
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">virsh &lt;span class="c1"># vncdisplay foobar&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">:3&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>We, then, create a tunnel which redirects all the traffic from the main virtualization machine’s port to the port we gonna specify in the next command:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">ssh -f -N -L 5910:localhost:5903 user@machine-A.com&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>A few &lt;strong>details&lt;/strong> about the previous command:&lt;/p>
&lt;ol>
&lt;li>**-N **tells SSH to not execute any command after logging in.&lt;/li>
&lt;li>&lt;strong>-f&lt;/strong> tells SSH to hide into the background just before the command gets executed.&lt;/li>
&lt;li>&lt;strong>-L&lt;/strong> enables the port forwarding between the local (client) host and the host on the remote side.&lt;/li>
&lt;/ol>
&lt;p>And…why did I choose respectively port &lt;strong>5903&lt;/strong> and &lt;strong>5910&lt;/strong>&lt;/p>
&lt;p>While you can adjust port &lt;strong>5910&lt;/strong> with your own choice (that will just move the tunneled traffic from port &lt;strong>5910&lt;/strong> to your favorite port), that won’t work as expected with port 5903 since each VNC port is binded to the number of display virsh assigned to it. (for example, the &lt;strong>bar&lt;/strong> VM may be running on display 5, thus its &lt;strong>vncdisplay&lt;/strong> port will be &lt;strong>5905&lt;/strong>)&lt;/p>
&lt;p>When &lt;strong>done&lt;/strong>, fire up your favorite VNC client and create a new connection with the following details:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">Protocol: VNC - Virtual Network Computing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Server: localhost - 127.0.0.1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Port: &lt;span class="m">5910&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The connection will load and you’ll be put in front of your &lt;strong>‘foobar’&lt;/strong> VM console.&lt;/p></description><link>https://www.dragonsreach.it/2012/10/06/ssh-tunneling-for-vnc/</link><guid>https://www.dragonsreach.it/2012/10/06/ssh-tunneling-for-vnc/</guid><pubDate>Sat, 06 Oct 2012 13:50:24 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Me, myself and I</title><description>&lt;p>I’m an Italian &lt;a href="https://www.redhat.com">Red Hatter&lt;/a> who lives in New York City. While my primary education field has been Law, my passion and dedication for the FOSS world have brought me to volunteer and keep up many activities for &lt;a href="https://www.gnome.org">GNOME&lt;/a> and &lt;a href="https://www.fedoraproject.org">Fedora&lt;/a> for several years.&lt;/p>
&lt;h3 id="what-i-am-doing-now">What I am doing now:&lt;/h3>
&lt;ul>
&lt;li>GNOME:
&lt;ul>
&lt;li>Being the GNOME &lt;a href="https://wiki.gnome.org/Infrastructure/Team">Infrastructure Team&lt;/a> Coordinator&lt;/li>
&lt;li>Being the GNOME Foundation &lt;a href="https://wiki.gnome.org/MembershipCommittee">Membership Committee&lt;/a>‘s Chairman.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="what-i-have-done-in-the-past">What I have done in the past:&lt;/h3>
&lt;ul>
&lt;li>Maintained a &lt;a href="https://src.fedoraproject.org/user/averi">set of RPM packages&lt;/a> for the Fedora / EPEL repositories&lt;/li>
&lt;li>Designed the old Edubuntu&amp;rsquo;s Homepage for the Ubuntu Italian LoCo Team as reported on my &lt;a href="https://forum.ubuntu-it.org/index.php?topic=79871.0">announcement&lt;/a> on the Ubuntu-it&amp;rsquo;s forums.&lt;/li>
&lt;li>Wrote several Wiki pages and their translations for the Ubuntu &lt;a href="https://wiki.ubuntu.com/AndreaVeri">international&lt;/a> and &lt;a href="https://wiki.ubuntu-it.org/AndreaVeri">italian&lt;/a> communities.&lt;/li>
&lt;li>Have been an Ubuntu &lt;a href="https://launchpad.net/~motu">Developer&lt;/a> uploading several packages into the main and universe repositories, full list available at my Launchpad &lt;a href="https://launchpad.net/~av/+uploaded-packages">ID&lt;/a>.&lt;/li>
&lt;li>Sponsored and cleaned up the Ubuntu&amp;rsquo;s universe queue within the &lt;a href="https://launchpad.net/~ubuntu-sponsors">Ubuntu Sponsors Team&lt;/a>.&lt;/li>
&lt;li>Have helped out the awesome &lt;a href="https://fedoraproject.org/wiki/Insight">Insight Team&lt;/a> setting up a working Drupal website meant to publish and share news and articles related to Fedora.&lt;/li>
&lt;li>Been an Application Manager (AM) and helped out new contributors to go through the &lt;a href="https://www.debian.org/devel/join/newmaint">NM&lt;/a> process and hopefully welcome them as Debian Developers.&lt;/li>
&lt;li>Have been a Debian Developer and working on my Debian packages available at my &lt;a href="https://qa.debian.org/developer.php?login=and">QA Page&lt;/a>.&lt;/li>
&lt;li>Was the secretary of the GNOME Foundation &lt;a href="https://wiki.gnome.org/FoundationBoard">Board of Directors&lt;/a> for the 2014-2015 and 2015-2016 terms.&lt;/li>
&lt;li>Have been a proud member of the Fedora &lt;a href="https://fedoraproject.org/wiki/Infrastructure">Infrastructure Team&lt;/a>.&lt;/li>
&lt;/ul>
&lt;h3 id="random-bits">Random bits:&lt;/h3>
&lt;ul>
&lt;li>My Ubuntu MOTU interview is available at this &lt;a href="https://behindmotu.wordpress.com/2007/10/16/andrea-veri">link&lt;/a>.&lt;/li>
&lt;li>A brief summary of my Accounts Team work can be found browsing Paul Cutler&amp;rsquo;s &lt;a href="https://www.paulcutler.org/blog/2010/01/gnome-accounts/">Blog&lt;/a>.&lt;/li>
&lt;li>Some material from my candidacy for the Fedora Board: Election&amp;rsquo;s &lt;a href="https://fedoraproject.org/wiki/F16_elections_questionnaire">Questionnaire&lt;/a>, Town Hall&amp;rsquo;s meeting &lt;a href="https://meetbot.fedoraproject.org/fedora-townhall/2011-05-30/fedora_board_town_hall.2011-05-30-19.01.log.html">log&lt;/a> and my &lt;a href="https://fedoraproject.org/w/index.php?title=Board_nominations&amp;amp;oldid=238761#Andrea_Veri_.28averi.29">nomination&lt;/a>.&lt;/li>
&lt;li>I made the &lt;a href="https://foundation.gnome.org/2013/03/05/behind-the-scene-andrea-veri-is-new-gnome-part-time-sysadmin/">news&lt;/a> at GNOME.org&lt;/li>
&lt;li>My interview for World Trademark Review about the GNOME trademark dispute with Groupon is available &lt;a href="https://www.worldtrademarkreview.com/brand-management/groupon-trademark-back-down-shows-power-fired-community">here&lt;/a> (requires registration).&lt;/li>
&lt;li>My Bachelor degree thesis having &amp;ldquo;&lt;strong>&lt;span class="il">Legal&lt;/span> profiles of &lt;span class="il">the &lt;/span>&lt;span class="il">GNOME&lt;/span> Desktop Environment: from source code&amp;rsquo;s freedom to users&amp;rsquo; participation in the community&lt;/strong>&amp;rdquo; as its title can be consulted &lt;a href="https://www.dragonsreach.it/files/Tesi-Andrea-Veri.pdf">here&lt;/a>. (italian only)&lt;/li>
&lt;/ul>
&lt;h3 id="presentations">Presentations&lt;/h3>
&lt;ul>
&lt;li>My presentation for the FAD Milan 2012 event can be downloaded &lt;a href="https://averi.fedorapeople.org/The-Fedora-Infrastructure.odp">here&lt;/a>&lt;/li>
&lt;li>My presentation for the Open Source Day 2014 in Udine about Puppet is &lt;a href="https://www.dragonsreach.it/files/open-source-day-2014/open-source-day-2014.html">here&lt;/a> (italian only)&lt;/li>
&lt;li>GNOME Foundation Annual General Meeting (AGM) reports (GNOME Infrastructure)
&lt;ul>
&lt;li>GUADEC 2013 &lt;a href="http://www.dragonsreach.it/wp-content/uploads/2013/08/The-GNOME-Infrastructure.odp">slides&lt;/a> &lt;a href="http://www.superlectures.com/guadec2013/the-gnome-infrastructure">video&lt;/a>&lt;/li>
&lt;li>GUADEC 2014 &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2014.html">slides&lt;/a>&lt;/li>
&lt;li>GUADEC 2015 &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2015.odp">slides&lt;/a>&lt;/li>
&lt;li>GUADEC 2018 &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2018.html">slides&lt;/a>&lt;/li>
&lt;li>GUADEC 2022 &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2022.html">slides&lt;/a>&lt;/li>
&lt;li>GUADEC 2025 &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2025.html">slides&lt;/a> &lt;a href="https://www.dragonsreach.it/files/guadec-reports/guadec-2025-lightning.html">lightning talks&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="contact">Contact:&lt;/h3>
&lt;h4 id="email">Email:&lt;/h4>
&lt;ul>
&lt;li>&lt;a href="mailto:av@gnome.org">av AT gnome DOT org&lt;/a>&lt;/li>
&lt;li>&lt;a href="mailto:averi@redhat.com">averi AT redhat DOT com&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="irc">IRC:&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>av&lt;/strong> on irc&lt;span style="font-weight: bold;">.gimp.&lt;/span>org.&lt;/li>
&lt;li>&lt;strong>averi&lt;/strong> on irc&lt;span style="font-weight: bold;">.libera.&lt;/span>chat.&lt;/li>
&lt;/ul></description><link>https://www.dragonsreach.it/about-me/</link><guid>https://www.dragonsreach.it/about-me/</guid><pubDate>Sat, 22 Sep 2012 11:19:47 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>FAD Milano 2012</title><description>&lt;p>È con piacere che annuncio la mia presenza al &lt;strong>Fedora Activity Day&lt;/strong> di Milano in data &lt;strong>27 Ottobre 2012&lt;/strong> e con altrettanto piacere ringrazio gli organizzatori per avermi dedicato uno spazio di trenta minuti in cui discutere ed approfondire le tematiche derivanti dall’amministrazione di sistemi Linux, nello specifico, dell’amministrazione degli stessi computer che ospitano e rendono disponibili numerosi servizi alle migliaia di utenti Fedora che contribuiscono quotidianamente al progetto.&lt;/p>
&lt;p>Ho partecipato fisicamente, purtroppo, a pochissimi eventi &lt;strong>Open Source&lt;/strong> e per questo motivo sono particolarmente emozionato di aver la possibilità di prender parte ad una manifestazione così sentita ed apprezzata come il &lt;strong>Linux Day&lt;/strong>, contesto in cui lo stesso &lt;strong>Fedora Activity Day&lt;/strong> prenderà piede. Le aspettative sono tante e mi impegnerò in modo tale da presentare al pubblico il maggior numero di strumenti e attività inerenti all’amministrazione di sistemi Linux, il tutto con la speranza di invogliare il maggior numero dei presenti a contribuire allo stesso progetto &lt;strong>Fedora&lt;/strong>.&lt;/p>
&lt;p>A titolo introduttivo elenco alcuni dei &lt;strong>punti&lt;/strong> su cui mi soffermerò durante il mio &lt;strong>talk&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>Quali sono i principi fondamentali a cui l’infrastruttura Fedora si ispira.&lt;/li>
&lt;li>Chi c’è dietro all’infrastruttura Fedora, quante persone e con quali competenze, quali sono i mezzi di comunicazione.&lt;/li>
&lt;li>Quanti e quali Datacenter permettono al progetto Fedora di funzionare.&lt;/li>
&lt;li>Quali sono i software utilizzati, come vengono utilizzati e con quali strumenti il team Infrastruttura provvede alla manutenzione dei sistemi fisici e virtuali disponibili, come vengono monitorati i server Fedora e molto altro!&lt;/li>
&lt;/ol>
&lt;p>Con la speranza di una partecipazione numerosa, vi rimando alla &lt;a href="https://fedoraproject.org/wiki/FAD_LinuxDayMi_2012" target="_blank">pagina &lt;/a>dedicata all’evento.&lt;/p></description><link>https://www.dragonsreach.it/2012/09/19/fad-milano-2012/</link><guid>https://www.dragonsreach.it/2012/09/19/fad-milano-2012/</guid><pubDate>Wed, 19 Sep 2012 16:17:27 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Building Debian packages with Deb-o-Matic</title><description>&lt;p>Today I’ll be telling you about an interesting way to build your Debian packages using &lt;strong>Deb-o-Matic&lt;/strong>, a tool developed and maintained by &lt;a href="http://dktrkranz.wordpress.com" target="_blank">Luca Falavigna&lt;/a>. Some more details about this tool from the package’s description:&lt;/p>
&lt;blockquote>
&lt;p>Deb-o-Matic is an easy to use build machine for Debian source packages based on pbuilder, written in Python.&lt;/p>
&lt;p>It provides a simple tool to automate build of source packages with limited user interaction and a simple configuration. It has some useful features such as automatic update of pbuilder, automatic scan and selection of source packages to build and modules support.&lt;/p>
&lt;/blockquote>
&lt;p>The &lt;strong>setup.&lt;/strong>&lt;/p>
&lt;p>Download the package.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt-get install debomatic&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Modify the &lt;strong>main&lt;/strong> configuration file as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[default]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">builder: pbuilder&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">packagedir: /home/john/debomatic # Take note of the following path since we&amp;#39;ll need it for later use.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">configdir: /etc/debomatic/distributions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">pbuilderhooks: /usr/share/debomatic/pbuilderhooks&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">maxbuilds: 3 # The number of builds you can perform at the same time.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">inotify: 1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">sleep: 60 # The sleep time between one build and another.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">logfile: /var/log/debomatic.log&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[gpg]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">gpg: 0 # Change to 1 if you want Deb-O-Matic to check the GPG signature of the uploaded packages.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">keyring: /etc/debomatic/debomatic.gpg # Add the GPG Keys you want Deb-O-Matic to accept in this keyring.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[modules]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">modules: 1 # A list of all the available modules will follow right after.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">modulespath: /usr/share/debomatic/modules&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[runtime]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">alwaysupdate: unstable experimental precise&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">distblacklist:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">modulesblacklist: Lintian Mailer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">mapper: {&amp;#39;sid&amp;#39;: &amp;#39;unstable&amp;#39;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">&amp;#39;wheezy&amp;#39;: &amp;#39;testing&amp;#39;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">&amp;#39;squeeze&amp;#39;: &amp;#39;stable&amp;#39;}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[lintian]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">lintopts: -i -I -E --pedantic # Run Lintian in Pedantic mode.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">[mailer] # You need an SMTP server running on your machine for the mailer to work. You can have a look at the &amp;#39;Ssmtp&amp;#39; daemon which is a one-minute-setup MTA, check an example over &amp;lt;a href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;https://github.com/averi/config-files/blob/master/backups/offlineimap%20%2B%20ssmtp%20%2B%20imapfilter/ssmtp.conf&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;here&amp;lt;/a&amp;gt;.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">fromaddr: debomatic@localhost&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">smtphost: localhost&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">smtpport: 25&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">authrequired: 0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">smtpuser: user&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">smtppass: pass&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">success: /etc/debomatic/mailer/build_success.mail-template # Update the build success or failure mails as you wish by modifying the relevant files.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">failure: /etc/debomatic/mailer/build_failure.mail-template&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[internals]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">configversion&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">010a&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The available modules are:&lt;/p>
&lt;ol>
&lt;li> “&lt;strong>Contents&lt;/strong>“, which acts as a ‘dpkg -c’ over the built packages.&lt;/li>
&lt;li>“&lt;strong>DateStamp&lt;/strong>“, which displays build start and finish times into a file in the build directory.&lt;/li>
&lt;li>“&lt;strong>Lintian&lt;/strong>“, which stores Lintian output on top of the built package in the pool directory.&lt;/li>
&lt;li>“&lt;strong>Mailer&lt;/strong>“, which sends a reply to the uploader once the build has finished.&lt;/li>
&lt;li>“&lt;strong>PrevBuildCleaner&lt;/strong>“, which deletes all files generated by the previous build.&lt;/li>
&lt;li>“&lt;strong>Repository&lt;/strong>“, which generates a local repository of built packages.&lt;/li>
&lt;/ol>
&lt;p>Configure ‘&lt;a href="http://manpages.ubuntu.com/manpages/precise/man5/dput.cf.5.html" target="_blank">dput&lt;/a>‘ to upload package’s sources to your local repository, edit the &lt;strong>/etc/dput.cf&lt;/strong> file and add this entry:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[debomatic]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">method&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">incoming&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/home/john/debomatic&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">or the following if you are going to upload the files to a different machine through SSH:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[debomatic]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">login&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">john&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">fqdn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">debomatic.example.net&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">method&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">scp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">incoming&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">/debomatic&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Add a new &lt;strong>Virtual Host&lt;/strong> on Apache and access the repository / built packages directly through your browser:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Apache" data-lang="Apache">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;VirtualHost&lt;/span> &lt;span class="s">*:80&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">ServerAdmin&lt;/span> john@example.net
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">ServerName&lt;/span> debomatic.example.net
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">DocumentRoot&lt;/span> &lt;span class="sx">/home/john/debomatic&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Directory&lt;/span> &lt;span class="s">/home/john/debomatic&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Options&lt;/span> Indexes FollowSymLinks MultiViews
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">AllowOverride&lt;/span> &lt;span class="k">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Order&lt;/span> allow,deny
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">allow&lt;/span> from &lt;span class="k">all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Directory&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/VirtualHost&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Start the daemon:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/debomatic start&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>(&lt;strong>Optional&lt;/strong>) Add your repository to &lt;strong>APT&lt;/strong>‘s sources.list:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">deb http://debomatic.example.net/ unstable main contrib non-free&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>(&lt;strong>Optional&lt;/strong>) Start Deb-O-Matic at system’s startup by modifying the &lt;strong>/etc/init.d/debomatic&lt;/strong> file at &lt;strong>line 21&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">- &lt;span class="o">[&lt;/span> -x &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$DAEMON&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nb">exit&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$DEBOMATIC_AUTOSTART&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">exit&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="o">[&lt;/span> -x &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$DAEMON&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nb">exit&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="o">[&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$DEBOMATIC_AUTOSTART&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span> &lt;span class="o">]&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">exit&lt;/span> &lt;span class="m">0&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and finally add it to the desired &lt;strong>runlevels&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">update-rc.d debomatic defaults&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Enjoy!&lt;/p></description><link>https://www.dragonsreach.it/2012/09/17/building-debian-packages-with-deb-o-matic/</link><guid>https://www.dragonsreach.it/2012/09/17/building-debian-packages-with-deb-o-matic/</guid><pubDate>Mon, 17 Sep 2012 13:07:14 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Manage your website through Git</title><description>&lt;p>Ever wondered how you can update your &lt;strong>website&lt;/strong> (in our case a static website with a bunch of &lt;strong>HTML&lt;/strong> and &lt;strong>PHP&lt;/strong> files) by committing to a &lt;strong>Git repository&lt;/strong> hosted on a &lt;strong>different server&lt;/strong>? if the answer to the previous question is &lt;strong>yes&lt;/strong>, then you are in the right place.&lt;/p>
&lt;p>The &lt;strong>scenario&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Website hosted on &lt;strong>server A&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Git repository hosted on &lt;strong>server B&lt;/strong>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>and a few details about why would you opt for maintaining your website through &lt;strong>Git&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>You need multiple people to access the static content of your website and you also want to maintain all the history of changes together with all the Git’s magic.&lt;/li>
&lt;li>You think using an FTP server is not secure enough.&lt;/li>
&lt;li>You think giving out SSH access or more permissions on the server to multiple users it’s not what you want. (also using &lt;strong>&lt;a href="http://linux.die.net/man/1/scp" target="_blank">scp&lt;/a>&lt;/strong> will overwrite the files directly with all its consequences)&lt;/li>
&lt;/ol>
&lt;p>the &lt;strong>setup&lt;/strong>, on &lt;strong>server A&lt;/strong>:&lt;/p>
&lt;p>Clone the Git repository over the directory that your Web server will serve.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /srv/www.domain.com/http &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo git clone http://git.example.com/git/domain.git&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Grab the needed package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt-get install fishpolld or yum install fishpolld&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Set up a “&lt;a href="http://git.fishsoup.net/cgit/fishpoll/tree/README" target="_blank">topic&lt;/a>” (called &lt;strong>website_update&lt;/strong>) that will call a ‘&lt;strong>git pull&lt;/strong>‘ each time the repository hosted on &lt;strong>server B&lt;/strong> receives an update. (the file has to be placed into the &lt;strong>/etc/fishpoll.d&lt;/strong> directory)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">WEBSITEDIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/srv/www.domain.com/http&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -d &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">WEBSITEDIR&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">WEBSITEDIR&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Unable to access theme directory. Failing.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git pull&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Add a little configuration file that will enable the &lt;strong>website_update&lt;/strong>‘s topic at daemon’s startup. (you should name it &lt;strong>website_update.conf&lt;/strong>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>fishpoll&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">on_start&lt;/span> &lt;span class="o">=&lt;/span> True&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Open the relevant port on &lt;strong>Iptables&lt;/strong> so that &lt;strong>server A&lt;/strong> and &lt;strong>server B&lt;/strong> can communicate as expected, the daemon runs over** port 27527**.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">-A INPUT -m state --state NEW -m tcp -p tcp -s &amp;lt;strong&amp;gt;server-B-IP&amp;lt;/strong&amp;gt; --dport &lt;span class="m">27527&lt;/span> -j ACCEPT&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Start the daemon. (by default, logs are sent to &lt;strong>syslog&lt;/strong> but you can run the daemon in &lt;strong>Debug&lt;/strong> mode by using the &lt;strong>-D flag&lt;/strong>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/fishpolld start or sudo systemctl start fishpolld.service or sudo /usr/sbin/fishpolld -D&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>and on &lt;strong>server B:&lt;/strong>&lt;/p>
&lt;p>Grab the needed package:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt-get install fishpoke or yum install fishpoke&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Configure the relevant Git hook (&lt;strong>post-update&lt;/strong>, located into the &lt;strong>hooks&lt;/strong> directory) and make it &lt;strong>executable&lt;/strong>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Triggering update of configuration on server A&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">fishpoke server-A-IP-or-DNS website_update&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Finally test the whole setup by committing to the repository hosted on &lt;strong>server B&lt;/strong> and verify your changes being sent live on your website!&lt;/p></description><link>https://www.dragonsreach.it/2012/09/15/manage-your-website-through-git/</link><guid>https://www.dragonsreach.it/2012/09/15/manage-your-website-through-git/</guid><pubDate>Sat, 15 Sep 2012 12:52:08 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Nagios IRC Notifications</title><description>&lt;p>Lately (as I earlier pointed out on my &lt;a href="http://blogs.gnome.org/woody/2012/02/18/nagios-xmpp-notifications-for-gtalk/">blog&lt;/a>) I’ve been working on improving GNOME’s infrastructure monitoring services. After configuring XMPP it was time to find out a good way for sending out relevant notifications to our IRC channel hosted on GIMPNET. I achieved that with a nice combo: &lt;strong>supybot&lt;/strong> + &lt;strong>supybot-notify&lt;/strong>, all that mixed up with a few grains of Nagios command definitions.&lt;/p>
&lt;p>But here we go with a little step-by-step guide:&lt;/p>
&lt;p>&lt;strong>Requirements&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Install supybot and configure a new installation:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">apt-get install supybot or yum install supybot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir /home/&lt;span class="nv">$user&lt;/span>/nagbot &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> /home/&lt;span class="nv">$user&lt;/span>/nagbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">supybot-wizard &lt;span class="o">(&lt;/span>follow the directions to get the bot initially configured&lt;span class="o">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;ol start="2">
&lt;li>Install and load the supybot-notify plugin by doing:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">git clone git://git.fedorahosted.org/supybot-notify.git &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> supybot-notify
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p /home/&lt;span class="nv">$user&lt;/span>/nagbot/plugins/notify &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> cp -r * /home/&lt;span class="nv">$user&lt;/span>/nagbot/plugins/notify&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Finally, &lt;strong>&lt;a href="http://supybook.fealdia.org/devel/#_plugins">load&lt;/a>&lt;/strong> the plugin. (this will require you to &lt;a href="http://supybook.fealdia.org/devel/#_identifying_to_the_bot">authenticate&lt;/a> to the bot)&lt;/p>
&lt;p>&lt;strong>Nagios configuration&lt;/strong>&lt;/p>
&lt;p>Add the relevant command definitions to the &lt;strong>commands.cfg&lt;/strong> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#39;notify-by-ircbot&amp;#39; command definition&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">define command&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> command_name notify-by-ircbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> command_line /usr/bin/printf &lt;span class="s2">&amp;#34;%b&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;#channel &lt;/span>&lt;span class="nv">$NOTIFICATIONTYPE&lt;/span>$&lt;span class="s2"> - &lt;/span>&lt;span class="nv">$HOSTALIAS&lt;/span>$&lt;span class="s2">/&lt;/span>&lt;span class="nv">$SERVICEDESC&lt;/span>$&lt;span class="s2"> is &lt;/span>&lt;span class="nv">$SERVICESTATE&lt;/span>$&lt;span class="s2">: &lt;/span>&lt;span class="nv">$SERVICEOUTPUT&lt;/span>$&lt;span class="s2"> (&lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">(hostname -s))&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> nc -w &lt;span class="m">1&lt;/span> localhost &lt;span class="m">5050&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># &amp;#39;host-notify-by-ircbot&amp;#39; command definition&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">define command&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> command_name host-notify-by-ircbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> command_line /usr/bin/printf &lt;span class="s2">&amp;#34;%b&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;#channel &lt;/span>&lt;span class="nv">$NOTIFICATIONTYPE&lt;/span>$&lt;span class="s2"> - &lt;/span>&lt;span class="nv">$HOSTALIAS&lt;/span>$&lt;span class="s2"> is &lt;/span>&lt;span class="nv">$HOSTSTATE&lt;/span>$&lt;span class="s2">: &lt;/span>&lt;span class="nv">$HOSTOUTPUT&lt;/span>$&lt;span class="s2"> (&lt;/span>&lt;span class="nv">$$&lt;/span>&lt;span class="s2">(hostname -s))&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> nc -w &lt;span class="m">1&lt;/span> localhost &lt;span class="m">5050&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>* adjust the &lt;strong>Netcat’s&lt;/strong> host and port to your needs, in my case Supybot and Nagios were running on the same host. In the case of a Supybot running on a different host than Nagios, tweak Iptables to allow the desired port:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">-A INPUT -m state --state NEW,ESTABLISHED -m tcp -p tcp --dport &lt;span class="m">5050&lt;/span> -j ACCEPT&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Add a new entry on the &lt;strong>contacts.cfg&lt;/strong> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">define contact&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> contact_name nagbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> use generic-contact
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">alias&lt;/span> Nagios IRC Bot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> email example@example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> service_notification_commands notify-by-ircbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> host_notification_commands host-notify-by-ircbot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Reload Nagios:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">sudo /etc/init.d/nagios3 reload&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>And finally, enjoy the result:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">PROBLEM - &lt;span class="nv">$hostalias&lt;/span>/load average is CRITICAL: CRITICAL - load average: 30.45, 16.24, 7.16 &lt;span class="o">(&lt;/span>nagioshost&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RECOVERY - &lt;span class="nv">$hostalias&lt;/span>/load average is OK: OK - load average: 0.06, 0.60, 3.65 &lt;span class="o">(&lt;/span>nagioshost&lt;span class="o">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><link>https://www.dragonsreach.it/2012/06/30/nagios-irc-notifications/</link><guid>https://www.dragonsreach.it/2012/06/30/nagios-irc-notifications/</guid><pubDate>Sat, 30 Jun 2012 12:59:28 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>A few useful Puppet snippets</title><description>&lt;p>As per Wikipedia:&lt;/p>
&lt;blockquote>
&lt;p>Puppet is a tool for managing the configuration of Unix-like systems, declaratively. The developer provides puppet templates for describing parts of the system, and, when these templates are deployed, the runtime puts the managed systems into the declared state.&lt;/p>
&lt;p>Puppet consists of a custom declarative language to describe system configuration, distributed using the client-server paradigm (using XML-RPC protocol), and a library to realize the configuration. The resource abstraction layer enables administrators to describe the configuration in high-level terms, such as users, services and packages.&lt;/p>
&lt;/blockquote>
&lt;p>I’ve been playing with the aforementioned tool lately both on my home network and within the Fedora’s Infrastructure team and I thought some of the work I did might be useful for anyone out there being stuck with a Puppet’s manifest or an ERB template.&lt;/p>
&lt;p>&lt;strong>Snippet #1&lt;/strong>: Make sure the user &lt;strong>‘foo’&lt;/strong> is always created with its own home directory, password, shell, and full name.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Puppet" data-lang="Puppet">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="na">users&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">users&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="na">add&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;foo&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">username&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#39;foo&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">comment&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#39;Foo&amp;#39;&lt;/span>&lt;span class="na">s&lt;/span> &lt;span class="na">Full&lt;/span> &lt;span class="na">Name&lt;/span>&lt;span class="s">&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> shell =&amp;gt; &amp;#39;&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="na">bin&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="na">bash&lt;/span>&lt;span class="s">&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> password_hash =&amp;gt; &amp;#39;&lt;/span>&lt;span class="na">pwd_hash_as_you_can_see_in_&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="na">etc&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="na">shadow&lt;/span>&lt;span class="s">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s">define users::add($username, $comment, $shell, $password_hash) {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> user { $username:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> ensure =&amp;gt; &amp;#39;&lt;/span>&lt;span class="k">present&lt;/span>&lt;span class="s">&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> home =&amp;gt; &amp;#34;/home/${username}&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> comment =&amp;gt; $comment,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> shell =&amp;gt; $shell,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> managehome =&amp;gt; &amp;#39;&lt;/span>&lt;span class="k">true&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">password&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="nv">$password_hash,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Snippet #2:&lt;/strong> Make sure the user &lt;strong>‘foo’&lt;/strong> gets added into &lt;strong>/etc/sudoers&lt;/strong>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Puppet" data-lang="Puppet">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="na">sudoers&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">file&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;/etc/sudoers&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">owner&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;root&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">group&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;root&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">mode&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;440&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">augeas&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;addfootosudoers&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">context&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;/files/etc/sudoers&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">changes&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set spec[user = &amp;#39;foo&amp;#39;]/user foo&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set spec[user = &amp;#39;foo&amp;#39;]/host_group/host ALL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set spec[user = &amp;#39;foo&amp;#39;]/host_group/command ALL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set spec[user = &amp;#39;foo&amp;#39;]/host_group/command/runas_user ALL&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">],&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Snippet #3:&lt;/strong> Make sure that &lt;strong>openssh-server&lt;/strong> is: installed, running on Port 222 and accepting &lt;strong>RSA&lt;/strong> authentications only.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Puppet" data-lang="Puppet">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="na">openssh&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">server&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="k">package&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;openssh-server&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">ensure&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;installed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="k">service&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;ssh&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">ensure&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">running&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">hasstatus&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">require&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">Package&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;openssh-server&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="k">augeas&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;sshd_config&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">context&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;/files/etc/ssh/sshd_config&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">changes&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set PermitRootLogin no&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set RSAAuthentication yes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set PubkeyAuthentication yes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set AuthorizedKeysFile %h/.ssh/authorized_keys&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set PasswordAuthentication no&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="s">&amp;#34;set Port 222&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">],&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>Snippet #4:&lt;/strong> Don’t apply a specific &lt;strong>IPTABLES&lt;/strong> rule if an host is tagged as ‘staging’ in the relevant node file.&lt;/p>
&lt;p>On &lt;strong>templates/iptables.erb&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Puppet" data-lang="Puppet">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Allow unlimited traffic on eth0&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">INPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">i&lt;/span> &lt;span class="na">eth0&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">ACCEPT&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">OUTPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">o&lt;/span> &lt;span class="na">eth0&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">ACCEPT&lt;/span>&lt;span class="c">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Allow unlimited traffic from trusted IP addresses&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">INPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">s&lt;/span> &lt;span class="mf">192.168.1.1&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="mi">24&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">ACCEPT&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&amp;amp;&lt;/span>&lt;span class="na">lt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="err">%&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="na">environment&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;production&amp;#34;&lt;/span> &lt;span class="err">%&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">INPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">m&lt;/span> &lt;span class="na">state&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">state&lt;/span> &lt;span class="na">NEW&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">m&lt;/span> &lt;span class="na">tcp&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">p&lt;/span> &lt;span class="na">tcp&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">dport&lt;/span> &lt;span class="mi">22&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">ACCEPT&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">INPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">m&lt;/span> &lt;span class="na">state&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">state&lt;/span> &lt;span class="na">NEW&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">m&lt;/span> &lt;span class="na">tcp&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">p&lt;/span> &lt;span class="na">tcp&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">dport&lt;/span> &lt;span class="mi">25&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">ACCEPT&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">INPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">m&lt;/span> &lt;span class="na">state&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">state&lt;/span> &lt;span class="na">NEW&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">m&lt;/span> &lt;span class="na">tcp&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">p&lt;/span> &lt;span class="na">tcp&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">dport&lt;/span> &lt;span class="mi">80&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">ACCEPT&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&amp;amp;&lt;/span>&lt;span class="na">lt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="err">%&lt;/span> &lt;span class="na">unless&lt;/span> &lt;span class="k">defined&lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="na">staging&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">.&lt;/span>&lt;span class="na">nil&lt;/span>&lt;span class="o">?&lt;/span> &lt;span class="err">%&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">A&lt;/span> &lt;span class="na">INPUT&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">s&lt;/span> &lt;span class="na">X&lt;/span>&lt;span class="err">.&lt;/span>&lt;span class="na">X&lt;/span>&lt;span class="err">.&lt;/span>&lt;span class="na">X&lt;/span>&lt;span class="err">.&lt;/span>&lt;span class="na">X&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="na">j&lt;/span> &lt;span class="na">REJECT&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="na">reject&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">with&lt;/span> &lt;span class="na">icmp&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="k">host&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="na">prohibited&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&amp;amp;&lt;/span>&lt;span class="na">lt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="err">%&lt;/span> &lt;span class="na">end&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="err">%&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&amp;amp;&lt;/span>&lt;span class="na">lt&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="err">%&lt;/span> &lt;span class="na">end&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="err">%&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>On the &lt;strong>manifest&lt;/strong> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Puppet" data-lang="Puppet">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="na">iptables&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="k">package&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="na">iptables&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">ensure&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">installed&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="k">service&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;iptables&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">ensure&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">running&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">hasstatus&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">true&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">require&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">Package&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;iptables&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="k">file&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;/etc/sysconfig/iptables&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">owner&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;root&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">group&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s">&amp;#34;root&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">mode&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="mi">644&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="na">content&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">template&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;iptables/iptables.erb&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="k">notify&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="k">Service&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s">&amp;#34;iptables&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>That’s all for now!&lt;/p></description><link>https://www.dragonsreach.it/2012/01/31/a-few-useful-puppet-snippets/</link><guid>https://www.dragonsreach.it/2012/01/31/a-few-useful-puppet-snippets/</guid><pubDate>Tue, 31 Jan 2012 18:43:26 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>A few other additions to my Mutt and Desktop setup!</title><description>&lt;p>A few days ago I &lt;a href="https://www.dragonsreach.it/2011/09/04/new-desktop-mutt-and-irssi-setup/" target="_blank">blogged&lt;/a> about my main computer’s configuration files and desktop’s appearance and today I managed to add a few little tweaks to those, they are:&lt;/p>
&lt;ul>
&lt;li>Google’s &lt;a href="https://www.google.com/contacts" target="_blank">contacts list&lt;/a> integrated into Mutt&lt;/li>
&lt;li>a cleaner and nicer Login screen&lt;/li>
&lt;/ul>
&lt;p>Curious to know how you can easily integrate your Google’s contacts into Mutt? Well, you should be able to achieve that within a few minutes after reading this small &lt;strong>HowTo&lt;/strong>:&lt;/p>
&lt;p>&lt;strong>1.&lt;/strong> Download and install &lt;strong>goobook&lt;/strong> as explained &lt;a href="http://pypi.python.org/pypi/goobook/1.3a1#source-installation" target="_blank">here&lt;/a>.&lt;/p>
&lt;p>&lt;strong>2.&lt;/strong> Setup a &lt;strong>&lt;em>.goobookrc&lt;/em>&lt;/strong> file into your Home directory. It should look like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">machine google.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">login example@gmail.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">password yourpassword&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>3.&lt;/strong> Add the relevant configuration bits into your &lt;strong>&lt;em>/etc/Muttrc&lt;/em>&lt;/strong> file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">set&lt;/span> &lt;span class="nv">query_command&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;goobook query &amp;#39;%s&amp;#39;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">bind&lt;/span> editor complete-query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">macro index,pager a &lt;span class="s2">&amp;#34;;goobook add&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;Add sender&amp;#39;s address to your Google contacts&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>4.&lt;/strong> Your configuration should be good to go now, so here’s a few examples on goobook’s &lt;strong>usage&lt;/strong> within Mutt:&lt;/p>
&lt;ul>
&lt;li>Use &lt;strong>TAB&lt;/strong> if you want to auto-complete a mail address when specifying the &lt;strong>To:&lt;/strong> field.&lt;/li>
&lt;li>Use the &lt;strong>A&lt;/strong> key if you want to add sender’s address to your Google contacts.&lt;/li>
&lt;li>Use the &lt;strong>Q&lt;/strong> key for querying your contacts list.&lt;/li>
&lt;/ul>
&lt;p>We can now move on on customizing your Login Screen running GDM3. Let’s begin with a &lt;strong>screenshoot&lt;/strong>:&lt;/p>
&lt;p>&lt;img src="https://www.dragonsreach.it/wp-content/uploads/2011/09/login_screen.png" alt="login_screen">&lt;/p>
&lt;p>I definitely love it, it’s &lt;strong>clear&lt;/strong> and &lt;strong>clean&lt;/strong> and most of all it has everything I need, no extra toolbars or menus. If you agree with me, open up the &lt;strong>&lt;em>/etc/gdm3/greeter.gconf-defaults&lt;/em>&lt;/strong> file and do the needed changes. This is how your greeter.gconf-defaults file should look like:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="na">/desktop/gnome/background/picture_filename /path/to/your/dusty-bg/file # dusty&amp;#39;s background can be downloaded &amp;lt;a href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;http://gnome-look.org/content/show.php/Dusty?content=94332&amp;#34; target=&amp;#34;_blank&amp;#34;&amp;gt;here&amp;lt;/a&amp;gt;.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">/desktop/gnome/interface/gtk_theme Darklooks # this is my main theme, feel free to adapt that to your needs.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">/apps/gdm/simple-greeter/logo_icon_name debian-swirl # this is the default on Debian&amp;#39;s systems.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">/desktop/gnome/sound/event_sounds false # I don&amp;#39;t like hearing any sound when when I am prompted to insert my user&amp;#39;s details on the Login Screen.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">/apps/gdm/simple-greeter/disable_user_list true # users list will be disabled, you won&amp;#39;t be able to select your username from a list but you&amp;#39;ll have to insert that yourself.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">/apps/metacity/general/compositing_manager false # default, no need to change this.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">/apps/gnome-power-manager/ui/icon_policy never # default, no need to change this.&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>We are close to the end but we are missing an important &lt;strong>detail&lt;/strong>: how can you safely remove bottom’s toolbar and menus for a clearer and cleaner Login Screen? Open up the &lt;strong>/var/lib/gdm3/.gconf.mandatory/%gconf-tree.xml&lt;/strong> file, search for the &lt;strong>&amp;lt;dir name=&amp;ldquo;general&amp;rdquo;&amp;gt;&lt;/strong> section and apply the following &lt;strong>change&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">&amp;lt;entry&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;compositing_manager&amp;#34;&lt;/span> &lt;span class="na">mtime=&lt;/span>&lt;span class="s">&amp;#34;1315580582&amp;#34;&lt;/span> &lt;span class="na">type=&lt;/span>&lt;span class="s">&amp;#34;bool&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;false&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="nt">&amp;lt;entry&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;compositing_manager&amp;#34;&lt;/span> &lt;span class="na">mtime=&lt;/span>&lt;span class="s">&amp;#34;1315580582&amp;#34;&lt;/span> &lt;span class="na">type=&lt;/span>&lt;span class="s">&amp;#34;bool&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>But what if you prefer keeping the toolbar as it is, but you definitely don’t like seeing the &lt;em>&lt;strong>Accessibility&lt;/strong>&lt;/em> icon appearing on your Login Screen? On the same file as above, search for the &lt;strong>&amp;lt;dir name=&amp;ldquo;general&amp;rdquo;&amp;gt;&lt;/strong> section and &lt;strong>modify&lt;/strong> the following string as it follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">&amp;lt;entry&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;enable&amp;#34;&lt;/span> &lt;span class="na">mtime=&lt;/span>&lt;span class="s">&amp;#34;1315580582&amp;#34;&lt;/span> &lt;span class="na">type=&lt;/span>&lt;span class="s">&amp;#34;bool&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ &lt;span class="nt">&amp;lt;entry&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;enable&amp;#34;&lt;/span> &lt;span class="na">mtime=&lt;/span>&lt;span class="s">&amp;#34;1315580582&amp;#34;&lt;/span> &lt;span class="na">type=&lt;/span>&lt;span class="s">&amp;#34;bool&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;false&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>See you on my next blog post and don’t forget to have a look at my GitHub’s &lt;a href="https://github.com/averi/config-files" target="_blank">repository&lt;/a>! Oh…and follow &lt;a href="http://twitter.com/andrea_veri" target="_blank">me&lt;/a> on Twitter!&lt;/p></description><link>https://www.dragonsreach.it/2011/09/11/a-few-other-additions-to-my-mutt-and-desktop-setup/</link><guid>https://www.dragonsreach.it/2011/09/11/a-few-other-additions-to-my-mutt-and-desktop-setup/</guid><pubDate>Sun, 11 Sep 2011 18:25:32 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>New Desktop, Mutt and Irssi setup!</title><description>&lt;p>I bought a new PC a few weeks ago and I then decided to renew a bit my &lt;strong>Desktop&lt;/strong>, my &lt;strong>Mutt&lt;/strong> and my &lt;strong>Irssi&lt;/strong> setup. I’ve been spending several hours cleaning up old scripts, logs and configuration files but the result definitely seems to reward me the right way. But here they come a few &lt;strong>screenshots&lt;/strong>:&lt;/p>
&lt;p>&lt;strong>Desktop&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://www.dragonsreach.it/wp-content/uploads/2011/09/my_Desktop.png">&lt;img class="size-full wp-image-170 alignnone" src="https://www.dragonsreach.it/wp-content/uploads/2011/09/my_Desktop_thumbnail.png" alt="" width="450" height="281" />&lt;/a>&lt;/p>
&lt;p>&lt;strong>Irssi&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://www.dragonsreach.it/wp-content/uploads/2011/09/irssi.png">&lt;img class="size-full wp-image-173 alignnone" src="https://www.dragonsreach.it/wp-content/uploads/2011/09/irssi_thumbnail.png" alt="" width="450" height="262" />&lt;/a>&lt;/p>
&lt;p>&lt;strong>Mutt&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://www.dragonsreach.it/wp-content/uploads/2011/09/mutt.png">&lt;img class="size-full wp-image-174 alignnone" src="https://www.dragonsreach.it/wp-content/uploads/2011/09/mutt_thumbnail.png" alt="" width="450" height="262" />&lt;/a>&lt;/p>
&lt;p>If you liked all the above and would like to reproduce everything yourself, you should consider having a look at my GitHub’s &lt;a href="https://github.com/averi/config-files" target="_blank">repository&lt;/a>. See you on the next blog post!&lt;/p></description><link>https://www.dragonsreach.it/2011/09/04/new-desktop-mutt-and-irssi-setup/</link><guid>https://www.dragonsreach.it/2011/09/04/new-desktop-mutt-and-irssi-setup/</guid><pubDate>Sun, 04 Sep 2011 14:41:10 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Backup your Gmail in a few easy steps!</title><description>&lt;p>I’ve actually spent a few hours searching around for a good backup solution for my mailbox until I decided to stick with &lt;a href="http://pyropus.ca/software/getmail/" target="_blank">getmail&lt;/a>.  What you’ll be able to achieve after reading this HowTo and deploying the following setup is:&lt;/p>
&lt;ol>
&lt;li>A full backup of your e-mail DATA in the Mbox format. (yes, Gmail’s labels / folders as well)&lt;/li>
&lt;li>Prevent getmail to mark all mails as &lt;strong>read&lt;/strong> after delivering them. (this was a pretty bad issue since getmail was marking all my mails as read even if I did not access my e-mail at all)&lt;/li>
&lt;li>Keep your backups &lt;strong>up-to-date&lt;/strong> with the &lt;strong>latest&lt;/strong> content from your mailbox. (by default getmail grabs all the DATA from your mailbox and fills up the Mbox / Maildir content keeping deleted mails. So let’s say I deleted a mail two days ago, well it’ll still appear on today’s backups. This behaviour is definitely unwanted)&lt;/li>
&lt;/ol>
&lt;p>I’ll now move to explain a few details about my new configuration but before moving to tweak getmail’s main config file, please do the following change on &lt;strong>_retrieverbases.py&lt;/strong>* :&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">_getmsgpartbyid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msgid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;(RFC822)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>&lt;strong>to&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">_getmsgpartbyid&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">msgid&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;(BODY.PEEK[])&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>When done grab the following &lt;em>&lt;strong>getmailrc&lt;/strong>&lt;/em> and adapt it to your needs**:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-INI" data-lang="INI">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[retriever]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">SimpleIMAPSSLRetriever ## or SimplePOP3SSLRetriever.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">server&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">imap.gmail.com ## or pop.gmail.com for POP3.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">username&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">example@gmail.com&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">password&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## so-called Gmail&amp;#39;s labels should be listed one by one here for getmail to retrieve mail from them successfully.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">mailboxes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">(&amp;#34;INBOX&amp;#34;, &amp;#34;[Gmail]/Sent mail&amp;#34;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">&amp;#34;ubuntu&amp;#34;, &amp;#34;gnome/example&amp;#34;, &amp;#34;linux/example&amp;#34;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[destination]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">type&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">Mboxrd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">~/.getmail/backup.mbox&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[options]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">delivered_to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">false ## No delivered_to header added automatically.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">received&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">false ## No received header added automatically.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">verbose&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">2 ## getmail will print messages about each of its actions.&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>When done we should go ahead setting up getmail’s directories and config file:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">mkdir &lt;span class="nv">$HOME&lt;/span>/.getmail
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp &lt;span class="nv">$HOME&lt;/span>/getmailrc &lt;span class="nv">$HOME&lt;/span>/.getmail/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Adapt &lt;strong>$HOME/getmailrc&lt;/strong> to whatever dir you put that file into. But…pretty much all the remaining work will be done by a small shell script I wrote:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/sh
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">WORKDIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$HOME&lt;/span>/.getmail
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">date&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sb">`&lt;/span>date &lt;span class="s2">&amp;#34;+%d-%m-%Y_%H:%M&amp;#34;&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> ! -f  &lt;span class="nv">$WORKDIR&lt;/span>/backup.mbox &lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">touch &lt;span class="nv">$WORKDIR&lt;/span>/backup.mbox
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">getmail &amp;gt; &lt;span class="nv">$WORKDIR&lt;/span>/getmail.log
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">OUT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$?&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="nv">$OUT&lt;/span> -eq &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="nv">$WORKDIR&lt;/span>/backups/ &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="o">{&lt;/span> mv &lt;span class="nv">$WORKDIR&lt;/span>/backup.mbox &lt;span class="nv">$WORKDIR&lt;/span>/backups/backup_&lt;span class="nv">$date&lt;/span>.mbox &lt;span class="p">;&lt;/span>&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="nv">$OUT&lt;/span> -eq &lt;span class="m">1&lt;/span> &lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## Cleanup older than 3 days backups&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find &lt;span class="nv">$WORKDIR&lt;/span>/backups/* -mtime +3 -exec rm &lt;span class="o">{}&lt;/span> &lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> &lt;span class="nv">$WORKDIR&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="o">{&lt;/span> rm -rf oldmail-* &lt;span class="p">;&lt;/span>&lt;span class="o">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>This script will:&lt;/p>
&lt;ol>
&lt;li>Run getmail using the getmailrc config file you previously worked on.&lt;/li>
&lt;li>If the above command will be successful, it’ll create a_ &lt;strong>backups&lt;/strong>_ dir into &lt;strong>$HOME/.getmail&lt;/strong> and move the latest Mbox file there appending a date and time to its name. (by doing this we are sure next getmail run will happen on an empty &lt;strong>backup.mbox&lt;/strong> file, thus it will just contain the &lt;strong>latest&lt;/strong> content from your mailbox)&lt;/li>
&lt;li>It’ll re-create a &lt;strong>backup.mbox&lt;/strong> file on &lt;strong>$HOME/.getmail&lt;/strong> to avoid the next getmail run to fail.&lt;/li>
&lt;li>In the end, it’ll clean up older than 3 days backups to avoid a too crowded &lt;strong>backups&lt;/strong> folder. (it removes the oldmail file as well since it is useless in our case)&lt;/li>
&lt;/ol>
&lt;p>In the end set up a cronjob that will run the above script and generate the backups for you every one hour:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> * * * * &lt;span class="nv">$HOME&lt;/span>/.getmail/getmail_run.sh &amp;gt; /dev/null&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Feel free to let me know if you’ve encountered any issue while following the above HowTo. Enjoy!&lt;/p>
&lt;p>* /usr/share/getmail4/getmailcore/&lt;strong>_retrieverbases.py&lt;/strong> on line &lt;strong>901&lt;/strong>.&lt;/p>
&lt;p>** More documentation about the &lt;em>&lt;strong>getmailrc&lt;/strong>&lt;/em> file and syntax can be found on getmail’s &lt;a href="http://pyropus.ca/software/getmail/configuration.html#conf-retriever" target="_blank">documentation&lt;/a> page.&lt;/p></description><link>https://www.dragonsreach.it/2011/07/26/backup-your-gmail-in-a-few-easy-steps/</link><guid>https://www.dragonsreach.it/2011/07/26/backup-your-gmail-in-a-few-easy-steps/</guid><pubDate>Mon, 25 Jul 2011 22:50:57 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Automatic Gmail’s Trash &amp; Spam folders cleanup</title><description>&lt;p>Since some time I’ve been thinking about a possible way to delete my &lt;strong>Gmail’s Trash &amp;amp; Spam folders&lt;/strong> content automatically without having to bother doing it manually every single time I wanted to check my mail and clean it up. (I &lt;strong>love&lt;/strong> keeping everything in place and having my Trash&amp;amp;Spam folders empty as they should be makes me pretty &lt;strong>happy&lt;/strong>)&lt;/p>
&lt;p>A few years ago when Mutt was my main mail client I had the need to filter my mail through IMAP and while googling around for that I found out a &lt;strong>great&lt;/strong> piece of software: &lt;a href="https://github.com/lefcha/imapfilter" target="_blank">imapfilter&lt;/a>. Today while analyzing the above quoted issue I suddenly told myself: “Hey, but why don’t you use your dear and old friend imapfilter to fulfil your needs?”&lt;/p>
&lt;p>After a few minutes I came up with a small &lt;em>lua&lt;/em> script that was doing exactly what I wanted: my &lt;strong>Trash&amp;amp;Spam folders&lt;/strong> are no longer crowded and I finally don’t have to delete mails twice! But here they come a few details about my script:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-INI" data-lang="INI">&lt;span class="line">&lt;span class="cl">&lt;span class="na">options.timeout&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">120&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">options.subscribe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">account&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">IMAP {
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> server = &amp;#39;imap.gmail.com&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> username = &amp;#39;example@gmail.com&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> password = &amp;#39;password&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> ssl = &amp;#39;ssl3&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s"> }&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">trash&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">account[&amp;#39;[Gmail]/Trash&amp;#39;]:is_undeleted()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">account[&amp;#39;[Gmail]/Trash&amp;#39;]:delete_messages(trash)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">spam&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">account[&amp;#39;[Gmail]/Spam&amp;#39;]:is_unanswered()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">account[&amp;#39;[Gmail]/Spam&amp;#39;]:delete_messages(spam)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>The script does two things:&lt;/p>
&lt;ol>
&lt;li>It checks whether a mail is &lt;strong>not&lt;/strong> marked as “deleted” (moving an e-mail into the Trash does &lt;strong>not&lt;/strong> mark it as “&lt;strong>to be deleted&lt;/strong>” automatically) already and removes it.&lt;/li>
&lt;li>It checks whether a mail on the Spam folder has been &lt;strong>answered&lt;/strong> (I never had to answer a single e-mail contained into my Spam folder)  and if &lt;strong>not&lt;/strong> removes it.&lt;/li>
&lt;/ol>
&lt;p>Using the above script is really easy (you should run imapfilter on &lt;strong>interactive mode&lt;/strong> first to generate Gmail’s &lt;strong>certificates,&lt;/strong> do that before having cron to run the script for you or otherwise it’ll just hang), just make sure to have &lt;strong>imapfilter&lt;/strong> installed on your system and then run it through cron every half an hour or less depending on your needs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-Bash" data-lang="Bash">&lt;span class="line">&lt;span class="cl">crontab -e
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">*/30 * * * * imapfilter -c /home/user/imapfilter.lua &amp;gt;&amp;gt; /home/user/imapfilter.log&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Please also remember to setup appropriate permissions on the config file since it contains your Gmail’s &lt;strong>password&lt;/strong> and most of all make sure that your Spam folder is &lt;strong>visible&lt;/strong> through IMAP (this option can be found on the &lt;strong>label&lt;/strong> menu available under your &lt;a href="https://mail.google.com/mail/?hl=it&amp;#038;&amp;#038;shva=1#settings" target="_blank">Gmail’s settings&lt;/a>) otherwise imapfilter will just report an error.&lt;/p>
&lt;p>Enjoy!&lt;/p>
&lt;p> &lt;/p></description><link>https://www.dragonsreach.it/2011/07/03/automatic-gmails-trash-spam-folders-cleanup/</link><guid>https://www.dragonsreach.it/2011/07/03/automatic-gmails-trash-spam-folders-cleanup/</guid><pubDate>Sun, 03 Jul 2011 21:29:35 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Fedora Board’s Town Hall</title><description>&lt;p>Today we had a great &lt;a href="https://fedoraproject.org/wiki/Elections#IRC_Town_Halls">Town Hall&lt;/a> meeting kindly hosted and moderated by &lt;a href="https://fedoraproject.org/wiki/User:Nirik" target="_blank">Kevin Fenzi (nirik)&lt;/a>. We received a lot of interesting and nice questions by the contributors and developers that were attending:&lt;/p>
&lt;ol>
&lt;li>What do you feel needs to be improved in the Fedora Community? How can you’re being on the Board improve the Community?&lt;/li>
&lt;li>Do you think that too many issues in Fedora are referred directly to the Board, and if so, how would you like to see this improved?&lt;/li>
&lt;li>Tell us something about what you like doing that isn’t computer or fedora related. What do you like doing for fun?&lt;/li>
&lt;li>What do you plan to do about the issues of polish? Specifically, shipping with minor issues that with recent releases have been hurting the Fedora name.&lt;/li>
&lt;li>What are the plans for mobile devices, such as phones, tablets, ‘pads’, etc.? What are the chances of working on a ‘spin’ for such emerging technologies?&lt;/li>
&lt;li>The board has discussed working on “goals” over the next term. (a) do you think these goals should be focused on helping “us” (people already in the community) or our “target audience”? (b) what goals would you like to see fedora achieve?&lt;/li>
&lt;li>Is anyone in favor the board doing more of its business in public view? I mean like all of it that actually can be?&lt;/li>
&lt;li>What do you plan to do to address operator abuse in #fedora? 2. What penalties will there be for operators when it’s deemed that they are abusing their authority or swaying from Fedora’s values?&lt;/li>
&lt;li>What can be done to bring Fedora to lead market share amonsgt Linux desktops? What can be done to take market share from Microsoft Windows?&lt;/li>
&lt;li>How do you measure the success of the Fedora Project as a whole?&lt;/li>
&lt;li>Recently we’ve seen an influx in new users with questions as well as new volunteers with skills (and no idea where to make use of them). What should we do to better facilitate community engagement?&lt;/li>
&lt;li>How do the candidates feel that they are viewed by the general population of new Fedora users as representatives of Fedora, and do they set an example of model behavior? If so how?&lt;/li>
&lt;/ol>
&lt;p>If any of the above questions do cover a topic you are interested in, please take a few minutes to read candidates answers and discussions by looking at the meeting’s &lt;a href="http://meetbot.fedoraproject.org/fedora-townhall/2011-05-30/fedora_board_town_hall.2011-05-30-19.01.log.html">log&lt;/a>. Enjoy!&lt;/p></description><link>https://www.dragonsreach.it/2011/05/30/fedora-boards-town-hall/</link><guid>https://www.dragonsreach.it/2011/05/30/fedora-boards-town-hall/</guid><pubDate>Mon, 30 May 2011 21:06:14 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Fedora Board’s Questionnaire</title><description>&lt;p>If you are not subscribed to the &lt;a href="https://admin.fedoraproject.org/mailman/listinfo/announce" target="_blank">fedora-announce&lt;/a> mailing list but you are still interested in having a look at my responses about &lt;a href="https://fedoraproject.org/wiki/Elections#Candidate_Questionnaire" target="_blank">community-asked questions&lt;/a>, here they are:&lt;/p>
&lt;ul>
&lt;li>What will you be able to accomplish by being elected, that you would not otherwise be able to do as a contributor?&lt;/li>
&lt;/ul>
&lt;p>(As you will notice by reading the list right down here) Being a single contributor makes achieving these points impossible since changing how localized communities should work, improving our CoC and enforcing its rules and re-thinking Board’s role in our community is something that must be discussed and voted within the Board and its members.&lt;/p>
&lt;ul>
&lt;li>What are your top three priorities as a board member?&lt;/li>
&lt;/ul>
&lt;p>If elected, I will mainly try to focus on:&lt;/p>
&lt;ol>
&lt;li>Improving Fedora’s localization putting a great effort on introducing a form of formalization for specific localized communities having all the needed requirements to gain the “blessing” of Official local community for a certain country or language / dialect. This means pursuing one main objective, which is making Fedora Ambassadors and contributors not fighting each other but acting together as a community. Having two-three or even four websites / local communities just for the Italian or French langs is simply the wrong way to achieve the result of having a Fedora community together again. Ambassadors and contributors of a specific country or lang should focus on establishing *one* strong and trusted localized community, they should throw away the idea of multiple support websites, we need to put together everyone again, act as a team, Fedora together should be our motto. (the specific requirements to gain the above formalization will be written up by me and presented to the Board for a discussion, so expect more news to come about this point if my candidature will be accepted)&lt;/li>
&lt;li>Re-thinking what the Fedora Board should be within the Fedora community. It should represent the community and all its members, if a single or multiple members are having a specific problem, from the bigger to the smaller one, the Board must deal with them to find a valid solution, nothing and no one should be left behind. The Board, in the end, should be the main reference point for everyone wanting to propose a new idea or just willing to costructively complain about something not working in the right way. Discussing problems, respecting everyone’s ideas and opinions and finding a good consensus / common solutions for everyone is alwais the way to go to improve the relationships between community members, contributors and developers.&lt;/li>
&lt;li>Improving our Code of Conduct, finding a good way to enforce members respecting it and remembering which values should be found behind a community (respect between members and their ideas, costructive discussions, decisions taken with general consensus etc.) is the latest point but it’s definitely not the less important on my list. As I stated in my candicacy, I’ve been negatively impressed by the behaviour of some community members in two occasions: while introducing JustFedora’s Planet and while working on another Infrastructure duty. Criticizing without valid motivations just for the sake of doing so seemed to be the common rule on both of the above cases. I would like to remember everyone that this is *not* the best behaviour for an Open Source community, we need to act together as a single team, we don’t have to fight each other but we have to cooperate finding common solutions, discussing, criticizing *costructively* and helping our community coming out from the current situation.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Who do you think Fedora is for today? Who should it be for?&lt;/li>
&lt;/ul>
&lt;p>Fedora is about innovation, but as you may all know, innovation might take in several problems especially for new comers or people switching from a Microsoft OS. Most of the people I know do have a lot of problems to simply open up a computer, writing a mail or working on a document; I would like to see Fedora (but generally Linux based OSs) available to use to everyone: from developers to complete newbies. I would like to work making the idea of Linux being usable by a restricted circle of people changing and I’m sure the arrival of GNOME 3 will definitely help us out on achieving our goal. (It’s user-friendly but innovative interface it’s simply superb)&lt;/p>
&lt;ul>
&lt;li>Where do you see Fedora in five years? How do you think we’ll get there?&lt;/li>
&lt;/ul>
&lt;p>An innovative Fedora but at the same time a distribution easy to use by any of us out there, an awesome cloud service available to everyone, a package manager made easier to learn and understand by newcomers, a GNOME 3 improved, stronger, robust and a gnome-shell completely ready and fully integrated on Fedora is what I would like to see happening within five years.&lt;/p>
&lt;ul>
&lt;li>What will you do to ensure that Fedora remains at the forefront of innovation in the GNU/Linux space?&lt;/li>
&lt;/ul>
&lt;p>I will try to do my best to give a warm welcome to new ideas and projects within Fedora, I’ll listen, discuss with as many contributors and developers willing to propose something new and innovative that could benefit our beloved distribution. I would like to link this answer with the third point of the first answer I gave on the questionnaire: new ideas are strictly related to my vision of innovation, everyone should be free to propose something new without having to worry about receiving personal insults or complaints: this is unfortunately missing in our community. (is our community really prepared for new ideas yet?)&lt;/p></description><link>https://www.dragonsreach.it/2011/05/25/fedora-boards-questionnaire/</link><guid>https://www.dragonsreach.it/2011/05/25/fedora-boards-questionnaire/</guid><pubDate>Wed, 25 May 2011 20:45:10 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Planet Edited? More details to come!</title><description>&lt;div>
&lt;p>
Today I had the possibility to announce a new tool for the Fedora Project, a sub-planet called &amp;#8216;Edited&amp;#8217; mainly focused on Fedora-related posts and announcements.
&lt;/p>
&lt;p>
The scenario we gonna have when Edited will become a known tool by the whole project can be resumed as it follows:
&lt;/p>
&lt;ul>
&lt;li>
team leaders or whoever will be appointed to, will send out their team&amp;#8217;s status and any relevant announcement such as important changes, needs for help directed to any contributor unsure about where and how to start contributing to a specific team. (I heard dozen times new contributors coming into #fedora-admin asking more informations about when and where should they start contributing. I think having a working tool like Edited will make it easier for everyone finding a duty to work at)
&lt;/li>
&lt;li>
a new contributor or a general user willing to know more about how Fedora works behind the scenes will find in Edited the greatest companion ever. No need to cherrypick relevant informations between several posts, but all the information he/she might need directly in a few clicks.
&lt;/li>
&lt;/ul>
&lt;p>
Please remember that Planet Fedora is not and won&amp;#8217;t be the same as Edited. They are different things and they will remain separate. While Planet Fedora is open to any general discussion (from talking about Debian or Ubuntu, to any other Free Software topic), we will try to make Edited as much as we can close to Fedora and its development.
&lt;/p>
&lt;p>
Lastly, one of the things I had in mind when setting Edited up was transparency and that&amp;#8217;s why all the requests are currently stored on the Fedora Infrastructure&amp;#8217;s Trac istance. (I added a link about how the whole process works but looks like someone didnt see it, correct Larry?)
&lt;/p>
&lt;p>
Anyway I&amp;#8217;ve been talking with two or three team leaders and they told they will be more than happy to send out announcements through Edited. Let&amp;#8217;s make it rock then!
&lt;/p>
&lt;p>
See you on Edited!
&lt;/p>
&lt;/div></description><link>https://www.dragonsreach.it/2011/02/11/planet-edited-more-details-to-come/</link><guid>https://www.dragonsreach.it/2011/02/11/planet-edited-more-details-to-come/</guid><pubDate>Fri, 11 Feb 2011 18:43:24 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Bits from September / October</title><description>&lt;p>&lt;strong>Debian maintainer:&lt;/strong>&lt;/p>
&lt;p>Some days ago I had the great announcement that my &lt;a href="http://wiki.debian.org/Maintainers">Debian Maintainer&lt;/a>‘s application was accepted and thanks to Jonathan McDowell my key is finally into the debian-maintainers keyring. (which is now part of the debian-keyring itself thanks to the ftp-masters / keyring maintainer &lt;a href="http://lists.debian.org/debian-devel-announce/2009/08/msg00010.html">work&lt;/a> that made the changes on both DAK and keyring)&lt;/p>
&lt;p>I &lt;a href="http://lists.debian.org/debian-newmaint/2009/08/msg00083.html">applied&lt;/a> on the 22th of August, and thanks to Reinhard’s &lt;a href="http://lists.debian.org/debian-newmaint/2009/08/msg00090.html">advocation&lt;/a>, everything went on the right side. Many thanks to all the people who made this possible.&lt;/p>
&lt;p>&lt;strong>Pkg-mozext:&lt;/strong>&lt;/p>
&lt;p>Around 3 weeks ago I started being involved with the pkg-mozext team working on the new policy and to &lt;a href="http://packages.debian.org/mozilla-devscripts">mozilla-devscripts&lt;/a> transition for all iceweasel / icedove extensions. The work is going great so far and we managed to update several extensions that are now part of the team itself. For a fast look at our package list, feel free to browse pkg-mozext’s &lt;a href="http://qa.debian.org/developer.php?login=pkg-mozext-maintainers@lists.alioth.debian.org">QA page&lt;/a>. A lot of work needs to be done, so if anyone wanna jump in, I would suggest to read our guidelines / policy into the team’s &lt;a href="http://wiki.debian.org/Teams/DebianMozExtTeam">Wiki Page&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Pkg-gnome:&lt;/strong>&lt;/p>
&lt;p>GNOME 2.28 is now released, and the pkg-gnome team is now working hard to provide all the needed updates into unstable and experimental. Everything is going great and we are cleaning up everything listed on &lt;a href="http://www.0d.be/debian/debian-gnome-2.28-status.html">our schedule&lt;/a>.&lt;/p>
&lt;p>Ephipany is under transition (gecko –&amp;gt; webkit) so there are still some open issues / bugs, but now it looks fine so far and it can be used without any particular problem.&lt;/p></description><link>https://www.dragonsreach.it/2009/10/11/bits-from-september-october/</link><guid>https://www.dragonsreach.it/2009/10/11/bits-from-september-october/</guid><pubDate>Sat, 10 Oct 2009 22:17:23 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>BehindMOTU: La mia Intervista…</title><description>&lt;p>Pochi giorni fa ho avuto l’onore di essere intervistato da BehindMOTU, vi riporto l’intera intervista (ovviamente in inglese) augurandovi ,inoltre, una buona lettura! Potete trovare il post originale &lt;a href="http://behindmotu.wordpress.com/2007/10/16/andrea-veri/" target="_blank">qua&lt;/a>.&lt;/p>
&lt;p>Today we are interviewing &lt;a href="https://launchpad.net/%7Eav">Andrea Veri&lt;/a>, fresh MOTU and eager Ubuntu volunteer.&lt;/p>
&lt;p>&lt;a href="http://behindmotu.files.wordpress.com/2007/10/bluekuja.png">&lt;img style="cursor: pointer;border: 0px initial initial" src="http://behindmotu.files.wordpress.com/2007/10/bluekuja.png" border="0" alt="" width="140" height="120" />&lt;/a>&lt;/p>
&lt;p>&lt;strong>Age:&lt;/strong> 18&lt;/p>
&lt;p>&lt;strong>Location:&lt;/strong> Udine, Italy&lt;/p>
&lt;p>&lt;strong>IRC Nick&lt;/strong>: bluekuja&lt;/p>
&lt;p>&lt;strong>How long have you used Linux and what was your first distro?&lt;/strong>&lt;/p>
&lt;p>I started using Linux at the end of 2005 using Red Hat and Fedora distros, contributing on writing several pages for Fedora documentation (mostly server docs) but mainly working on some packaging-related activities (introducing ctorrent, gtorrent-viewer and v2strip packages inside Fedora) for more than 3 months until the beginning of March 2006 when I decided to move definitely to Ubuntu after discovering it at a friend’s party. Was love at first sight that made me leaving every Fedora plan and project creating my first personal wiki page on &lt;a href="http://wiki.ubuntu.com/">wiki.ubuntu.com&lt;/a> some days later.&lt;/p>
&lt;p>&lt;strong>How long have you been using Ubuntu?&lt;/strong>&lt;/p>
&lt;p>In fact, I started using Ubuntu at the beginning of 2006, firstly getting involved inside the Edubuntu family making real the possibility to have an Edubuntu Italian support and website area inside the current Italian LoCo Team.&lt;/p>
&lt;p>&lt;strong>When did you get involved with the MOTU team and how?&lt;/strong>&lt;/p>
&lt;p>Right after joining the Ubuntu brigade I started checking out MOTU documentation, mainly &lt;a href="http://doc.ubuntu.com/ubuntu/packagingguide/C/">packaging guide&lt;/a> plus debian &lt;a href="http://www.debian.org/doc/maint-guide/">new maintainer’s guide&lt;/a>, trying to understand every single new word and applying directly to a source package every lesson learned during developer’s world “travel”. After getting introduced and fascinated from an active community, I had to left the project for a while for some small problems, restarting everything on May 2007 with my first sponsored upload inside the archive. My packaging passion increased right after meeting &lt;a href="https://launchpad.net/%7Easac">Alexander Sack&lt;/a> inside #ubuntu-mozillateam irc channel some days later, deciding to work directly with him as my mentor for both Debian and Ubuntu distributions.&lt;/p>
&lt;p>&lt;strong>What helped you learning packaging and learning how the Ubuntu teams work?&lt;/strong>&lt;/p>
&lt;p>I started with &lt;a href="http://www.debian.org/doc/maint-guide/">Debian New Maintainer’s guide&lt;/a> and &lt;a href="http://doc.ubuntu.com/ubuntu/packagingguide/C/">Ubuntu’s packaging guide&lt;/a> moving then to package my first applications learning from already-packaged software and asking if needed to Alexander improving and learning every time from him or from other developers a new Ubuntu Team lesson.&lt;/p>
&lt;p>&lt;strong>Favorite part of working with MOTU?&lt;/strong>&lt;/p>
&lt;p>Introducing a fix making tons of users happy is one of the best things I appreciate of being a MOTU. Mentoring, sponsoring, helping out new contributors or students is something special as well.&lt;/p>
&lt;p>&lt;strong>Any advice for people wanting to help with MOTU?&lt;/strong>&lt;/p>
&lt;p>I always suggest to start with a package a new contributor cares about personally, that’s useful to improve/fix the package itself during its maintenance.&lt;/p>
&lt;p>Reading MOTU and Debian documentation is a great starting point as well to avoid any strange question on our MOTU irc channel.&lt;/p>
&lt;p>&lt;strong>What packages/areas of Universe are you most interested in?&lt;/strong>&lt;/p>
&lt;p>I’m currently working on a vast area of packages, but I’ll try to focus on p2p (Peer-2-Peer) applications both for Universe and Main. I planned to create a MOTU-p2p team really soon including it inside the existing motu-torrent team, but it will take some months to organize everything up; contributors (testers/packagers) are currently missing.&lt;/p>
&lt;p>&lt;strong>Any Plans for Hardy Heron?&lt;/strong>&lt;/p>
&lt;p>I’ll keep working on a large number of packages but as I said before I would like to focus on having an updated situation of p2p applications, introducing libtorrent-rasterbar and its related clients like btg or linkage. Creating a working team with interested contributors and developers will be the first step to work on.&lt;/p>
&lt;p>&lt;strong>Favorite quote?&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>“As for me, all I know is that I know nothing.” — Socrates&lt;/p>
&lt;/blockquote>
&lt;p>**What do you do in your other spare time?&lt;/p>
&lt;p>** I love going around with my motorbike, listening good music, playing basketball and meeting up with friends around the city centre.&lt;/p>
&lt;p>&lt;strong>Pic of you, your work area, and/or your screen?&lt;/strong>&lt;/p>
&lt;p>&lt;a href="http://behindmotu.files.wordpress.com/2007/10/bluekuja_screen.png">&lt;img style="cursor: pointer;border: 0px initial initial" src="http://behindmotu.files.wordpress.com/2007/10/bluekuja_screen.png" border="0" alt="" width="200" height="150" />&lt;/a>&lt;/p>
&lt;p>&lt;a href="http://3.bp.blogspot.com/_mbTtrw2j6OY/RxnaZ3XobiI/AAAAAAAAACE/xtsbAPoyTvk/s1600-h/work-space.jpg">&lt;img style="cursor: pointer;border: 0px initial initial" src="http://behindmotu.files.wordpress.com/2007/10/bluekuja_workarea.jpg" border="0" alt="" width="200" height="150" />&lt;/a>&lt;/p></description><link>https://www.dragonsreach.it/2007/10/20/behindmotu-la-mia-intervista/</link><guid>https://www.dragonsreach.it/2007/10/20/behindmotu-la-mia-intervista/</guid><pubDate>Sat, 20 Oct 2007 10:27:00 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Il primo upload ha sempre un sapore speciale!</title><description>&lt;p>Questo pomeriggio ho eseguito il primo upload nell’archivio di Ubuntu e devo dire che ricevere poco dopo la mail di conferma e di successo dell’operazione è qualcosa di veramente speciale! Mi trovavo in una delle tante cartelle della mia Home e dopo aver controllato innumerevoli volte che tutto fosse corretto, ho lanciato dput e eseguito l’upload del pacchetto in questione, che, dopo il solito controllo della chiave di autorizzazione (GPG-Key) ha provveduto ad inviare i file necessari al server, mandandomi poco dopo l’&lt;a href="https://lists.ubuntu.com/archives/gutsy-changes/2007-September/008265.html">email&lt;/a> che tanto aspettavo: &lt;em>&lt;strong>ACCEPTED&lt;/strong>&lt;/em>. Dopo qualche minuto sono ripassato a controllare che i build fossero andati come aspettavo e…..&lt;/p>
&lt;p>&lt;a href="http://www.dragonsreach.it/wp-content/uploads/2007/09/build_success.png">&lt;img class="size-full wp-image-91 alignnone" src="http://www.dragonsreach.it/wp-content/uploads/2007/09/build_success.png" alt="" width="316" height="148" />&lt;/a>&lt;/p>
&lt;p>….e fortunatamente tutto era andato a buon fine! :-)&lt;/p></description><link>https://www.dragonsreach.it/2007/09/13/il-primo-upload-ha-sempre-un-sapore-speciale/</link><guid>https://www.dragonsreach.it/2007/09/13/il-primo-upload-ha-sempre-un-sapore-speciale/</guid><pubDate>Thu, 13 Sep 2007 18:16:00 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Una grande soddisfazione!</title><description>&lt;p>Dopo ben 3 mesi dalla mia presentazione al MOTU Council per la &lt;a href="https://lists.ubuntu.com/archives/motu-council/2007-June/000203.html">candidatura&lt;/a> ufficiale a Master of the Universe è giunta ieri la lieta mail di Matt Zimmerman, chairman della tech board di Ubuntu e responsabile di ogni decisione finale per ogni candidatura presentata al consiglio. La &lt;a href="https://lists.ubuntu.com/archives/ubuntu-devel/2007-September/024263.html">mail&lt;/a> che potete trovare nella mailing list di ubuntu-devel annuncia il mio ingresso come developer ufficiale di Ubuntu, con permessi di upload all’interno dell’archivio. È stata per me una grandissima soddisfazione vedere dopo 2 anni di lavoro l’icona di MOTU e di Ubuntu developer nel mio profilo di &lt;a href="https://launchpad.net/~av" target="_blank">Launchpad&lt;/a>.&lt;/p>
&lt;p>Continuerò ora a lavorare e migliorare avendo come primo obiettivo l’ufficializzazione del gruppo “ubuntu-it-dev” nato da qualche mese nella nostra communità. Al prossimo post!&lt;/p></description><link>https://www.dragonsreach.it/2007/09/12/una-grande-soddisfazione/</link><guid>https://www.dragonsreach.it/2007/09/12/una-grande-soddisfazione/</guid><pubDate>Wed, 12 Sep 2007 18:14:00 +0000</pubDate></item><item><dc:creator>Andrea Veri</dc:creator><title>Creazione MOTU Torrent Team</title><description>&lt;p>Era da parecchio tempo ormai che l’idea di creare una squadra che si dedicasse solamente alla manutenzione di pacchetti legati al protocollo bittorrent mi percorreva la mente. Da intendere però che per manutenzione non si preveda solo la creazione di pacchetti non presenti negli archivi ma anche di tenere aggiornate le applicazioni già presenti nelle componenti main e universe tramite merges e syncs da debian, creando una collaborazione tra upstream e debian stesso per migliorare i programmi disponibili introducendo magari nuove realtà anche nel mondo delle librerie legate ai torrent. Proprio in questo settore mi sto impegnando ad aggiungere il supporto per la libreria creata da Rasterbar software, chiamata “libtorrent-rasterbar”, usata da numerossimi client che si sono diffusi negli ultimi tempi navigando nei meandri delle applicazioni torrent. Mi era caduto l’occhio soprattutto su linkage (&lt;a href="http://zeflunk.googlepages.com/">http://zeflunk.googlepages.com/&lt;/a>) che richiede tra le altre cose la libreria citata in precedenza, che verrà introdotta appena l’upstream sistemerà un errore legato al soname che coincide purtroppo con quella della libreria già esistenti nei database (libtorrent).&lt;br>
Non mi resta che linkarvi le pagine legate al team, così potrete osservare più da vicino come viene organizzato il lavoro tra i membri:&lt;/p>
&lt;p>&lt;span style="font-weight: bold">Launchpad:&lt;/span> &lt;a href="https://launchpad.net/%7Emotu-torrent">https://launchpad.net/~motu-torrent&lt;/a>&lt;br>
&lt;span style="font-weight: bold">Wiki:&lt;/span> &lt;a href="https://wiki.ubuntu.com/MOTU/Teams/Torrent">https://wiki.ubuntu.com/MOTU/Teams/Torrent&lt;/a>&lt;br>
&lt;span style="font-weight: bold">Bug reports:&lt;/span> &lt;a href="https://bugs.launchpad.net/%7Emotu-torrent/+packagebugs">https://bugs.launchpad.net/~motu-torrent/+packagebugs&lt;/a>&lt;/p>
&lt;p>A presto&lt;/p></description><link>https://www.dragonsreach.it/2007/05/20/creazione-motu-torrent-team/</link><guid>https://www.dragonsreach.it/2007/05/20/creazione-motu-torrent-team/</guid><pubDate>Sun, 20 May 2007 19:40:00 +0000</pubDate></item></channel></rss>