From 65fa66cd761f3a9f8c6e84f8b5f7d8c643fe9731 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov Date: Tue, 29 Aug 2017 23:40:05 +0300 Subject: [PATCH 1/1] gnu: services: version-control: Add cgit. * gnu/services/version-control.scm (, ): New record types. (cgit-configuration-robots-string, cgit-activation, cgit-configuration-nginx-config): New procedures. (%cgit-configuration-nginx, cgit-service-type): New variables. * doc/guix.texi (Version Control): Document the cgit service. * gnu/services/web.scm (): Add nginx-server-configuration-try-files. (emit-nginx-server-config): Add this. --- doc/guix.texi | 63 +++++++++++++++++++++++ gnu/services/version-control.scm | 108 ++++++++++++++++++++++++++++++++++++++- gnu/services/web.scm | 4 ++ 3 files changed, 174 insertions(+), 1 deletion(-) diff --git a/doc/guix.texi b/doc/guix.texi index 6293ad48b..2a7663276 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -16788,6 +16788,69 @@ Extra options will be passed to @code{git daemon}, please run @end table @end deftp +@subsubheading cgit service + +@uref{https://git.zx2c4.com/cgit/, cgit} is a hyperfast web +frontend for git repositories written in C. + +The following example will configure the service with default values. +By default, cgit can be accessed on port 80 (@code{http://localhost:80}). + +@example +(service nginx-service-type) +(service fcgiwrap-service-type) +(service cgit-service-type) +@end example + +@deftp {Data Type} cgit-configuration +Data type representing the configuration of cgit. +This type has the following parameters: + +@table @asis +@item @code{config-file} (default: @code{(cgit-configuration-file)}) +The configuration file to use for Cgit. This can be set to a +@dfn{cgit-configuration-file} record value, or any gexp +(@pxref{G-Expressions}). + +For example, to instead use a local file, the @code{local-file} function +can be used: + +@example +(service cgit-service-type + (cgit-configuration + (config-file (local-file "./my-cgitrc.conf")))) +@end example + +@item @code{package} (default: @code{cgit}) +The cgit package to use. + +@end table +@end deftp + +@deftp {Data Type} cgit-configuration-file +Data type representing the configuration options for Cgit. +This type has the following parameters: + +@table @asis +@item @code{css} (default: @code{"/share/cgit/cgit.css"}) +Url which specifies the css document to include in all cgit pages. + +@item @code{logo} (default: @code{"/share/cgit/cgit.png"}) +Url which specifies the source of an image which will be used as a logo +on all cgit pages. + +@item @code{virtual-root} (default: @code{"/"}) +Url which, if specified, will be used as root for all cgit links. + +@item @code{scan-path} (default: @code{"/srv/git"}) +A path which will be scanned for repositories. + +@item @code{robots} (default: @code{(list "noindex" "nofollow")}) +Text used as content for the "robots" meta-tag. + +@end table +@end deftp + @subsubsection Incremental file transfer The @code{(gnu services rsync)} module provides the following services: diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm index 107bc8e77..a2688163a 100644 --- a/gnu/services/version-control.scm +++ b/gnu/services/version-control.scm @@ -21,18 +21,40 @@ #:use-module (gnu services) #:use-module (gnu services base) #:use-module (gnu services shepherd) + #:use-module (gnu services web) #:use-module (gnu system shadow) #:use-module (gnu packages version-control) #:use-module (gnu packages admin) #:use-module (guix records) #:use-module (guix gexp) + #:use-module (guix store) #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (ice-9 match) #:export (git-daemon-service git-daemon-service-type git-daemon-configuration - git-daemon-configuration?)) + git-daemon-configuration? + + + cgit-configuration-file + cgit-configuration-file? + cgit-configuration-file-css + cgit-configuration-file-logo + cgit-configuration-file-robots + cgit-configuration-file-virtual-root + cgit-configuration-file-scan-path + + + cgit-configuration + cgit-configuration? + cgit-configuration-config-file + cgit-configuration-package + + %cgit-configuration-nginx + cgit-configuration-nginx-config + + cgit-service-type)) ;;; Commentary: ;;; @@ -139,3 +161,87 @@ The optional @var{config} argument should be a @code{} object, by default it allows read-only access to exported repositories under @file{/srv/git}." (service git-daemon-service-type config)) + + +;;; +;;; Cgit +;;; + +(define-record-type* + cgit-configuration-file make-cgit-configuration-file + cgit-configuration-file? + (css cgit-configuration-file-css + (default "/share/cgit/cgit.css")) + (logo cgit-configuration-file-logo + (default "/share/cgit/cgit.png")) + (robots cgit-configuration-file-robots + (default '("noindex" "nofollow"))) + (virtual-root cgit-configuration-file-virtual-root + (default "/")) + (scan-path cgit-configuration-file-scan-path + (default "/srv/git"))) + +(define (cgit-configuration-robots-string robots) + (string-join robots ", ")) + +(define-gexp-compiler (cgit-configuration-file-compiler + (file ) system target) + (match file + (($ css logo robots virtual-root scan-path) + (text-file + "cgitrc" + (string-concatenate + (filter-map + (match-lambda + ((key . #f) #f) + ((key . value) (string-append key "=" value "\n"))) + `(("css" . ,css) + ("logo" . ,logo) + ("robots" . ,(cgit-configuration-robots-string robots)) + ("virtual-root" . ,virtual-root) + ("scan-path" . ,scan-path)))))))) + +(define %cgit-configuration-nginx + (list + (nginx-server-configuration + (root cgit) + (locations + (list + (nginx-location-configuration + (uri "@cgit") + (body '("fastcgi_param SCRIPT_FILENAME $document_root/lib/cgit/cgit.cgi;" + "fastcgi_param PATH_INFO $uri;" + "fastcgi_param QUERY_STRING $args;" + "fastcgi_param HTTP_HOST $server_name;" + "fastcgi_pass 127.0.0.1:9000;"))))) + (try-files (list "$uri" "@cgit")) + (https-port #f) + (ssl-certificate #f) + (ssl-certificate-key #f)))) + +(define-record-type* + cgit-configuration make-cgit-configuration + cgit-configuration? + (config-file cgit-configuration-config-file + (default (cgit-configuration-file))) + (package cgit-configuration-package + (default cgit)) + (nginx cgit-configuration-nginx + (default %cgit-configuration-nginx))) + +(define (cgit-activation config) + ;; cgit compiled with default configuration path + #~(copy-file #$(cgit-configuration-config-file config) "/etc/cgitrc")) + +(define (cgit-configuration-nginx-config config) + (cgit-configuration-nginx config)) + +(define cgit-service-type + (service-type + (name 'cgit) + (extensions + (list (service-extension activation-service-type + cgit-activation) + (service-extension nginx-service-type + cgit-configuration-nginx-config))) + (default-value (cgit-configuration)))) diff --git a/gnu/services/web.scm b/gnu/services/web.scm index 18278502e..f3c5ca528 100644 --- a/gnu/services/web.scm +++ b/gnu/services/web.scm @@ -99,6 +99,8 @@ (default '())) (index nginx-server-configuration-index (default (list "index.html"))) + (try-files nginx-server-configuration-try-files + (default #f)) (ssl-certificate nginx-server-configuration-ssl-certificate (default "/etc/nginx/cert.pem")) (ssl-certificate-key nginx-server-configuration-ssl-certificate-key @@ -179,6 +181,7 @@ of index files." (nginx-server-configuration-ssl-certificate-key server)) (root (nginx-server-configuration-root server)) (index (nginx-server-configuration-index server)) + (try-files (nginx-server-configuration-try-files server)) (server-tokens? (nginx-server-configuration-server-tokens? server)) (locations (nginx-server-configuration-locations server))) (define-syntax-parameter <> (syntax-rules ())) @@ -207,6 +210,7 @@ of index files." (and/l ssl-certificate-key " ssl_certificate_key " <> ";\n") " root " root ";\n" " index " (config-index-strings index) ";\n" + " try_files " (config-index-strings try-files) ";\n" " server_tokens " (if server-tokens? "on" "off") ";\n" "\n" (map emit-nginx-location-config locations) -- 2.14.1