From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= Subject: [PATCH] gnu: services: Add mysql-service. Date: Tue, 14 Jun 2016 22:13:31 +0800 Message-ID: <1465913611-5552-1-git-send-email-iyzsong@gmail.com> Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:42348) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCp6F-0002s6-EG for guix-devel@gnu.org; Tue, 14 Jun 2016 10:13:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bCp6C-0007m3-21 for guix-devel@gnu.org; Tue, 14 Jun 2016 10:13:51 -0400 Received: from mail2.openmailbox.org ([62.4.1.33]:56181) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCp6B-0007l2-OH for guix-devel@gnu.org; Tue, 14 Jun 2016 10:13:47 -0400 List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: guix-devel@gnu.org Cc: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= * gnu/services/database.scm (): New record type. (%mysql-accounts, mysql-service-type): New variables. (mysql-configuration-file, %mysql-activation, mysql-shepherd-services) (mysql-services): New procedures. * doc/guix.texi (Database Services): Document it. --- doc/guix.texi | 19 +++++++- gnu/services/databases.scm | 107 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 46d9e77..e163f36 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -7985,7 +7985,7 @@ web site} for more information. @node Database Services @subsubsection Database Services -The @code{(gnu services databases)} module provides the following service. +The @code{(gnu services databases)} module provides the following services. @deffn {Scheme Procedure} postgresql-service [#:postgresql postgresql] @ [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @@ -7997,6 +7997,23 @@ The PostgreSQL daemon loads its runtime configuration from @var{data-directory}. @end deffn +@deffn {Scheme Procedure} mysql-service [#:config (mysql-configuration)] +Return a service that runs @command{mysqld}, the MySQL database server. + +The optional @var{config} argument specifies the configuration for +@command{mysqld}, which should be a @code{} object. +@end deffn + +@deftp {Data Type} mysql-configuration +Data type representing the configuration of @var{mysql-service}. + +@table @asis +@item @code{mysql} (default: @var{mariadb}) +Package object of the MySQL database server, can be either @var{mariadb} +or @var{mysql}. +@end table +@end deftp + @node Mail Services @subsubsection Mail Services diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index 690375e..fb063da 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -27,7 +27,9 @@ #:use-module (guix records) #:use-module (guix gexp) #:use-module (ice-9 match) - #:export (postgresql-service)) + #:export (postgresql-service + mysql-service + mysql-configuration)) ;;; Commentary: ;;; @@ -143,3 +145,106 @@ and stores the database cluster in @var{data-directory}." (postgresql postgresql) (config-file config-file) (data-directory data-directory)))) + + +;;; +;;; MySQL. +;;; + +(define-record-type* + mysql-configuration make-mysql-configuration + mysql-configuration? + (mysql mysql-configuration-mysql (default mariadb))) + +(define %mysql-accounts + (list (user-group + (name "mysql") + (system? #t)) + (user-account + (name "mysql") + (group "mysql") + (system? #t) + (home-directory "/var/empty") + (shell #~(string-append #$shadow "/sbin/nologin"))))) + +(define mysql-configuration-file + (match-lambda + (($ mysql) + (plain-file "my.cnf" "[mysqld] +datadir=/var/lib/mysql +socket=/run/mysqld/mysqld.sock +")))) + +(define (%mysql-activation config) + (let ((mysql (mysql-configuration-mysql config)) + (my.cnf (mysql-configuration-file config))) + #~(begin + (use-modules (ice-9 popen) + (guix build utils)) + (let* ((mysqld (string-append #$mysql "/bin/mysqld")) + (user (getpwnam "mysql")) + (uid (passwd:uid user)) + (gid (passwd:gid user)) + (datadir "/var/lib/mysql") + (rundir "/run/mysqld")) + (mkdir-p datadir) + (chown datadir uid gid) + (mkdir-p rundir) + (chown rundir uid gid) + ;; Initialize the database when it doesn't exist. + (when (not (file-exists? (string-append datadir "/mysql"))) + (let ((p (open-pipe* OPEN_WRITE mysqld + (string-append "--defaults-file=" #$my.cnf) + "--bootstrap" + "--user=mysql"))) + ;; Create the system database, according to 'mysql_install_db'. + (display "create database mysql;\n" p) + (display "use mysql;\n" p) + (for-each + (lambda (sql) + (call-with-input-file + (string-append #$mysql "/share/mysql/" sql) + (lambda (in) (dump-port in p)))) + '("mysql_system_tables.sql" + "mysql_performance_tables.sql" + "mysql_system_tables_data.sql" + "fill_help_tables.sql")) + ;; Remove the anonymous user and disable root access from + ;; remote machines, according to 'mysql_secure_installation'. + (display " +DELETE FROM user WHERE User=''; +DELETE FROM user WHERE User='root' AND + Host NOT IN ('localhost', '127.0.0.1', '::1'); +FLUSH PRIVILEGES; +" p) + (close-pipe p))))))) + +(define (mysql-shepherd-service config) + (list (shepherd-service + (provision '(mysql)) + (documentation "Run the MySQL server.") + (start (let ((mysql (mysql-configuration-mysql config)) + (my.cnf (mysql-configuration-file config))) + #~(make-forkexec-constructor + (list (string-append #$mysql "/bin/mysqld") + (string-append "--defaults-file=" #$my.cnf)) + #:user "mysql" #:group "mysql"))) + (stop #~(make-kill-destructor))))) + +(define mysql-service-type + (service-type + (name 'mysql) + (extensions + (list (service-extension account-service-type + (const %mysql-accounts)) + (service-extension activation-service-type + %mysql-activation) + (service-extension shepherd-root-service-type + mysql-shepherd-service))))) + +(define* (mysql-service #:key (config (mysql-configuration))) + "Return a service that runs @command{mysqld}, the MySQL database server. + +The optional @var{config} argument specifies the configuration for +@command{mysqld}, which should be a @code{} object." + (service mysql-service-type config)) -- 2.6.3