# OpenMTC systemd integration
In addition to SysV init scripts, OpenMTC is providing ready-to-use service files for the [systemd](https://freedesktop.org/wiki/Software/systemd/) init system.

> **ℹ️ Hint:** As OpenMTC does not require privileged ports in order to function, it can be safely run from within a user's home directory. To do so, replace `sudo systemctl` with `systemctl --user`. It should bear mentioning that this is a convenience option for developers that is strongly discouraged for production.

## Installing Service Files
Please refrain from copying or editing the provided files. Instead, change into the root of the openmtc repository and proceed as follows:
```sh
$ sudo systemctl link $(pwd)/openmtc-gevent/etc/systemd/system/openmtc-*.service
```
This should provide you with two new services in the systemd search path: `openmtc-gateway` and `openmtc-backend`. Confirm this by executing `sudo systemctl status openmtc-\*`.

## Adjusting `ExecStart`
By default, the service files will assume to find the start scripts to be located in `/usr/local/bin`. Chances are, this may not be the case. This is how to adjust the service files properly:
```sh
$ sudo systemctl edit openmtc-gateway
```
An editor is going to open. Fill the presented file with the following content:
```ini
[Service]
# Clear user and group
User=
Group=
# This is needed to reset ExecStart before reassigning
ExecStart=
# Change to location on your system
ExecStart=/opt/openmtc-gevent/bin/run-gateway
```
Save the file and exit the editor. Run `sudo systemctl daemon-reload` and verify the new value got picked up by executing `sudo systemctl show --property=ExecStart --no-pager openmtc-gateway `.

The procedure above is identical for the `openmtc-backend` component, safe for replacing `gateway` with `backend`.

## Controlling the Services
Both, gateway and backend, can be started through `sudo systemctl start openmtc-gateway` and `sudo systemctl start openmtc-backend`, respectively. They can also be started in bulk via `sudo systemctl start openmtc-gateway openmtc-backend`. Execution order is not guaranteed, though.

If you always require the two services, it may be a good idea to add a dependency from the gateway to the backend as follows:
```sh
$ sudo systemctl add-requires openmtc-gateway.service openmtc-backend
```
> **⚠️ Caveat:** Please take note that the target unit name is fully specified. This is needed as systemd would otherwise assume you wanted to add a requirement to a *target*

Verify the dependency has been set in place by running `sudo systemctl list-dependencies openmtc-gateway` and checking if `openmtc-gateway.service` is listed. Starting the `openmtc-gateway` service will now also invoke `openmtc-backend`. Another benefit is that `openmtc-gateway` will be reloaded if `openmtc-backend` is.

Services can be shut down through `sudo systemctl stop` in the same fashion as `systemctl start`.

## Monitoring
While `systemctl status` may reveal some log lines, more telling output generated by the services can be monitored through [`journalctl`](https://www.freedesktop.org/software/systemd/man/journalctl.html). `sudo journalctl -lf --unit openmtc-\*` should present a life feed of all running openmtc services.

> **ℹ️ Hint:** The road is a bit rough for those who run OpenMTC via systemd from their homedir, unfortunately. In theory, you should be good to go with `journalctl -lf --user --unit openmtc-\*`. But due to a lot of diversity in deployed systemd versions potentised by a wealth of different configurations, this may not do the trick. In that case, - under the assumption only a single instance of each, gateway and backend is running - the fastest way to success may be this:
  ```sh
  $ sudo journalctl -lf _PID=$(ps ux | grep gateway_main.py | head -n1 | awk '{ print $2; }') + \
                        _PID=$(ps ux | grep backend_main.py | head -n1 | awk '{ print $2; }')
  ``` 