2016-04-16

Pretty WordPress permalinks under OpenBSD's httpd(8)

I run a bunch of websites on OpenBSD. One of them is running WordPress for a local group. When I upgraded the server from OpenBSD 5.7 to 5.8 last year, I finally switched from the version of Apache 1.3 that used to come in the base install, to the new relayd-based httpd that had been in the works. Without mod_rewrite, I disabled the so-called "pretty" permalinks with useful titles, going back to the old numbered-posts setup.

This had been bothering me last weekend, and earlier this week, I saw someone else with the same problem. I had written a totally custom CMS for one of my other websites, and it also uses an awkward set of front-controllers written in PHP in order to make friendly-looking URLs. I decided to explore my method of setting that site up, applied to WordPress.

You have the option of using so-called "PATHINFO" Permalink URLs in WordPress. Those might look like:
     http://blog.bar.com/index.php/2016/hello-world/

That's getting there. I opted to make my site more like:
     http://blog.foo.com/posts/2016/04/hello-world/

I started by creating a symbolic link called "posts" pointed to index.php.

ln -s index.php posts

Since I'm using PHP-FPM, I had to also make sure that FPM would acknowledge this new file since it lacks the .php extension.  Beware the rule of unintended consequences here. You'll want an airtight httpd.conf when it comes to what things it decided to toss over to the PHP-FPM socket. Blank out the security.limit_extensions variable in /etc/php-fpm.conf

security.limit_extensions =

Next, adjust your httpd.conf to send stuff destined to the /posts URI (note the * at the end, it's important!) to PHP-FPM. All of my sites are under /var/www/sites/ (including the one I'm setting up WordPress on). My httpd.conf clause for this site looks kind of like this:

server "blog.foo.com" {
    listen on $ext_if port 80
    alias "fooblog.com"


    log access fooblog-access.log
    log error fooblog-error.log
    directory {index "index.php" }
    location "/*.php*" {
        root { "/sites/fooblog" }
        fastcgi socket "/run/php-fpm.sock"
    }
    location "/posts*" {
        root { "/sites/fooblog" }
        fastcgi socket "/run/php-fpm.sock"
    }
    location "/*" {
        root { "/sites/fooblog" }
    }
}



You'll need to restart php_fpm and httpd for this to take effect.

doas rcctl restart httpd
doas rcctl restart php_fpm

After that, log in to your site's admin panel and change the permalink structure to include "/posts/" at the beginning. You should be all set.












2016-01-01

NetBSD 7.0 working on the Raspberry Pi Zero

The NetBSD Wiki has a nice page about Raspberry Pi support, including instructions for finding a nightly snapshot image for Raspberry Pi SBCs.

Trying to boot the latest snapshot (201512311300Z) on my Pi Zero resulted in 8 flashes of the OK/ACT LED (bootcode.bin and/or start.elf problems, according to the documentation). This image boots fine on my Pi B+ and Pi 2.

I over-wrote bootcode.bin, start.elf and start_cd.elf on the freshly imaged NetBSD SD card from the version on my Pi Zero Lapdock (installed from a recent Arch Linux image. NetBSD 7 now boots on the Raspberry Pi Zero. I don't know if these are exactly the correct files, but I suspect they likely require updating in the NetBSD base image.

I've included MD5 sums of the files for your convenience: From the NetBSD Image: 
MD5 (bootcode.bin) = 9a4ad6a12ad7dc1aae279888c25d2252 
MD5 (start.elf) = a2c4b9ea3ae986f88ea01e05bef46904 
MD5 (start_cd.elf) = 85924312c9b51d1ef5b7ca301bb18d54

Files I copied over from Arch Linux that make it bootable: 
MD5 (bootcode.bin) = 6cc6560c0178c10928d14b8768969dab 
MD5 (start.elf) = f5b2a422d863efe5d47b1ac291ccaa3a 
MD5 (start_cd.elf) = f0dfc1462c5d9b003b64428fd52406ed

(I posted a variant of this as a comment on the NetBSD wiki. It hasn't shown up yet. It likely requires approval)

2015-12-31

No more "Hacky GNU Year"

I usually kick off every year with the aforementioned greeting, but 2015 will stand as the year I really got sick of what the GNU/Linux ecosystem has become... in pretty much the same way I have been sick of what the Windows ecosystem has become. The mainstream Linux distributions have all become painful to me in ways that I couldn't have imagined just a few years ago. It's been a long, arduous slog. You can ask any of my nerd friends. I've gotten pretty salty over the state of Linux in the past year. And don't get me started on the nightmares of El Capitan and Windows 10, also making 2015 especially brutal.

This evening, though, Linux is weighing especially heavy on my mind.  I'm sure the recent passing of Ian Murdock has something to do with it as well. We really did lose one of the heroes this week.

I will still use Linux and Windows for the tasks that they excel in. I will continue to experiment with and master their secrets in order to figure out how they work -- just as I do with other operating systems.

My new year's resolution is to get more and more of my personal stuff migrated to some kind of BSD.

Best wishes to all of you in 2016 from Ax0n.

2015-12-20

Raspberry Pi Zero inside a Lapdock 100

A lot of folks have used the Motorola Lapdock as a portable complement to the Raspberry Pi. It usually ends up as a big mess of cables. My Lapdock was actually used a lot with my last phone, as it was intended to. Occasionally, people would ask me if I was using it for a Pi. My response was "If I can figure out how to fit it inside, I'll try." I always figured it would involve de-soldering all the GPIO headers, network and USB jacks to make it thin enough to fit, then a bunch of soldering to hard-wire everything together.

With the announcement of the Raspberry Pi Zero, I knew it was finally time.

I did a little bit of recon inside the Lapdock case. Plenty of room for a Raspberry Pi Zero and some cables.


Opening up the LapDock isn't too hard. Start by prying the keyboard loose from the top, with a small flat-blade screwdriver or a spudger. Underneath, you will find a single ribbon cable for the keyboard, and a number of screws. Remove the keyboard and all visible screws. The only thing left holding the case together after that are the four screws on the bottom case, one at each corner.

Once I saw the layout inside, my plan was to place some pigtail connectors inside the chamber that the dock connector rests in when not in use. The speaker on the left bottom corner is kind of in the way.

I ordered two cables from Amazon:
Micro HDMI Female to Mini-HDMI Male
USB On-The-Go Extension

I tested everything outside the lapdock first.

Miraculously, both cables worked great. I'd read many horror stories of HDMI cables and adapters that didn't work well with the Raspberry Pi. Not bad for 12 bucks.

Inside, I got to work. First things first, remove the speaker, held in by two screws. Remove the battery, too. It sits loose in the case and is easily unplugged.

At this point, it was obvious to me that I couldn't put the pigtails inside the case where I had planned. There's just not enough room under the speaker. I took the top case apart a little further by removing the screws marked below.
 

I cut away a little piece of plastic under the speaker to open up some space near where the dock cable rests.
Then, I pried apart the upper part of the dock on one side, giving me enough room to make a cross-shaped hole in the rubber dock membrane by making two slices with a knife.

I'll have to run the pigtails through this corner of the phone dock. I routed the cables through the maze of plastic and shoved them through this hole.

I had to make sure the plugs were oriented properly for a good fit with the dock connector.

To make room for the Pi, I took a knife blade to some of the plastic structures inside the case. A tab (not shown) on the lower case lid also needed to be trimmed.


The final part before reassembly was trying to find a good way to route the cables so that the Lapdock could be reassembled nicely. I held the Raspberry Pi Zero down with some double-sided foam mounting tape once I had everything in position. This tape also insulates Pi from the metallic coating on the inside of the Lapdock's case, so don't skimp on it.

Once everything was buttoned back up, I plugged the dock connector into the pigtails again and powered the dock up.

The end result is a nice, self-contained computer powered by the Raspberry Pi Zero, but the dock is still usable for other devices.



Update: 2015-01-24

Frequently, you have to use the reset button on the bottom of the lapdock to get it to boot proplerly, and I wanted to be able to reset the dock with my pinkie finger. Also, I wanted a way to easily swap out MicroSD cards. To fix these two issues, I used a stepped drill bit to enlarge the reset pinhole and to give me access to the Pi Zero's card slot.


2015-12-12

PiTether: Mobile phone to ethernet bridge

Introduction

If you saw me at DefCon this year, you probably saw me using my HP Jornada. There was also a pretty good chance that you saw me getting it online in strange ways...
HACK THE PLANET! (Or just dial up a BBS...)
Since there aren't payphones everywhere, though, I built something interesting back in May, preparing for DefCon. It's a very simple Raspberry Pi ethernet bridge. I did this mostly to avoid using the open WiFi at DefCon, understanding that 3G/4G shenanigans are happening, but with a higher barrier to entry than the 802.11a/b/g/n/ac mess.

Yes, that's a Raspberry Pi Model B inside a case made of LEGO bricks.

Setting up Arch Linux

Being no stranger to building embedded systems, I decided to go with a bare-bones Arch Linux ARM install on a 2GB SD card. You could likely run with an even smaller card if you wanted to. The installation instructions are pretty straight-forward if you're familiar with the command line.

Once you have Arch Linux up and running on the Pi, I recommend changing the default passwords (alarm/alarm, root/root) and then doing a system update to get the latest packages from base. Simply connect the Pi to the Internet through its ethernet port, then run "pacman -Syyu" as root.

Configuring the network

The 3 interfaces we worry about are eth0, usb0 and br0. The first two basically work right out of the box:

/etc/systemd/network/eth0.network exists from the default installation, so the ethernet port is already set up for us.

When you activate USB Tethering from Android while plugged in to most modern Linux distros, it shows up as a network device (in this case, usb0) without any extra configuration.

br0 (the bridge interface) needs to be configured. First, we establish a netctl profile for it. Put the following text into a file called /etc/netctl/br0


Description="PiTether USB/Ethernet connection"
Interface=br0
Connection=bridge
BindsToInterfaces=(eth0 usb0)
IP=dhcp
SkipForwardingDelay=yes

Next, create a service file for systemd that calls netctl for the br0 interface. Put these contents in /etc/systemd/system/netctl@br0.service
.include /usr/lib/systemd/system/netctl@.service

[Unit]
Description=PiTether USB/Ethernet connection
BindsTo=sys-subsystem-net-devices-eth0.device
BindsTo=sys-subsystem-net-devices-usb0.device
After=sys-subsystem-net-devices-eth0.device
After=sys-subsystem-net-devices-usb0.device
Run the following command as root to enable the interface during start-up:

netctl enable br0

Reboot the Pi to make sure everything works as planned. To test:

  1. Plug in your phone and activate USB Tethering.
  2. Plug a device into the ethernet port of the Raspberry Pi
  3. Request a DHCP Lease (happens automatically on most devices)
  4. Try to browse the web or connect to something over the Internet (ping, ssh, etc)
As a finishing touch, I decided to make the entire filesystem read-only. This makes it so that the device can be safely powered off by simply unplugging it without any risk of corrupting the filesystem. I did this so that I never needed to SSH to it or hook up a console to safely shut it down. Since this is really a single-use project, this works pretty well. For more elaborate embedded-system work, I usually opt for a RAM disk configuration, but that's not needed here.

You can probably do this by sliding the write-protect tab on the SD card (for Pi A and B only) however, I opted to mark both filesystems "ro" in /etc/fstab. Apparently, root (/) is optional in fstab, but I added it by copying the /boot line and slightly altering the device and mountpoint fields. My /etc/fstab looks like this:
#
# /etc/fstab: static file system information
#
# file system   dir     type    options         dump    pass
/dev/mmcblk0p0  /       ext4    defaults,ro     0       0
/dev/mmcblk0p1  /boot   vfat    defaults,ro     0       0
You can give it one more reboot and test after that if you want. If you ever want to change anything in the filesystem, you can temporarily remount it read-write again by using the command "mount -o remount,rw /" while logged in as root. You can use that to remove ",ro" from the fstab options or to occasionally update packages.

2015-12-06

Raspberry Pi Zero in a USB Hub (Part 1)

I've had this USB Hub kicking around for a while. I like it because it came with a good power supply and it can handle things like 1-Watt USB Wi-Fi adapters, RTL-SDR receivers and USB-powered hard drives with ease. It's small enough to stash in my backpack.


As powered hubs go, this one isn't anything spectacular.You can probably do something similar if you find the right hub.

This hub's case popped open easily with just a spudger and some fingernails. I took the circuit board out and found a spot to get 5VDC near the power input port. I soldered some wire to a pad, and another wire to ground. I attached these to the +5V and ground rails through the Raspberry Pi Zero's GPIO header (Pins 4 and 6 respectively)

Next, I cut some notches in the plastic case for HDMI and the USB OTG cable. I'd like to eventually wire the USB directly to the hub's board, but that'll be for part 2. For now, I need a hole in the case for USB. Everything lines up nicely.

I used electrical tape to insulate the bottom of the Pi, and the top of the USB ports inside.

Some 3M double-sided mounting tape holds everything in place. Sorry for the blurry shot. I didn't review some of these photos until everything was stuck back together.

With the cover snapped on, it almost looks like a normal USB hub. In fact, as pictured, it would still work like one, with a Raspberry Pi whirring away silently inside, hooked up to nothing other than power (which it can also get from USB without the DC power supply.)

I have a Logitech wireless keyboard/mouse and a USB WiFi adapter plugged in. This is pretty much the bare minimum to get a Pi onto the Internet and usable. 


Since I haven't gotten USB hooked up inside the case (I'll need some fine wire, a really good SMD soldering iron and a steady hand to attempt that), I still have to hook the Pi's USB OTG port on the front to the USB port on the back of the hub.

Not terribly elegant, but it works.





That's pretty much all there is to it.  Plug in the Mini-HDMI cable and the power supply and watch it go. You've got a computer that's better than anything I had in the early 2000s in something roughly the size of a pack of gum, and you'll have a decent number of USB ports to work with, too!



2015-10-17

"USB Killer" Hype

This week, there was lots of fuss about the latest generation of "USB Killer" hype. I won't link to any articles. The device looks like a USB flash drive but overvolts and reportedly bricks computers. It was announced back in March. The "2.0" version was announced recently, and the hype is back.

Here's my take:

Since the chances of running into one of these in the wild are virtually nil, I think the real lessons here are not to leave your computer unattended, and not to let strangers plug things into your computer. These are more useful security measures than refusal to plug in a stray USB stick.  These actions also defend against more attacks (e.g. evil maid, Thunderstrike, data extraction and others, not to mention outright theft of the computer.)

There are only a few extant devices in a "thumb drive" form-factor that are engineered to fry the logic board of whatever you plug it into. The people who have these devices (those who made them) probably won't leave them laying around. I know I wouldn't. They're expensive to build and re-usable. If I were up to no good, I'd want to be the one to plug it into something. Then, I'd take it out and move to the next target.

Until this class of device sees commercial availability, we all have much more nefarious things to be concerned about. In that case, prying the case off of a suspicious USB device might not be a bad idea. You wouldn't see a bank of large surface-mount capacitors taking up most of the space in a real flash drive.