* gnu/services/geoclue.scm: New file. * gnu-system.am (GNU_SYSTEM_MODULES): Add geoclue service. --- gnu-system.am | 1 + gnu/services/geoclue.scm | 117 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 gnu/services/geoclue.scm diff --git a/gnu-system.am b/gnu-system.am index f9befa7..59ee3fa 100644 --- a/gnu-system.am +++ b/gnu-system.am @@ -328,6 +328,7 @@ GNU_SYSTEM_MODULES = \ gnu/services/colord.scm \ gnu/services/dbus.scm \ gnu/services/dmd.scm \ + gnu/services/geoclue.scm \ gnu/services/lirc.scm \ gnu/services/networking.scm \ gnu/services/ssh.scm \ diff --git a/gnu/services/geoclue.scm b/gnu/services/geoclue.scm new file mode 100644 index 0000000..518577d --- /dev/null +++ b/gnu/services/geoclue.scm @@ -0,0 +1,117 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2014, 2015 Ludovic Courtès +;;; Copyright © 2015 Andy Wingo +;;; +;;; 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 . + +(define-module (gnu services geoclue) + #:use-module (gnu services) + #:use-module (gnu system shadow) + #:use-module (gnu packages gnome) + #:use-module (ice-9 match) + #:use-module (guix monads) + #:use-module (guix store) + #:use-module (guix gexp) + #:export (geoclue-application + %standard-geoclue-applications + geoclue-service)) + +;;; Commentary: +;;; +;;; This module provides service definitions for the Geoclue location service. +;;; +;;; Code: + +(define (bool value) + (if value "true\n" "false\n")) + +(define* (geoclue-application name #:key (allowed? #t) system? (users '())) + "Configure default access permissions for an application. NAME is the +Desktop ID of the application, without the .desktop part. If ALLOWED? is +true, the application will have access to location information by default. +The boolean SYSTEM? value indicates that an application is a system component +or not. Finally USERS is a list of UIDs of all users for which this +application is allowed location info access. An empty users list means all +users are allowed." + (string-append + "[" name "]\n" + "allowed=" (bool allowed?) + "system=" (bool system?) + "users=" (string-join users ";") "\n")) + +(define %standard-geoclue-applications + (list (geoclue-application "gnome-datetime-panel" #:system? #t) + (geoclue-application "epiphany" #:system? #f) + (geoclue-application "firefox" #:system? #f))) + +(define* (configuration-file #:key whitelist wifi-geolocation-url + submit-data? wifi-submission-url submission-nick + applications) + "Return a geoclue configuration file." + (text-file "geoclue.conf" + (string-append + "[agent]\n" + "whitelist=" (string-join whitelist ";") "\n" + "[wifi]\n" + "url=" wifi-geolocation-url "\n" + "submit-data=" (bool submit-data?) + "submission-url=" wifi-submission-url "\n" + "submission-nick=" submission-nick "\n" + (string-join applications "\n")))) + +(define* (geoclue-service #:key (geoclue geoclue) + (whitelist '()) + (wifi-geolocation-url + ;; Mozilla geolocation service: + "https://location.services.mozilla.com/v1/geolocate?key=geoclue") + (submit-data? #f) + (wifi-submission-url + "https://location.services.mozilla.com/v1/submit?key=geoclue") + (submission-nick "geoclue") + (applications %standard-geoclue-applications)) + "Return a service that runs the @command{geoclue}, location service." + (mlet %store-monad ((config (configuration-file + #:whitelist whitelist + #:wifi-geolocation-url wifi-geolocation-url + #:submit-data? submit-data? + #:wifi-submission-url wifi-submission-url + #:submission-nick submission-nick + #:applications applications))) + (return + (service + (documentation "Run the Geoclue location service.") + (provision '(geoclue-daemon)) + (requirement '(dbus-system)) + + (start #~(make-forkexec-constructor + (list (string-append #$geoclue "/libexec/geoclue")) + #:environment-variables + (list (string-append "GEOCLUE_CONFIG_FILE_NAME=" #$config)))) + (stop #~(make-kill-destructor)) + + (user-groups (list (user-group + (name "geoclue") + (system? #t)))) + (user-accounts (list (user-account + (name "geoclue") + (group "geoclue") + (system? #t) + (comment "Geoclue daemon user") + (home-directory "/var/empty") + (shell + "/run/current-system/profile/sbin/nologin")))))))) + +;;; geoclue.scm ends here -- 2.2.1