Here are two examples in the HomeAssistant container.
1. The HA container needs to talk to a USB dongle elsewhere in the building. It does so using USBIP, and I discussed how to make it work in this previous post.
2. I want the HA container to display some performance data about the host (uptime, RAM used, similar excitements). Of course, it's a container, so it simply cannot do that natively without using lots of jiggerypokery to escape the container. Instead, a script collects the information and pushes the information into the container every few minutes.
$ sudo lxc file push /path/to/host/file.json container-name/path/to/container/
Easy enough, right.
Well, not quite. Home Assistant, when installed, creates a non-root user, and puts all of it's files in a subdirectory. Add another directory to keep things simple, and you get:
/home/homeassistant/.homeassistant/external_files/
And, unfortunately, all those subdirectories are owned by a non-root user. So lxc cannot 'push' all the way into them (result: permission error).
-rw-r--r-- 1 root root 154 Feb 19 15:34 file.json
The pushed file can only be pushed to in the wrong location, and gets there with the wrong ownership.
Systemd to the rescue: Let's create a systemd job on the container that listens for a push, then fixes the location and the ownership.
The feature is called a systemd.path.
Like a systemd timer it consists of two parts, a trigger (.path) and a service that gets triggered.
The .path file is very simple. Here's what I used for the trigger:
[Unit] # /etc/systemd/system/server_status.path Description=Listener for a new server status file [Path] PathModified=/home/homeassistant/.homeassistant/file.json [Install] WantedBy=multi-user.target
The service file is almost as simple. Here's what I used:
[Unit] # /etc/systemd/system/server_status.service Description=Move and CHOWN the server status file [Service] Type=oneshot User=root ExecStartPre=mv /home/homeassistant/.homeassistant/file.json /home/homeassistant/.homeassistant/external_files/ ExecStart=chown homeassistant:homeassistant /home/homeassistant/.homeassistant/external_files/file.json [Install] WantedBy=multi-user.target
Finally, enable and start the path (not the service)
sudo systemctl daemon-reload sudo systemctl enable server_status.path sudo systemctl start server_status.path
No comments:
Post a Comment