literate-dotfiles/systemd.org

8.4 KiB

systemd services and timers

https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

braingit - Automatic commit and push new brain pages

Service

[Unit]
Description=Sync Brain Website everyday
RefuseManualStart=no
RefuseManualStop=yes

[Service]
Type=oneshot
ExecStart=%h/.local/bin/brain_git_push

Timer

[Unit]
Description=Sync Brain Website everyday
RefuseManualStart=no
RefuseManualStop=no
Wants=network-online.target
After=network-online.target

[Timer]
OnCalendar=*-*-* 16:00:00
Persistent=true
Unit=braingit.service

[Install]
WantedBy=default.target

Script

cd ~/Cloud/brain-website/

if [[ ! -z $(git status -s content/) ]]
then
    git add content static && \
        git commit -m "Update Content - $(date +%F)" && \
        git push
    exit
fi

checkmail - Check new mails

Service

[Unit]
Description=Check new mails
RefuseManualStart=no
RefuseManualStop=yes

[Service]
Type=oneshot
ExecStart=%h/.local/bin/checkmail -q

Timer

[Unit]
Description=Check Mail every x minutes
RefuseManualStart=no
RefuseManualStop=no
Wants=network-online.target
After=network-online.target
Requires=checkmail.service

[Timer]
Persistent=false
OnBootSec=2min
OnUnitActiveSec=5min
AccuracySec=2min
Unit=checkmail.service

[Install]
WantedBy=default.target

Script

while [ -n "$1" ]; do # while loop starts
    case "$1" in
    -a) opt_all='--all' ;; # Check All inboxes
    -v) opt_verbose='--verbose' ;; # Verbose
    -q) opt_quiet='--quiet' ;; # Quiet
    ,*) echo "Option $1 not recognized" ;; # In case you typed a different option
    esac
    shift
done


# =============================================================
# Count number of mails
gmail_old="$(ls ~/.mail/gmail/Inbox/new | wc -l)"
esrf_old="$(ls ~/.mail/esrf/Inbox/new | wc -l)"
# =============================================================

# =============================================================
# Retreive mails
mbsync $opt_all $opt_verbose gmail-Home esrf-Home 2>/tmp/mbsync.log
# =============================================================

# =============================================================
# Count number of mails
gmail_new="$(ls ~/.mail/gmail/Inbox/new | wc -l)"
esrf_new="$(ls ~/.mail/esrf/Inbox/new | wc -l)"
# =============================================================

# =============================================================
# Total Number of new mails since last checking
new="$(($esrf_new+$gmail_new))"
old="$(($esrf_old+$gmail_old))"
# =============================================================

# =============================================================
# Notification
if [ "$new" -gt 0 ]; then
  notify-send --hint=string:x-dunst-stack-tag:fV84ivMi 'Mails ' "$new new mail(s)"
fi
# =============================================================

# =============================================================
# Indexation and Tags
if pgrep -f 'mu server'; then
    emacsclient --eval '(mu4e-update-index)'
else
    mu index -m ~/.mail $opt_verbose $opt_quiet
fi
# =============================================================

syncmail - Synchronize all mails

Service

[Unit]
Description=Sync all mails
RefuseManualStart=no
RefuseManualStop=yes

[Service]
Type=oneshot
ExecStart=%h/.local/bin/checkmail -a -q

Timer

[Unit]
Description=Sync All Mails every x hours
RefuseManualStart=no
RefuseManualStop=no
Wants=network-online.target
After=network-online.target
Requires=syncmail.service

[Timer]
Persistent=false
OnBootSec=30min
OnUnitActiveSec=300min
AccuracySec=10min
Unit=syncmail.service

[Install]
WantedBy=default.target

vdirsyncer - Synchronize calendar and contacts

Service

[Unit]
Description=Synchronize calendars and contacts
Documentation=https://vdirsyncer.readthedocs.org/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/home/thomas/.local/bin/vdirsyncer --verbosity "ERROR" sync
Type=oneshot

Timer

[Unit]
Description=Synchronize vdirs

[Timer]
OnBootSec=5m
OnUnitActiveSec=15m
AccuracySec=5m

[Install]
WantedBy=timers.target

TODO ssh-agent - SSH Agent

Service

[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

TODO emacs - Emacs

Service

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

TODO trash-empty - Empty the trash for files older than 30 days

Service

[Unit]
Description=Empty the trash for files older than 30 days
Documentation=https://github.com/andreafrancia/trash-cli

[Service]
ExecStart=/home/thomas/.local/bin/trash-empty 30
Type=oneshot

Timer

[Unit]
Description=Empty trash

[Timer]
OnCalendar=*-*-* 16:00:00
Persistent=true
Unit=trash-empty

[Install]
WantedBy=timers.target

syncthing

Service

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target

[Service]
Environment="all_proxy=socks5://localhost:8080"
ExecStart=/usr/bin/syncthing -no-browser -gui-address="0.0.0.0:8384" -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

[Install]
WantedBy=default.target

homelab-tunnel - SSH Tunnel

Useful to bypass firewalls. This can we used on the browser:

  • for qutebrowser, use :set content.proxy socks5://localhost:8080 (can setup a shortcut for that)

This is also used for Syncthing.

Service

[Unit]
Description=Setup a secure tunnel with homelab
After=network.target

[Service]
ExecStart=/usr/bin/ssh -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -D 8080 -q -N -T homelab

# Restart every >2 seconds to avoid StartLimitInterval failure
RestartSec=5
Restart=always

[Install]
WantedBy=default.target