OpenStack IPs, part II

Just a short one. Now that I can list IPs (see last post), it might be nice to associate them on the command line, too. First I wanted to extend the little script, but then I remembered there must already be a CLI way for this.

And there is.

$ openstack server list
$ nova floating-ip-associate <server-uuid> <floating-IP>

(Note: The floating-ip is the actual IP, not the UUID of the OpenStack floating IP)



LibreOffice tables

Filed my first LibreOffice bugs. And I must say: A free and open source word processor with an open doucment format is desperately needed, but one that actually works. LibreOffice is really … well, bad looking and playing catch-up with “the other”, and crashing really way too often for my taste.

And while working with a lot of tables (which is a pain in the ass with LO) I found three bugs. And on one bug even the LO team agrees that it’s a major one πŸ™‚ .

To be honest, I think the autoformat was never really used by anyone, it’s that crappy.

Custom table autoformat ignores background colors under certain circumstances
Font STYLES for Table Headers are not copied when defining auto table format
Table Autoformat: Allow to select if “SUM” line is present for auto format


OpenStack floating IP convenience

Problem: I am working in a tenant which has a couple of hosts with floating IPs assigned. I always have to look them up either manually using the command line clients (and dealing with all those UUIDs), or manually in the web GUI. Didn’t like.

Solution: Python script, which outputs FLOATING_IP -> HOST_NAME.

Here it is.

#!/usr/bin/env python

from novaclient import client
import novaclient.v2.floating_ips as os_fips
import novaclient.v2.servers as os_servers
import novaclient.v2.networks as os_networks

#from pprint import pprint as pp
import os
from sys import exit

def error(printme):
    print("ERROR: {}".format(printme))

def check_env():
        if not os.environ.get(a): error("Please set ${}".format(a))

def get_client():
    return client.Client(2,

if __name__=="__main__":
    nova = get_client()
    fipman = os_fips.FloatingIPManager(nova)
    servman = os_servers.ServerManager(nova)
    netman = os_networks.NetworkManager(nova)

    ips = fipman.list()
    srs = servman.list()

    id2server = {}
    for a in srs:
        id2server[] = a

    ips = [(ip.ip, ip.instance_id) for ip in ips]
    # filter out unused floating ips (which have  as instance id)
    ips = filter(lambda x: x[1], ips)
    # create (IP, SERVER_NAME pairs)
    ips = map(lambda x: (x[0], id2server[x[1]].name), ips)
    # sort for convenience by host instance name
    ips = sorted(ips, key=lambda x: x[1].lower())

    for a in ips:
        print("{:18s} {}".format(a[0], a[1]))

Sample output:

$ tools/list_ips      ab_1695_1_dml      ab_1695_1_jump      media0       RJD1_CouchbaseA1       RJD1_JumpServer       RJD1_OpenshiftMaster      tla-centos66


Main sources:


Microsoft Code and Typescript

So being on the enterJS conference I wanted to get started with JavaScript. And TypeScript seems really promising. And once again I stumbled over the DIW pattern – Download, Install, Weird error messages.

So, here’s my take on how to get started.

I wanted …

  • Β to try node-hid to see my USB HID devices, using TypeScript, Microsoft Visual Studio Code, and Node.js.

So here’s how to get it to work:

mkdir my_project_dir
cd my_project_dir
brew install node            # I'm on Mac ;)
npm install -g typescript    # install globally
npm install node-hid         # install locally

Fire up Code, and “open” the project directory “my_project_dir”.

Press “CMD-SHIFT-P” (probably CTRL-SHIFT on non-OSX machines) and search for “Configure task runner”. Here you use this configuration:

  "version": "0.1.0",
  "command": "tsc",
  "isShellCommand": true,
  "showOutput": "silent",
  "args": [],
  "problemMatcher": "$tsc"

Then create a new file called “test.ts”, with the following content:

// typescript does not know "require".
// you have to convince it it "will exist at runtime".
declare function require(name:string);
var HID = require('node-hid');
var devices = HID.devices();

Now if you press “CMD-SHIFT-B” this should compile and create a file called “test.js”.

I don’t know (yet) how to run it from within Code, so on the command line I can test it by doing …

$ node test.js
 { vendorId: 1452,
    productId: 589,
    path: 'USB_05ac_024d_fa120000',
    serialNumber: '',
    manufacturer: 'Apple Inc.',
    product: 'Apple Internal Keyboard / Trackpad',
    release: 521,
    interface: -1 },
  { vendorId: 0,
    productId: 0,
    path: '',
    serialNumber: '',
    manufacturer: '',
    product: 'Apple Mikey HID Driver',
    release: 0,
    interface: -1 },
  { vendorId: 1452,
    productId: 589,
    path: 'USB_05ac_024d_fa120000',
    serialNumber: '',
    manufacturer: 'Apple Inc.',
    product: 'Apple Internal Keyboard / Trackpad',
    release: 521,
    interface: -1 },
  { vendorId: 1452,
    productId: 589,
    path: 'USB_05ac_024d_fa120000',
    serialNumber: '',
    manufacturer: 'Apple Inc.',
    product: 'Apple Internal Keyboard / Trackpad',
    release: 521,
    interface: -1 },
  { vendorId: 1452,
    productId: 589,
    path: 'USB_05ac_024d_fa120000',
    serialNumber: '',
    manufacturer: 'Apple Inc.',
    product: 'Apple Internal Keyboard / Trackpad',
    release: 521,
    interface: -1 } ]

Article Sources:

Microsoft Visual Studio Help


Shared clipboard for Arch as VMWare guest

… aaaand I wanted to have a shared clipboard. It’s again all in the wiki, but again a bit distributed. So here we go.

First: Install open-vm-tools and gtkmm, then add some modules to system bootup

  • “sudo pacman -S open-vm-tools gtkmm
  • “sudo vim /etc/mkinitcpio.conf”
  • Under “MODULES=…” add the following: “vmxnet3 vmw_vmci vmw_pvscsi vmw_balloon”
    (You probably don’t need most of them, but this is the config which worked for me. I didn’t try to remove them one-by-one to see which ones are actually needed)
  • “sudo mkinitcpio -p linux”
  • reboot

Second, make sure “vmware-user-suid-wrapper” is stared on login:

  • echo vmware-user-suid-wrapper > ~/.xinitrc
  • Logout and log in (or reboot)



Install infinality fonts bundle in arch

Installing custom repos in Arch is kind of annoying. But here’s how it goes (especially if you’re behding a firewall which permits only ports 80, 443 and 22):

First. Switch the keyserver to a HTTP based one. To do this:

  1. edit /etc/pacman.d/gnupg/gnupg.conf
  2. replace “keyserver hkp://…” with “keyserver hkp://”

Second. Get the key ID for the repo (in my case from the wiki):

  • KEY ID is “962DDE58”

Third. Download key from keyserver and sign it locally:

  • pacman-key -r 962DDE58
  • pacman-key –lsign-key 962DDE58

Fourth. Add the repository to the pacman.conf file:

  • “vim /etc/pacman.conf”
  • add the lines from here

Fifth. Update the repos

  • pacman -Sy

Sixth. Install the f*** bundle:

  • pacman -S infinality-bundle

That’s it πŸ™‚