#+TITLE: =systemd= services and timers #+SETUPFILE: ./setup/org-setup-file.org 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 :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/braingit.service :header-args+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf [Unit] Description=Sync Brain Website everyday RefuseManualStart=no RefuseManualStop=yes [Service] Type=oneshot ExecStart=%h/.local/bin/brain_git_push #+END_SRC ** Timer :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/braingit.timer :header-args+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf [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 #+END_SRC ** Script :PROPERTIES: :header-args: :tangle ~/.local/bin/brain_git_push :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env bash" :END: #+begin_src bash cd ~/Cloud/programming/brain-website/ if [[ ! -z $(git status -s content/) ]] then git add content static && \ git commit -m "Update Content - $(date +%F)" && \ git push exit fi #+end_src * =checkmail= - Check new mails ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/checkmail.service :header-args+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf [Unit] Description=Check new mails RefuseManualStart=no RefuseManualStop=yes [Service] Type=oneshot ExecStart=%h/.local/bin/checkmail -q #+END_SRC ** Timer :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/checkmail.timer :header-args+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf [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 #+END_SRC ** Script :PROPERTIES: :header-args: :tangle ~/.local/bin/checkmail :header-args+: :comments both :mkdirp yes :header-args+: :shebang "#!/usr/bin/env bash" :END: #+begin_src bash 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 # ============================================================= #+end_src * =syncmail= - Synchronize all mails ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/syncmail.service :header-args+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf [Unit] Description=Sync all mails RefuseManualStart=no RefuseManualStop=yes [Service] Type=oneshot ExecStart=%h/.local/bin/checkmail -a -q #+END_SRC ** Timer :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/syncmail.timer :header-args+: :comments both :mkdirp yes :END: #+BEGIN_SRC conf [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 #+END_SRC * =vdirsyncer= - Synchronize calendar and contacts ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/vdirsyncer.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [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 #+end_src ** Timer :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/vdirsyncer.timer :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [Unit] Description=Synchronize vdirs [Timer] OnBootSec=5m OnUnitActiveSec=15m AccuracySec=5m [Install] WantedBy=timers.target #+end_src * TODO =ssh-agent= - SSH Agent ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/ssh-agent.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [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 #+end_src * TODO =emacs= - Emacs ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/emacs.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [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 #+end_src * TODO =trash-empty= - Empty the trash for files older than 30 days ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/trash-empty.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [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 #+end_src ** Timer :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/trash-empty.timer :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [Unit] Description=Empty trash [Timer] OnCalendar=*-*-* 16:00:00 Persistent=true Unit=trash-empty [Install] WantedBy=timers.target #+end_src * =syncthing= ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/syncthing.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [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 #+end_src * =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 :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/homelab-tunnel.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [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 #+end_src * =esrf-tunnel= - SSH Tunnel ** Service :PROPERTIES: :header-args: :tangle ~/.config/systemd/user/esrf-tunnel.service :header-args+: :comments both :mkdirp yes :END: #+begin_src conf [Unit] Description=Setup a secure tunnel with ESRF After=network.target [Service] ExecStart=/usr/bin/ssh -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -D 8081 -q -N -T rnice.esrf.fr # Restart every >2 seconds to avoid StartLimitInterval failure RestartSec=5 Restart=always [Install] WantedBy=default.target #+end_src