aboutsummaryrefslogtreecommitdiff
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))))