about summary refs log tree commit diff
path: root/whispers/services/gps.scm
diff options
context:
space:
mode:
authorRunciter2025-07-04 01:22:05 +0800
committerRunciter2025-07-04 01:22:05 +0800
commit5629c7d9dabf1d0415fb67f00c2d0368310e53ef (patch)
tree08fce46317bd6b19dfb393f36530eb449f76cf6c /whispers/services/gps.scm
downloadwhispers-5629c7d9dabf1d0415fb67f00c2d0368310e53ef.tar.gz
Initial.
A  .guix-authorizations
A  .guix-channel
A  COPYING
A  README
A  whispers/packages/dict.scm
A  whispers/packages/doc.scm
A  whispers/packages/pdf.scm
A  whispers/packages/sh.scm
A  whispers/packages/whispers.scm
A  whispers/services/console.scm
A  whispers/services/dict.scm
A  whispers/services/finance.scm
A  whispers/services/gps.scm
A  whispers/services/proton.scm
A  whispers/services/ssh-agent.scm
A  whispers/services/ssh-tunneler.scm
A  whispers/services/whispers.scm
A  whispers/services/whispers/finance.scm
A  whispers/services/whispers/gps.scm
A  whispers/services/whispers/mail.scm
A  whispers/services/whispers/ssh.scm
A  whispers/services/whispers/vpn.scm
A  whispers/services/whispers/xdg.scm
A  whispers/tests/ssh-tunneler.scm

Signed-off-by: Runciter <runciter@whispers-vpn.org>
Diffstat (limited to 'whispers/services/gps.scm')
-rw-r--r--whispers/services/gps.scm102
1 files changed, 102 insertions, 0 deletions
diff --git a/whispers/services/gps.scm b/whispers/services/gps.scm
new file mode 100644
index 0000000..5c1b33f
--- /dev/null
+++ b/whispers/services/gps.scm
@@ -0,0 +1,102 @@
+;;; Whispers --- Stealth VPN and ssh tunneler
+;;; Copyright © 2024 Runciter <runciter@whispers-vpn.org>
+;;;
+;;; This file is part of Whispers.
+;;;
+;;; Whispers is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Whispers is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Whispers.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (whispers services gps)
+  #:use-module (guix records)
+  #:use-module (guix gexp)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd)
+  #:use-module (gnu services admin)
+  #:use-module (gnu packages gps)
+  #:export (gpsd-configuration
+            gpsd-configuration?
+            gpsd-service-type))
+
+(define-record-type* <gpsd-configuration>
+  gpsd-configuration make-gpsd-configuration
+  gpsd-configuration?
+  this-gpsd-configuration
+  ;; A file-like object
+  (gpsd-package         gpsd-configuration-gpsd-package
+                        (default gpsd))
+  ;; A symbol
+  (provision            gpsd-configuration-provision
+                        (default (string->symbol
+                                  (string-append
+                                   "gpsd-"
+                                   (number->string
+                                    (gpsd-configuration-port
+                                     this-gpsd-configuration)))))
+                        (thunked))
+  ;; A string
+  (source               gpsd-configuration-source
+                        (default "/dev/ttyUSB0"))
+  ;; An integer
+  (port                 gpsd-configuration-port
+                        (default 2947))
+  ;; An integer
+  (listen-any?          gpsd-configuration-listen-any?
+                        (default #f))
+  ;; A boolean value
+  (%auto-start?          gpsd-configuration-auto-start?
+                         (default #t)))
+
+(define (constructor-gexp config)
+  "Returns a G-exp to start a gpsd shepherd service, configurable by
+CONFIG, a record of the <gpsd-configuration> type."
+  (let ((gpsd-package (gpsd-configuration-gpsd-package config))
+        (listen-any? (gpsd-configuration-listen-any? config))
+        (port (gpsd-configuration-port config))
+        (source (gpsd-configuration-source config)))
+    #~(make-forkexec-constructor (append (list #$(file-append gpsd-package
+                                                              "/sbin/gpsd")
+                                               "-N"
+                                               "-P"
+                                               #$(number->string port))
+                                         (if #$listen-any?
+                                             (list "-G")
+                                             (list))
+                                         (list #$source)))))
+
+(define (gpsd-shepherd-services config)
+  "Returns a list of shepherd services handling a gpsd daemon
+configured by CONFIG, a record of the <gpsd-configuration>
+type."
+  (let ((auto-start? (gpsd-configuration-auto-start? config)))
+    (list
+     (shepherd-service
+      (documentation (string-append "gpsd service."))
+      (provision (list (gpsd-configuration-provision config)))
+      (requirement '())
+      (start (constructor-gexp config))
+      (stop #~(make-kill-destructor))
+      (auto-start? auto-start?)))))
+
+(define gpsd-service-type
+  (service-type
+   (name 'gpsd)
+   (description "gpsd service")
+   (extensions
+    (list (service-extension shepherd-root-service-type
+                             gpsd-shepherd-services)
+          (service-extension
+           profile-service-type
+           (lambda (config)
+             (list
+              (gpsd-configuration-gpsd-package config))))))
+   (default-value (gpsd-configuration))))