X-Loop: help-debbugs@HIDDEN Subject: [bug#76169] home: Add home-restic-backup service. Resent-From: paul <goodoldpaul@HIDDEN> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> Resent-CC: guix-patches@HIDDEN Resent-Date: Mon, 10 Feb 2025 00:06:01 +0000 Resent-Message-ID: <handler.76169.B.173914592931586 <at> debbugs.gnu.org> Resent-Sender: help-debbugs@HIDDEN X-GNU-PR-Message: report 76169 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: To: 76169 <at> debbugs.gnu.org X-Debbugs-Original-To: guix-patches@HIDDEN Received: via spool by submit <at> debbugs.gnu.org id=B.173914592931586 (code B ref -1); Mon, 10 Feb 2025 00:06:01 +0000 Received: (at submit) by debbugs.gnu.org; 10 Feb 2025 00:05:29 +0000 Received: from localhost ([127.0.0.1]:46920 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1thHIm-0008DM-JN for submit <at> debbugs.gnu.org; Sun, 09 Feb 2025 19:05:28 -0500 Received: from lists.gnu.org ([2001:470:142::17]:41894) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <goodoldpaul@HIDDEN>) id 1thHIk-0008D1-QG for submit <at> debbugs.gnu.org; Sun, 09 Feb 2025 19:05:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <goodoldpaul@HIDDEN>) id 1thHIY-0002cB-Sa for guix-patches@HIDDEN; Sun, 09 Feb 2025 19:05:15 -0500 Received: from confino.investici.org ([2a11:7980:1::2:0]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <goodoldpaul@HIDDEN>) id 1thHIW-0005al-Ox for guix-patches@HIDDEN; Sun, 09 Feb 2025 19:05:14 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1739145899; bh=xpChnk9gNSBKQT8leBcCgPhrZiP2UAKE//e+nT6GLJU=; h=Date:To:From:Subject:From; b=ih1G8vYMnFeRGkAJnhkogebFiUqDB8FPkbx5480yF116RdPC42YPD82Ok+84z/h+/ IgG1Z8Xu+DHR8eib4iBJGOi9qU72JFU3Notz6RaA82l6xBqJryGWEPcJhNd5rmwZIk vBjabyOK5Q/8zQQDXNJLlRQeY9FAjU5EETTlhqAk= Received: from mx1.investici.org (unknown [127.0.0.1]) by confino.investici.org (Postfix) with ESMTP id 4YrlFR1K1Cz111Q for <guix-patches@HIDDEN>; Mon, 10 Feb 2025 00:04:59 +0000 (UTC) Received: from [93.190.126.19] (mx1.investici.org [93.190.126.19]) (Authenticated sender: goodoldpaul@HIDDEN) by localhost (Postfix) with ESMTPSA id 4YrlFR0nn2z110C for <guix-patches@HIDDEN>; Mon, 10 Feb 2025 00:04:59 +0000 (UTC) Message-ID: <76d82b80-722b-46de-8791-d6a19def8c85@HIDDEN> Date: Mon, 10 Feb 2025 01:04:58 +0100 MIME-Version: 1.0 User-Agent: Icedove Daily Content-Language: en-US From: paul <goodoldpaul@HIDDEN> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Received-SPF: pass client-ip=2a11:7980:1::2:0; envelope-from=goodoldpaul@HIDDEN; helo=confino.investici.org X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 0.9 (/) X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.1 (/) Hi Guix, I'm sending a patch implementing a Home service for the restic-backup-service-type. This patch depends on https://issues.guix.gnu.org/72803 . Thank you for your work! giacomo
Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 X-Loop: help-debbugs@HIDDEN From: help-debbugs@HIDDEN (GNU bug Tracking System) To: paul <goodoldpaul@HIDDEN> Subject: bug#76169: Acknowledgement (home: Add home-restic-backup service.) Message-ID: <handler.76169.B.173914592931586.ack <at> debbugs.gnu.org> References: <76d82b80-722b-46de-8791-d6a19def8c85@HIDDEN> X-Gnu-PR-Message: ack 76169 X-Gnu-PR-Package: guix-patches Reply-To: 76169 <at> debbugs.gnu.org Date: Mon, 10 Feb 2025 00:06:02 +0000 Thank you for filing a new bug report with debbugs.gnu.org. This is an automatically generated reply to let you know your message has been received. Your message is being forwarded to the package maintainers and other interested parties for their attention; they will reply in due course. Your message has been sent to the package maintainer(s): guix-patches@HIDDEN If you wish to submit further information on this problem, please send it to 76169 <at> debbugs.gnu.org. Please do not send mail to help-debbugs@HIDDEN unless you wish to report a problem with the Bug-tracking system. --=20 76169: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D76169 GNU Bug Tracking System Contact help-debbugs@HIDDEN with problems
X-Loop: help-debbugs@HIDDEN Subject: [bug#76169] [PATCH] home: Add home-restic-backup service. References: <76d82b80-722b-46de-8791-d6a19def8c85@HIDDEN> In-Reply-To: <76d82b80-722b-46de-8791-d6a19def8c85@HIDDEN> Resent-From: Giacomo Leidi <goodoldpaul@HIDDEN> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> Resent-CC: andrew@HIDDEN, janneke@HIDDEN, ludo@HIDDEN, maxim.cournoyer@HIDDEN, tanguy@HIDDEN, guix-patches@HIDDEN Resent-Date: Mon, 10 Feb 2025 00:08:02 +0000 Resent-Message-ID: <handler.76169.B76169.173914605231860 <at> debbugs.gnu.org> Resent-Sender: help-debbugs@HIDDEN X-GNU-PR-Message: followup 76169 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: To: 76169 <at> debbugs.gnu.org Cc: Giacomo Leidi <goodoldpaul@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> X-Debbugs-Original-Xcc: Andrew Tropin <andrew@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> Received: via spool by 76169-submit <at> debbugs.gnu.org id=B76169.173914605231860 (code B ref 76169); Mon, 10 Feb 2025 00:08:02 +0000 Received: (at 76169) by debbugs.gnu.org; 10 Feb 2025 00:07:32 +0000 Received: from localhost ([127.0.0.1]:46934 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1thHKl-0008Ho-H7 for submit <at> debbugs.gnu.org; Sun, 09 Feb 2025 19:07:32 -0500 Received: from confino.investici.org ([93.190.126.19]:20075) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <goodoldpaul@HIDDEN>) id 1thHKh-0008Ha-Aa for 76169 <at> debbugs.gnu.org; Sun, 09 Feb 2025 19:07:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1739146045; bh=eC4oukd9SZzDOVNKbcRFycPV70B3SPnn2nMr5ZFASZQ=; h=From:To:Cc:Subject:Date:From; b=qnZZvxl/Ao4sBAJ6v/sCvoWhvm/qCBh1/EKbkIgxUYUA9C64eGklS3tsA1f/6S5nJ 8TiJOrR3fB93ZLOmnA3CbOV5u3y4Y/Ir71/bzMuOVfBy2ASMuNS+f6O7abgdLbkZWy 9P16WElGoRMxvzddILtgJ/3Zs8pwMedhN57Dhhts= Received: from mx1.investici.org (unknown [127.0.0.1]) by confino.investici.org (Postfix) with ESMTP id 4YrlJF5s0Wz110V; Mon, 10 Feb 2025 00:07:25 +0000 (UTC) Received: from [93.190.126.19] (mx1.investici.org [93.190.126.19]) (Authenticated sender: goodoldpaul@HIDDEN) by localhost (Postfix) with ESMTPSA id 4YrlJF4spBz110G; Mon, 10 Feb 2025 00:07:25 +0000 (UTC) From: Giacomo Leidi <goodoldpaul@HIDDEN> Date: Mon, 10 Feb 2025 01:06:42 +0100 Message-ID: <d2544a068e6751d3983e0a58950cde674cadae13.1739146002.git.goodoldpaul@HIDDEN> X-Mailer: git-send-email 2.48.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.7 (-) * gnu/home/services/backup.scm: New file. * gnu/local.mk: Add this. * doc/guix.texi: Document this. Change-Id: Ied1c0a5756b715fba176a0e42ea154246089e6be --- doc/guix.texi | 49 ++++++++++++++++ gnu/home/services/backup.scm | 107 +++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + 3 files changed, 157 insertions(+) create mode 100644 gnu/home/services/backup.scm diff --git a/doc/guix.texi b/doc/guix.texi index 86582fb4785..f8ad6769306 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -462,6 +462,7 @@ Top * GPG: GNU Privacy Guard. Setting up GPG and related tools. * Desktop: Desktop Home Services. Services for graphical environments. * Guix: Guix Home Services. Services for Guix. +* Backup: Backup Home Services. Services for backing up User's files. * Fonts: Fonts Home Services. Services for managing User's fonts. * Sound: Sound Home Services. Dealing with audio. * Mail: Mail Home Services. Services for managing mail. @@ -46729,6 +46730,7 @@ Home Services * GPG: GNU Privacy Guard. Setting up GPG and related tools. * Desktop: Desktop Home Services. Services for graphical environments. * Guix: Guix Home Services. Services for Guix. +* Backup: Backup Home Services. Services for backing up User's files. * Fonts: Fonts Home Services. Services for managing User's fonts. * Sound: Sound Home Services. Dealing with audio. * Mail: Mail Home Services. Services for managing mail. @@ -48275,6 +48277,53 @@ Guix Home Services @end lisp @end defvar +@node Backup Home Services +@subsection Backup Home Services + +The @code{(gnu services backup)} module offers services for backing up +file system trees. For now, it provides the @code{restic-backup-service-type}. + +With @code{restic-backup-service-type}, you can periodically back up +directories and files with @uref{https://restic.net/, Restic}, which +supports end-to-end encryption and deduplication. Consider the +following configuration: + +@lisp +(use-modules (gnu services backup) ;for 'restic-backup-job' and 'restic-backup-configuration' + (gnu home services backup) ;for 'restic-backup-service-type' + (gnu packages sync) ;for 'rclone' + @dots{}) + +(home-environment + + (packages (list rclone ;for use by restic + @dots{})) + (services + (list + (service home-restic-backup-service-type + (restic-backup-configuration + (jobs + (list (restic-backup-job + (name "remote-ftp") + (repository "rclone:remote-ftp:backup/restic") + (password-file "/home/alice/.restic") + ;; Every day at 23. + (schedule "0 23 * * *") + (files '("/home/alice/.restic" + "/home/alice/.config/rclone" + "/home/alice/Pictures")))))))))) +@end lisp + +You can refer to @pxref{Miscellaneous Services, +@code{restic-backup-service-type}} for details about +@code{restic-backup-configuration} and @code{restic-job-configuration}. +The only difference is that the @code{home-restic-backup-service-type} +will ignore the @code{user} and @code{group} field of +@code{restic-job-configuration}. + +It will also install the @command{restic-guix} package to the user's Home +profile. + @node Fonts Home Services @subsection Fonts Home Services diff --git a/gnu/home/services/backup.scm b/gnu/home/services/backup.scm new file mode 100644 index 00000000000..421737eef74 --- /dev/null +++ b/gnu/home/services/backup.scm @@ -0,0 +1,107 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2025 Giacomo Leidi <goodoldpaul@HIDDEN> +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix 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. +;;; +;;; GNU Guix 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 GNU Guix. If not, see <http://www.gnu.org/licenses/>. + +(define-module (gnu home services backup) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (gnu services) + #:use-module (gnu services backup) + #:use-module (gnu services configuration) + #:use-module (gnu home services) + #:use-module (gnu home services shepherd) + #:use-module (srfi srfi-1) + #:export (home-restic-backup-service-type)) + +(define (home-restic-job-log-file job) + (let ((name (restic-backup-job-name job)) + (log-file (restic-backup-job-log-file job))) + (and (maybe-value-set? log-file) log-file))) + +(define (restic-backup-job->home-shepherd-service config) + (let ((schedule (restic-backup-job-schedule config)) + (name (restic-backup-job-name config)) + (files (restic-backup-job-files config)) + (max-duration (restic-backup-job-max-duration config)) + (wait-for-termination? (restic-backup-job-wait-for-termination? config)) + (log-file (home-restic-job-log-file config)) + (requirement (restic-backup-job-requirement config))) + (shepherd-service (provision `(,(string->symbol name))) + (requirement + `(,@requirement)) + (documentation + "Run @code{restic} backed backups on a regular basis.") + (modules '((shepherd service timer) + ;;for %user-log-dir + (shepherd support))) + (start + #~(make-timer-constructor + (if (string? #$schedule) + (cron-string->calendar-event #$schedule) + #$schedule) + (command + (list + "restic-guix" "backup" #$name #$@files)) + #:log-file (if (string? #$log-file) + #$log-file + (string-append %user-log-dir "/restic-backup/" #$name ".log")) + #:wait-for-termination? #$wait-for-termination? + #:max-duration #$(and (maybe-value-set? max-duration) + max-duration))) + (stop + #~(make-timer-destructor)) + (actions (list (shepherd-action + (name 'trigger) + (documentation "Manually trigger a backup, +without waiting for the scheduled time.") + (procedure #~trigger-timer))))))) + +(define (home-restic-backup-activation config) + #~(begin + (use-modules (shepherd support)) + (mkdir-p (string-append %user-log-dir "/restic-backup/")) + (for-each + (lambda (log-file) + (when (string? log-file) + (mkdir-p (dirname log-file)))) + (list #$@(map home-restic-job-log-file + (restic-backup-configuration-jobs config)))))) + +(define home-restic-backup-service-type + (service-type (name 'home-restic-backup) + (extensions + (list + (service-extension home-activation-service-type + home-restic-backup-activation) + (service-extension home-profile-service-type + restic-backup-service-profile) + (service-extension home-shepherd-service-type + (lambda (config) + (map restic-backup-job->home-shepherd-service + (restic-backup-configuration-jobs + config)))))) + (compose concatenate) + (extend + (lambda (config jobs) + (restic-backup-configuration + (inherit config) + (jobs (append (restic-backup-configuration-jobs config) + jobs))))) + (default-value (restic-backup-configuration)) + (description + "This service configures Shepherd timers for running backups +with restic."))) diff --git a/gnu/local.mk b/gnu/local.mk index 117280fc11b..b78c6755f12 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -102,6 +102,7 @@ GNU_SYSTEM_MODULES = \ %D%/home.scm \ %D%/home/services.scm \ %D%/home/services/admin.scm \ + %D%/home/services/backup.scm \ %D%/home/services/desktop.scm \ %D%/home/services/dict.scm \ %D%/home/services/dotfiles.scm \ base-commit: a1fac696c4ef5e20d0412ec22ae6a0d77ea26682 -- 2.48.1
Received: (at control) by debbugs.gnu.org; 10 Feb 2025 00:10:45 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 09 19:10:45 2025 Received: from localhost ([127.0.0.1]:46949 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1thHNt-0008TF-40 for submit <at> debbugs.gnu.org; Sun, 09 Feb 2025 19:10:45 -0500 Received: from confino.investici.org ([93.190.126.19]:40609) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <goodoldpaul@HIDDEN>) id 1thHNr-0008T5-7q for control <at> debbugs.gnu.org; Sun, 09 Feb 2025 19:10:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=autistici.org; s=stigmate; t=1739146242; bh=N7zQoB/lm3ZJ1eCx9NKt3zuz5zkYvGIRA/GUFVQXAwc=; h=Date:To:From:Subject:From; b=EWiAKsE4BRtEg7CMf0V0URHKtKfWXPTyxYCZobBp2c8k9EPPJC8g8p6RK3dV+Zt23 wCnaEuiLPpoNwa8UsvJV9xYMAb4Nu5ohn84obilknP84yDoRqcRAW12hqM129jddTV 9DCu0jnbf++WHhYlVlf8Qa7x2uFOgeZtUI1OxMX0= Received: from mx1.investici.org (unknown [127.0.0.1]) by confino.investici.org (Postfix) with ESMTP id 4YrlN22Pdqz110V for <control <at> debbugs.gnu.org>; Mon, 10 Feb 2025 00:10:42 +0000 (UTC) Received: from [93.190.126.19] (mx1.investici.org [93.190.126.19]) (Authenticated sender: goodoldpaul@HIDDEN) by localhost (Postfix) with ESMTPSA id 4YrlN21tyRz110G for <control <at> debbugs.gnu.org>; Mon, 10 Feb 2025 00:10:42 +0000 (UTC) Message-ID: <ed23b5b6-b369-4c19-84a5-502c3d566742@HIDDEN> Date: Mon, 10 Feb 2025 01:10:41 +0100 MIME-Version: 1.0 User-Agent: Icedove Daily To: control <at> debbugs.gnu.org Content-Language: en-US From: paul <goodoldpaul@HIDDEN> Subject: block 76169 by 72803 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.7 (-) block 76169 by 72803
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.