Since all of us have a bit of extra time lately I grabbed a copy of Jeff Geerling‘s Ansible for DevOps to finally tackle the project to translate my many, many bash scripts into something for flexible and idempotent.

Ever since I began moving a lot of my cloud-hosted projects and applications to my own hardware in a colocation facility, I’ve spent a lot of time spinning up linux containers on Proxmox and running bash scripts to get them into a state that’s useful for me. This can get tedious and time consuming!

My first project with Ansible was to not only streamline the creating of linux containers on my Proxmox hypervisor, but to provision them with the base configuration they need—and to subscribe them to my FreeIPA domain for central authentication.

Besides the included README, you can find the entire playbook on GitHub.

ansible-pve-lxc

ansible-pve-lxc is an Ansible playbook and set of roles for provisioning and configuring LXC containers in a Proxmox virtual environment, and subsequently subscribing them to a FreeIPA domain.

Define inventory with container configurations

This inventory is in the YAML format, but will also work in INI format

A background-goal of mine this last month has been to learn enough of Rust to code something useful that I can use at work. In spare moments since the new year I’ve been reading “the book”—which has been more than helpful in learning the basics of Rust and what makes it such an interesting, powerful language.

Fast-forward to today and I’m happy to share the useful something that I managed to make with Rust. Below is the README from yeah‘s GitHub page:

yeah

yeah is a command-line tool to return the vendor name for a given MAC address. Queries are ran against the IEEE OUI vendor list.

Having recently set up a new-to-me Dell R720 in a colocation provider’s environment—in my quest to “own” the whole stack from metal to service—I ran into an issue with not being able to use generic or Cisco-coded SFP+/SFP trancseivers in the included Intel X520 network card. dmesg kept indicating that the transceiver was unsupported. Because of impatience and other factors, I decided to dig a bit and see what it would take to enable support for good ‘ol grab bag generic SFP+/SFP transceivers.

I came across this article on the ServeTheHome forums where user NathanA had already dug to the bottom of this issue, and fortunately came out the other side with a solution.

NathanA discovered—via datasheets, mailing lists, and discussion threads—that a particular bit in a particular byte of the NIC EEPROM needs to be flipped in order to allow any SFP. In the Linux ixgbe driver, the byte in question is referred to as IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP.

The steps to flip this bit, and thus allowing “unsupported” SFPs, is as follows:

Note: I am in no way liable for any permanent damaged caused by running the following commands on your Intel NIC!

A Roomba–or equivalent robot vacuum–is something I never felt I needed to purchase for myself. I have an old broom from colleg and a decent, budget upright vacuum. But, what happens when you’re gifted with a robot vacuum…?

Behold, the holiday-gifted Ecovacs Deebot N79:

Once rated Wirecutter’s Best Budget Robot Vacuum, the Deebot N79 fills me with both pride and guilt as it conquers the 2D world of my apartment. Whether it’s effortlessly chewing up cat litter, or getting irreparably tangled in lamp cords.

Deebot has been a great addition to our home, but brings with it a few unavoidable facts:

-The iOS app is garbage and provides no HomeKit support-The included handheld remote works, but speaks IR to Deebot (and can’t control him around corners)

Trying to set a schedule on the handheld remote itself only works with near line-of-sight. And the schedule settings in the iOS app provide almost zero granularity. It provides no fine-tuned control of how long Deebot runs, whether it does full-room or edge cleaning, etc.

Make Deebot do the WiFi

In order to control Deebot over the network, we need to connect Deebot to the network. The instructions here speak for themselves.

Once you’ve created your Ecovacs account on a server instance somewhere in China, try using the app to do the Deebot basics–cleaning, returning to the charge station, and directional control.

Now Deebot is yet another WiFi device in your home.

Install sucks

William Pietri on GitHub created a set of python scripts that allow you to control your Ecovacs robot vacuum from the command-line.

Install them with pip:

pip install sucks

Let’s log in to the Ecovacs servers with the credentials you just created:

Cron your vacuum

Lastly, let’s make a cron entry to run Deebot every day at 4PM local time:

crontab -e

0 16 * * * /<wherever_you_put_the_executable>/sucks clean 15 edge 10

The above entry will–everyday at 16:00–command Deebot to perform a normal clean operation for 15 minutes, followed by an edge operation for 10 minutes, then instruct Deebot to return to its charging home.

What next?

Pietri’s project also includes a python library, so you can further add programatic logic to your vacuum.

It’s beyond easy to pair AirPods with a non-Apple device. And on Arch, it’s trivial to have the AirPods appear in the bluetooth manager (in this case, blueman-applet)–but when you try to initiate pairing, it does not succeed.

The trick here–if you don’t require pairing with Bluetooth LE devices–is to manually specify that the bluetooth controller (bluez) use BR/EDR transport rather than allow both transport modes.

2018 is the year of Linux on the desktop—but only for me and only since I started working at a new company where I use Fedora for ~ eight hours daily. Coming from 10+ years of using Macs at work, the biggest change is using Ctrl + C/V for copy/paste and not Cmd + C/V. A couple of weeks in and my hand began to get a slight cramp from using my pinky and index fingers rather than my thumb and index fingers for the operation.

After reading how to remap keys with xmodmap, the configuration below is what I came up with.

Once parsed by Xorg, this lines in this file will remap right alt to right super, left alt to right control and left super to left alt.

2020-05-22: After recently re-following these guidelines myself, a few changes have been made in how we start the UPS driver

Early last year a friend and I started a local, wireless mesh network that eventually evolved into a community-run WISP. The full story of how it came to be is for another post…

Fast forward many months and we secured some tower space for our radios and some limited rack space for our main networking equipment and servers. The location was just about perfect, but rather inconvenient to service.

Definition of not accessible

Needing some reliable—but cheap—backup power for our main router, switch, and small 1U server we settled on the 10-outlet CyberPower 850VA/510W UPS (CP850PFCLCD). It provides reliable, stable output and will run our equipment (and radio) for about 45 minutes in the event the mountain site loses power.

When I drove up to connect it to our equipment I plugged in the supplied USB Type-B to Type-A cable from the UPS to an empty port on our server—not yet knowing how to query the UPS, or if there was any linux tooling available for our particular device.

Below are the steps I took to enable quantifiable monitoring of my consumer-grade UPS via open-source tooling on CentOS 7. And, in the footnotes I’ve linked the two pages that helped me succeed in this project.

Install + configure NUT on CentOS 7

Throughout this guide I’m using CentOS, but NUT should be available on most distros/package managers.

If you receive any error ensure you have sudo privileges—and try restarting the machine if the problem persists.

We should also set NUT’s mode to standalone.

$ sudo vi /etc/ups/nut.conf

MODE=standalone

From their documentation:

standalone: This mode address a local only configuration, with 1 UPS protecting the local system. This implies to start the 3 NUT layer (driver, upsd and upsmon) and the matching configuration files. This mode can also address UPS redundancy.

Configure NUT server and monitor

Once the driver is up and running, we need to set up the user for accessing the NUT daemon.

$ sudo vi /etc/ups/upsd.users

Append:

[local_mon]
password = <secretpass>
upsmon master

Change <secretpass> to a secure password of your choosing.

Lastly, we’ll edit the NUT monitor configuration with the name of our device, and the access information for the newly created user.

$ sudo vi /etc/ups/upsmon.conf

And append:

MONITOR cyberpower@localhost 1 local_mon <secretpass> master

Of course, change cyberpower to the name you gave your device, and <secretpass> to the password you specified in /etc/ups/upsd.users

Enable services

To ensure monitoring ability after planned and unplanned reboots, we need to enable and start the NUT system services.

If you encounter any errors starting the services, restarting may resolve these. Often, running upsdrvctl start as we did earlier hijacks USB communication with the UPS and causes an error when trying to start NUT services.