about summary refs log tree commit diff
path: root/whispers/services/finance.scm
diff options
context:
space:
mode:
Diffstat (limited to 'whispers/services/finance.scm')
-rw-r--r--whispers/services/finance.scm283
1 files changed, 283 insertions, 0 deletions
diff --git a/whispers/services/finance.scm b/whispers/services/finance.scm
new file mode 100644
index 0000000..dd20248
--- /dev/null
+++ b/whispers/services/finance.scm
@@ -0,0 +1,283 @@
+;;; Whispers --- Stealth VPN and ssh tunneler
+;;; Copyright © 2023 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 finance)
+  #:use-module (guix gexp)
+  #:use-module (guix records)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd)
+  #:use-module (gnu services admin)
+  #:use-module (gnu packages finance)
+  #:export (bitcoin-configuration
+            bitcoin-service-type
+            bitcoin-configuration?
+            bitcoin-service-type
+            monero-configuration
+            monero-service-type
+            monero-configuration?
+            monero-service-type))
+
+(define-record-type* <bitcoin-configuration>
+  bitcoin-configuration make-bitcoin-configuration
+  bitcoin-configuration?
+  this-bitcoin-configuration
+  ;; A file-like object
+  (bitcoin-package      bitcoin-configuration-bitcoin-package
+                        (default bitcoin-core))
+  ;; A string
+  (user                 bitcoin-configuration-user
+                        (default "johndoe"))
+  ;; A boolean value
+  (walletdir-opt?       bitcoin-configuration-walletdir-opt?
+                        (default #f))
+  ;; A string
+  (walletdir            bitcoin-configuration-walletdir
+                        (default ""))
+  ;; A boolean value
+  (proxy-opt?           bitcoin-configuration-proxy-opt?
+                        (default #f))
+  ;; A string
+  (proxy                bitcoin-configuration-proxy
+                        (default ""))
+  ;; A string
+  (pid                  bitcoin-configuration-pid
+                        (default ""))
+  ;; A string
+  (log-folder           bitcoin-configuration-log-folder
+                        (default "/var/run"))
+  ;; A string
+  (log-file-name        bitcoin-configuration-log-file-name
+                        (default "bitcoin.log"))
+  ;; A boolean value
+  (%auto-start?         bitcoin-configuration-auto-start?
+                        (default #t)))
+
+(define-record-type* <monero-configuration>
+  monero-configuration make-monero-configuration
+  monero-configuration?
+  this-monero-configuration
+  ;; A file-like object
+  (monero-package        monero-configuration-monero-package
+                         (default monero))
+  ;; A string
+  (user                  monero-configuration-user
+                         (default "johndoe"))
+  ;; A boolean value
+  (proxy-opt?            monero-configuration-proxy-opt?
+                         (default #f))
+  ;; A string
+  (proxy                 monero-configuration-proxy
+                         (default ""))
+  ;; A boolean value
+  (tx-proxy-opt?         monero-configuration-tx-proxy-opt?
+                         (default #f))
+  ;; A string
+  (tx-proxy              monero-configuration-tx-proxy
+                         (default ""))
+  ;; A boolean value
+  (prune-blockchain-opt? monero-configuration-prune-blockchain-opt?
+                         (default #f))
+  ;; A string
+  (pidfile               monero-configuration-pidfile
+                         (default ""))
+  ;; An integer
+  (pid-file-timeout      monero-configuration-pid-file-timeout
+                         (default 5))
+  ;; A string
+  (log-folder            monero-configuration-log-folder
+                         (default "/var/run"))
+  ;; A string
+  (stdout-log-file-name  monero-configuration-stdout-log-file-name
+                         (default "monero.log"))
+  ;; A string
+  (monero-log-file-name  monero-configuration-monero-log-file-name
+                         (default "bitmonero.log"))
+  ;; A boolean value
+  (%auto-start?          monero-configuration-auto-start?
+                         (default #t)))
+
+(define (bitcoin-log-file-path config)
+  "Returns a string specifying the path to the log file of a bitcoin
+node service configurable by CONFIG, a record of the
+<bitcoin-configuration> type."
+  (string-append (bitcoin-configuration-log-folder config)
+                 "/"
+                 (bitcoin-configuration-log-file-name config)))
+
+(define (bitcoin-log-rotation config)
+  "Returns a list of log-rotation records specifying how to rotate the
+logs of a bitvoin node service configurable by CONFIG, a record of the
+<bitcoin-configuration> type."
+  (list (log-rotation (frequency 'daily)
+                      (files `(,(bitcoin-log-file-path config))))))
+
+(define (bitcoin-constructor-gexp config)
+  "Returns a G-exp to a procedure starting a bitcoin node daemon,
+configurable by CONFIG, a record of the <bitcoin-configuration> type."
+  (let ((bitcoin-package (bitcoin-configuration-bitcoin-package config))
+        (user (bitcoin-configuration-user config))
+        (walletdir-opt? (bitcoin-configuration-walletdir-opt? config))
+        (walletdir (bitcoin-configuration-walletdir config))
+        (proxy-opt? (bitcoin-configuration-proxy-opt? config))
+        (proxy (bitcoin-configuration-proxy config))
+        (pid-file-path (bitcoin-configuration-pid config))
+        (log-file-path (bitcoin-log-file-path config)))
+    #~(make-forkexec-constructor
+       (append (list #$(file-append bitcoin-package
+                                    "/bin/bitcoind")
+                     (string-append "-datadir="
+                                    (passwd:dir (getpwnam #$user))
+                                    "/.bitcoin"))
+               (if #$walletdir-opt?
+                   (list (string-append "-walletdir="
+                                        #$walletdir))
+                   (list))
+               (if #$proxy-opt?
+                   (list (string-append "-proxy="
+                                        #$proxy))
+                   (list))
+               (list (string-append "-pid="
+                                        #$pid-file-path)))
+       #:pid-file
+       #$pid-file-path
+       #:log-file
+       #$log-file-path)))
+
+(define (bitcoin-shepherd-services config)
+  "Returns a list of shepherd services handling a bitcoin node
+configured by CONFIG, a record of the <bitcoin-configuration> type."
+  (let ((auto-start? (bitcoin-configuration-auto-start? config)))
+    (list
+     (shepherd-service
+      (documentation "Bitcoin node")
+      (provision '(bitcoin))
+      (requirement '())
+      (start (bitcoin-constructor-gexp config))
+      (stop #~(make-kill-destructor))
+      (auto-start? auto-start?)))))
+
+(define bitcoin-service-type
+  (service-type
+   (name 'bitcoin)
+   (description "Bitcoin node service")
+   (extensions
+    (list (service-extension shepherd-root-service-type
+                             bitcoin-shepherd-services)
+          (service-extension rottlog-service-type
+                             bitcoin-log-rotation)
+          (service-extension
+           profile-service-type
+           (lambda (config)
+             (list (bitcoin-configuration-bitcoin-package config))))))
+   (default-value (bitcoin-configuration))))
+
+(define (stdout-monero-log-file-path config)
+  "Returns a string specifying the path to the log file of the standard
+output of a monero node service configurable by CONFIG, a record of the
+<monero-configuration> type."
+  (string-append (monero-configuration-log-folder config)
+                 "/"
+                 (monero-configuration-stdout-log-file-name config)))
+
+(define (monero-log-file-path config)
+  "Returns a string specifying the path to the log file of a monero node
+service configurable by CONFIG, a record of the <monero-configuration>
+type."
+  (string-append (monero-configuration-log-folder config)
+                 "/"
+                 (monero-configuration-monero-log-file-name config)))
+
+(define (monero-log-rotation config)
+  "Returns a list of log-rotation records specifying how to rotate the
+logs of a monero node service configurable by CONFIG, a record of
+the <monero-configuration> type."
+  (list (log-rotation (frequency 'daily)
+                      (files `(,(monero-log-file-path config))))
+        (log-rotation (frequency 'daily)
+                      (files `(,(stdout-monero-log-file-path config))))))
+
+(define (monero-constructor-gexp config)
+  "Returns a G-exp to a procedure starting a monero node daemon,
+configurable by CONFIG, a record of the <monero-configuration> type."
+  (let ((monero-package (monero-configuration-monero-package config))
+        (user (monero-configuration-user config))
+        (proxy-opt? (monero-configuration-proxy-opt? config))
+        (proxy (monero-configuration-proxy config))
+        (tx-proxy-opt? (monero-configuration-tx-proxy-opt? config))
+        (tx-proxy (monero-configuration-tx-proxy config))
+        (pid-file-path (monero-configuration-pidfile config))
+        (prune? (monero-configuration-prune-blockchain-opt? config))
+        (pid-file-timeout (monero-configuration-pid-file-timeout config))
+        (log-file-path ( monero-log-file-path config))
+        (stdout-log-file-path (stdout-monero-log-file-path config)))
+    #~(make-forkexec-constructor
+       (append (list #$(file-append monero-package
+                                    "/bin/monerod")
+                     "--data-dir"
+                     (string-append (passwd:dir (getpwnam #$user))
+                                    "/.bitmonero"))
+               (if #$proxy-opt?
+                   (list "--proxy"
+                         #$proxy)
+                   (list))
+               (if #$tx-proxy-opt?
+                   (list "--tx-proxy"
+                         #$tx-proxy)
+                   (list))
+               (if #$prune?
+                   (list "--prune-blockchain")
+                   (list))
+               (list "--detach"
+                     "--pid"
+                     #$pid-file-path
+                     "--log-file"
+                     #$log-file-path))
+       #:pid-file
+       #$pid-file-path
+       #:pid-file-timeout
+       #$pid-file-timeout
+       #:log-file
+       #$stdout-log-file-path)))
+
+(define (monero-shepherd-services config)
+  "Returns a list of shepherd services handling a monero node
+configured by CONFIG, a record of the <monero-configuration> type."
+  (let ((auto-start? (monero-configuration-auto-start? config)))
+    (list
+     (shepherd-service
+      (documentation "Monero node")
+      (provision '(monero))
+      (requirement '())
+      (start (monero-constructor-gexp config))
+      (stop #~(make-kill-destructor))
+      (auto-start? auto-start?)))))
+
+(define monero-service-type
+  (service-type
+   (name 'monero)
+   (description "Monero node service")
+   (extensions
+    (list (service-extension shepherd-root-service-type
+                             monero-shepherd-services)
+          (service-extension rottlog-service-type
+                             monero-log-rotation)
+          (service-extension
+           profile-service-type
+           (lambda (config)
+             (list (monero-configuration-monero-package config))))))
+   (default-value (monero-configuration))))