aboutsummaryrefslogtreecommitdiff
path: root/virtual/modules
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2019-01-09 23:35:11 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2019-01-09 23:35:11 +0100
commit4d4f13f4a8e7df6480da895d80d487c891441745 (patch)
treeed559d3b3155bf79c0b2fa789948a3434dad3df4 /virtual/modules
parent43b726ed3ba5e9a5ce91f7b39ffbe895d3ada18b (diff)
downloadNix-4d4f13f4a8e7df6480da895d80d487c891441745.tar.gz
Nix-4d4f13f4a8e7df6480da895d80d487c891441745.tar.zst
Nix-4d4f13f4a8e7df6480da895d80d487c891441745.zip
Move some elements to separate modules
Diffstat (limited to 'virtual/modules')
-rw-r--r--virtual/modules/databases.nix133
-rw-r--r--virtual/modules/gitolite.nix73
-rwxr-xr-xvirtual/modules/gitolite/gitolite_ldap_groups.sh15
-rw-r--r--virtual/modules/gitweb.nix21
-rw-r--r--virtual/modules/gitweb/theme/git-favicon.pngbin0 -> 1125 bytes
-rw-r--r--virtual/modules/gitweb/theme/git-logo.pngbin0 -> 2412 bytes
-rw-r--r--virtual/modules/gitweb/theme/gitweb.css783
-rw-r--r--virtual/modules/gitweb/theme/gitweb.js27
8 files changed, 1052 insertions, 0 deletions
diff --git a/virtual/modules/databases.nix b/virtual/modules/databases.nix
new file mode 100644
index 0000000..25bd645
--- /dev/null
+++ b/virtual/modules/databases.nix
@@ -0,0 +1,133 @@
1{ lib, pkgs, config, mylibs, ... }:
2let
3 cfg = config.services.myDatabases;
4in {
5 options.services.myDatabases = {
6 enable = lib.mkEnableOption "my databases service";
7 postgresql = {
8 enable = lib.mkOption {
9 default = cfg.enable;
10 example = true;
11 description = "Whether to enable postgresql database";
12 type = lib.types.bool;
13 };
14 };
15
16 mariadb = {
17 enable = lib.mkOption {
18 default = cfg.enable;
19 example = true;
20 description = "Whether to enable mariadb database";
21 type = lib.types.bool;
22 };
23 };
24
25 redis = {
26 enable = lib.mkOption {
27 default = cfg.enable;
28 example = true;
29 description = "Whether to enable redis database";
30 type = lib.types.bool;
31 };
32 };
33 };
34
35 config = lib.mkIf cfg.enable {
36 nixpkgs.config.packageOverrides = oldpkgs: rec {
37 postgresql = postgresql111;
38 postgresql111 = oldpkgs.postgresql100.overrideAttrs(old: rec {
39 passthru = old.passthru // { psqlSchema = "11.0"; };
40 name = "postgresql-11.1";
41 src = pkgs.fetchurl {
42 url = "mirror://postgresql/source/v11.1/${name}.tar.bz2";
43 sha256 = "026v0sicsh7avzi45waf8shcbhivyxmi7qgn9fd1x0vl520mx0ch";
44 };
45 });
46 mariadb = mariadbPAM;
47 mariadbPAM = oldpkgs.mariadb.overrideAttrs(old: rec {
48 cmakeFlags = old.cmakeFlags ++ [ "-DWITH_AUTHENTICATION_PAM=ON" ];
49 buildInputs = old.buildInputs ++ [ pkgs.pam ];
50 });
51 };
52
53 networking.firewall.allowedTCPPorts = [ 3306 5432 ];
54
55 # FIXME: initial sync
56 # FIXME: backup
57 # FIXME: restart after pam
58 # FIXME: pam access doesn’t work (because of php module)
59 # FIXME: ssl
60 services.mysql = rec {
61 enable = cfg.mariadb.enable;
62 package = pkgs.mariadb;
63 };
64
65 # FIXME: initial sync
66 # FIXME: backup
67 # FIXME: ssl
68 services.postgresql = rec {
69 enable = cfg.postgresql.enable;
70 package = pkgs.postgresql;
71 enableTCPIP = true;
72 extraConfig = ''
73 max_connections = 100
74 wal_level = logical
75 shared_buffers = 128MB
76 max_wal_size = 1GB
77 min_wal_size = 80MB
78 log_timezone = 'Europe/Paris'
79 datestyle = 'iso, mdy'
80 timezone = 'Europe/Paris'
81 lc_messages = 'en_US.UTF-8'
82 lc_monetary = 'en_US.UTF-8'
83 lc_numeric = 'en_US.UTF-8'
84 lc_time = 'en_US.UTF-8'
85 default_text_search_config = 'pg_catalog.english'
86 # ssl = on
87 # ssl_cert_file = '/var/lib/acme/eldiron/fullchain.pem'
88 # ssl_key_file = '/var/lib/acme/eldiron/key.pem'
89 '';
90 authentication = ''
91 local all postgres ident
92 local all all md5
93 host all all samehost md5
94 host all all 178.33.252.96/32 md5
95 host all all 188.165.209.148/32 md5
96 #host all all all pam
97 '';
98 };
99
100 security.pam.services = let
101 pam_ldap = pkgs.pam_ldap;
102 pam_ldap_mysql = assert mylibs.checkEnv "NIXOPS_MYSQL_PAM_PASSWORD";
103 pkgs.writeText "mysql.conf" ''
104 host ldap.immae.eu
105 base dc=immae,dc=eu
106 binddn cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
107 bindpw ${builtins.getEnv "NIXOPS_MYSQL_PAM_PASSWORD"}
108 pam_filter memberOf=cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
109 '';
110 in [
111 {
112 name = "mysql";
113 text = ''
114 # https://mariadb.com/kb/en/mariadb/pam-authentication-plugin/
115 auth required ${pam_ldap}/lib/security/pam_ldap.so config=${pam_ldap_mysql}
116 account required ${pam_ldap}/lib/security/pam_ldap.so config=${pam_ldap_mysql}
117 '';
118 }
119 ];
120
121 # FIXME: backup
122 # Nextcloud: 14
123 services.redis = rec {
124 enable = config.services.myDatabases.redis.enable;
125 bind = "127.0.0.1";
126 unixSocket = "/run/redis/redis.sock";
127 extraConfig = ''
128 unixsocketperm 777
129 maxclients 1024
130 '';
131 };
132 };
133}
diff --git a/virtual/modules/gitolite.nix b/virtual/modules/gitolite.nix
new file mode 100644
index 0000000..85c7be1
--- /dev/null
+++ b/virtual/modules/gitolite.nix
@@ -0,0 +1,73 @@
1{ lib, pkgs, config, mylibs, ... }:
2let
3 cfg = config.services.myGitolite;
4in {
5 options.services.myGitolite = {
6 enable = lib.mkEnableOption "my gitolite service";
7 };
8
9 config = lib.mkIf cfg.enable {
10 nixpkgs.config.packageOverrides = oldpkgs: rec {
11 gitolite = oldpkgs.gitolite.overrideAttrs(old: rec {
12 name = "gitolite-${version}";
13 version = "3.6.10";
14 src = pkgs.fetchFromGitHub {
15 owner = "sitaramc";
16 repo = "gitolite";
17 rev = "v${version}";
18 sha256 = "0p2697mn6rwm03ndlv7q137zczai82n41aplq1g006ii7f12xy8h";
19 };
20 });
21 };
22
23 system.activationScripts.gitolite =
24 assert mylibs.checkEnv "NIXOPS_GITOLITE_LDAP_PASSWORD";
25 let
26 gitolite_ldap_groups = mylibs.wrap {
27 name = "gitolite_ldap_groups.sh";
28 file = ./gitolite/gitolite_ldap_groups.sh;
29 vars = {
30 LDAP_PASS = builtins.getEnv "NIXOPS_GITOLITE_LDAP_PASSWORD";
31 };
32 paths = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
33 };
34 in {
35 deps = [ "users" ];
36 text = ''
37 if [ -d /var/lib/gitolite ]; then
38 ln -sf ${gitolite_ldap_groups} /var/lib/gitolite/gitolite_ldap_groups.sh
39 chmod g+rx /var/lib/gitolite
40 fi
41 if [ -f /var/lib/gitolite/projects.list ]; then
42 chmod g+r /var/lib/gitolite/projects.list
43 fi
44 '';
45 };
46
47 users.users.wwwrun.extraGroups = [ "gitolite" ];
48
49 users.users.gitolite.packages = let
50 python-packages = python-packages: with python-packages; [
51 simplejson
52 urllib3
53 ];
54 in
55 [
56 (pkgs.python3.withPackages python-packages)
57 ];
58 # FIXME: after initial install, need to
59 # (1) copy rc file (adjust gitolite_ldap_groups.sh)
60 # (2) (mark old readonly and) sync repos except gitolite-admin
61 # rsync -av --exclude=gitolite-admin.git old:/var/lib/gitolite/repositories /var/lib/gitolite/
62 # chown -R gitolite:gitolite /var/lib/gitolite
63 # (3) push force the gitolite-admin to new location (from external point)
64 # Don't use an existing key, it will take precedence over
65 # gitolite-admin
66 # (4) su -u gitolite gitolite setup
67 services.gitolite = {
68 enable = true;
69 # FIXME: key from ./ssh
70 adminPubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXqRbiHw7QoHADNIEuo4nUT9fSOIEBMdJZH0bkQAxXyJFyCM1IMz0pxsHV0wu9tdkkr36bPEUj2aV5bkYLBN6nxcV2Y49X8bjOSCPfx3n6Own1h+NeZVBj4ZByrFmqCbTxUJIZ2bZKcWOFncML39VmWdsVhNjg0X4NBBehqXRIKr2gt3E/ESAxTYJFm0BnU0baciw9cN0bsRGqvFgf5h2P48CIAfwhVcGmPQnnAwabnosYQzRWxR0OygH5Kd8mePh6FheIRIigfXsDO8f/jdxwut8buvNIf3m5EBr3tUbTsvM+eV3M5vKGt7sk8T64DVtepTSdOOWtp+47ktsnHOMh immae@immae.eu";
71 };
72 };
73}
diff --git a/virtual/modules/gitolite/gitolite_ldap_groups.sh b/virtual/modules/gitolite/gitolite_ldap_groups.sh
new file mode 100755
index 0000000..5f7ef6d
--- /dev/null
+++ b/virtual/modules/gitolite/gitolite_ldap_groups.sh
@@ -0,0 +1,15 @@
1#!/usr/bin/env bash
2
3uid_param="$1"
4ldap_host="ldap.immae.eu"
5ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu"
6ldap_bindpw="$LDAP_PASS"
7ldap_searchbase="dc=immae,dc=eu"
8ldap_scope="subtree"
9
10ldap_options="-h ${ldap_host} -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}"
11
12ldap_filter="(&(memberOf=cn=groups,cn=gitolite,ou=services,dc=immae,dc=eu)(|(member=uid=${uid_param},ou=users,dc=immae,dc=eu)(member=uid=${uid_param},ou=group_users,dc=immae,dc=eu)))"
13ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2)
14
15echo "$ldap_result"
diff --git a/virtual/modules/gitweb.nix b/virtual/modules/gitweb.nix
new file mode 100644
index 0000000..f3ef1bd
--- /dev/null
+++ b/virtual/modules/gitweb.nix
@@ -0,0 +1,21 @@
1{ lib, pkgs, config, mylibs, ... }:
2let
3 cfg = config.services.myGitweb;
4in {
5 options.services.myGitweb = {
6 enable = lib.mkEnableOption "my gitweb service";
7 };
8
9 config = lib.mkIf cfg.enable {
10 security.acme.certs."eldiron".extraDomains."git.immae.eu" = null;
11
12 nixpkgs.config.packageOverrides = oldpkgs: rec {
13 gitweb = oldpkgs.gitweb.overrideAttrs(old: {
14 installPhase = old.installPhase + ''
15 cp -r ${./gitweb/theme} $out/gitweb-theme;
16 '';
17 });
18 };
19
20 };
21}
diff --git a/virtual/modules/gitweb/theme/git-favicon.png b/virtual/modules/gitweb/theme/git-favicon.png
new file mode 100644
index 0000000..4fa44bb
--- /dev/null
+++ b/virtual/modules/gitweb/theme/git-favicon.png
Binary files differ
diff --git a/virtual/modules/gitweb/theme/git-logo.png b/virtual/modules/gitweb/theme/git-logo.png
new file mode 100644
index 0000000..fdaf7b7
--- /dev/null
+++ b/virtual/modules/gitweb/theme/git-logo.png
Binary files differ
diff --git a/virtual/modules/gitweb/theme/gitweb.css b/virtual/modules/gitweb/theme/gitweb.css
new file mode 100644
index 0000000..83e0742
--- /dev/null
+++ b/virtual/modules/gitweb/theme/gitweb.css
@@ -0,0 +1,783 @@
1/* Reset
2------------------------------------------------------------------------- */
3
4/* Based on http://meyerweb.com/eric/tools/css/reset/ */
5/* v1.0 | 20080212 */
6
7html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p,
8blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em,
9font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b,
10u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table,
11caption, tbody, tfoot, thead, tr, th, td {
12 margin: 0;
13 padding: 0;
14 border: 0;
15 outline: 0;
16 font-size: 100%;
17 vertical-align: baseline;
18 background: transparent;
19}
20
21ol, ul { list-style: none; }
22
23blockquote, q { quotes: none; }
24
25blockquote:before, blockquote:after,
26q:before, q:after {
27 content: '';
28 content: none;
29}
30
31:focus { outline: 0; }
32
33ins { text-decoration: none; }
34
35del { text-decoration: line-through; }
36
37table {
38 border-collapse: collapse;
39 border-spacing: 0;
40}
41
42a { outline: none; }
43
44/* General
45---------------------------------------------------------------------------- */
46
47html {
48 position: relative;
49 min-height: 100%;
50}
51
52body {
53 font: 13px Helvetica,arial,freesans,clean,sans-serif;
54 line-height: 1.4;
55 margin: 0 0 105px;
56 background-color: #fff;
57 color: #000000;
58}
59
60/* Monospaced Fonts */
61.sha1, .mode, .diff_tree .list, .pre, .diff, .patchset {
62 font-family: 'Consolas','Bitstream Vera Sans Mono',monospace;
63}
64
65a:link, a:visited {
66 color: #4183C4;
67 text-decoration: none;
68}
69
70a:hover {
71 text-decoration: underline;
72}
73
74td.list a[href*='tree'], td.list a[href*='blob'] {
75 padding-left: 20px;
76 display: block;
77 float: left;
78 height: 16px;
79 line-height: 16px;
80}
81
82td.list a[href*='tree'] {
83 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABq0lEQVQ4y8WTu4oUQRSGv+rtGVuxhwVFdFEEE2c3d0HYTEMTn8DEVxADQTDUF9DMwMxQMBMx8AEWzRQ3cBHd9TI91+2urjq/QbczY2IygSep4nD+79yqnCRWsYQVbWVACvDh5ZXdrLe15dwyT1TjT/sxFFeB6i+VA2B6+cb7kAI4Jf0LO087zjlQI8Y5Qvnj0sHug321XoC1bk+K9eHk6+s7wPMUgKAS88eqb4+Jfg2SHs7lZBvX2Nh+2EUCDGSAcMnJsx9f7NxfAGqXyDzRd5EJO/pMPT1gcviGTnYOVIN5pAAE8v7dLrKL8xnglFk4ws9Afko9HpH3b5Gd2mwb/lOBmgrSdYhJugDUCenxM6xv3p4HCsP8F0LxCsUhCkMURihOyM7fg0osASTFEpu9a4LjGIUCqwcoDiEUrX+E4hRUQb20RiokC1j9vckUhygU7X3QZh7NAVKYL7YBeMkRUfjVCotF2XGIwnghtrJpMywB5G0QZj9P1JNujuWJ1AHLQadRrACPkuZ0SSSWpeStWgDK6tHek5vbiOs48n++XQHurcf0rFng//6NvwG+iB9/4duaTgAAAABJRU5ErkJgggo=) center left no-repeat;
84}
85
86td.list a[href*='blob'] {
87 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQoFQXBMW5TQRgGwNnHnoE0QbiCjoIooUmTU3AuS1BwIoTSUdJBigg3GCWOg9/++zHTop078wIAsPMrE4SL5/1aIyMjIyMjz/m0tbFECFdrPeaQQw75mz/5nZH7fN7aWILmauSYfznmmIfss8vIUx7zZWsTTXM5vpWvTk5Wq9VHQP/gtgOLa0Qpw940vAQdaG6thpOhlOkG0AEuAVGmEkAH+G4YSikxXQM6wDsAMRFAB/ihDNNUmN4DOsAbBAEAdICfpmmaAt4COoj2GgCASbIkZh1NAACznhQt2itnFgAAlF3u/gMDtJXPzQxoswAAAABJRU5ErkJgggo=) center left no-repeat;
88}
89
90i {
91 font-style: normal;
92}
93
94td, th {
95 padding: 5px;
96}
97
98.page_nav br {
99 display: none;
100}
101
102/* Page Header
103---------------------------------------------------------------------------- */
104
105.page_header {
106 height: 50px;
107 line-height: 50px;
108 position: relative;
109 padding: 0 27px;
110 margin-bottom: 20px;
111 font-size: 20px;
112 font-family: Helvetica, Arial, Freesans, Clean, sans-serif;
113 background: #FFFFFF; /* old browsers */
114 background: -moz-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%); /* firefox */
115 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FFFFFF), color-stop(100%,#F5F5F5)); /* webkit */
116 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#F5F5F5',GradientType=0 ); /* ie */
117 background: -o-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%);
118 border-bottom: 1px solid #dfdfdf;
119}
120
121.page_header a:link, .page_header a:visited {
122 color: #4183C4;
123 text-decoration: none;
124 padding: 3px;
125 font-weight: bold;
126}
127
128.page_header a:hover {
129 font-weight: bold;
130 padding: 3px;
131 text-decoration: underline;
132}
133
134.page_header a:first-child {
135 background: transparent;
136}
137
138.page_header img.logo {
139 position: relative;
140 top: 7px;
141 margin-right: 5px;
142}
143
144/* Page Footer
145---------------------------------------------------------------------------- */
146
147.page_footer {
148 position: absolute;
149 left: 0;
150 bottom: 0;
151 width: 100%;
152 height: 80px;
153 line-height: 80px;
154 margin-top: 15px;
155 background: #f1f1f1;
156 border-top: 2px solid #ddd;
157 border-bottom: 1px solid #ddd;
158}
159
160.page_footer_text {
161 color: #666;
162 display: inline;
163 float: left;
164 margin-left: 25px;
165 width: 80%;
166 overflow: hidden;
167 white-space: nowrap;
168 text-overflow: ellipsis;
169}
170
171a.rss_logo {
172 float: right;
173 padding: 3px 1px;
174 width: 35px;
175 line-height: 10px;
176 border: 1px solid;
177 border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e;
178 color: #ffffff;
179 background-color: #ff6600;
180 font-weight: bold;
181 font-family: sans-serif;
182 font-size: 80%;
183 text-align: center;
184 text-decoration: none;
185 margin-top: 30px;
186 margin-left: 5px;
187}
188
189a.rss_logo:hover {
190 background-color: #ee5500;
191}
192
193.rss_logo {
194 margin-right: 25px;
195 background: yellow;
196}
197
198.rss_logo:last-child {
199 margin-right: 5px;
200}
201
202/* Index include
203---------------------------------------------------------------------------- */
204
205.index_include {
206 width: 95%;
207 margin: 0 auto 15px;
208 background: -moz-linear-gradient(center top , #FFFFFF 0%, #F5F5F5 100%) repeat scroll 0 0 transparent;
209 border: 1px solid #DFDFDF;
210 padding: 8px;
211 -webkit-box-sizing: border-box;
212 -moz-box-sizing: border-box;
213 box-sizing: border-box;
214}
215
216/* Elements
217---------------------------------------------------------------------------- */
218
219.project_list,
220.shortlog,
221.tree,
222.commit_search,
223.history {
224 width: 95%;
225 margin: 0 auto 15px auto;
226 border: 1px solid #d8d8d8;
227 -moz-box-shadow: 0 0 3px rgba(0,0,0,0.2);
228 -webkit-box-shadow: 0 0 3px rgba(0,0,0,0.2);
229 box-shadow: 0 0 3px rgba(0,0,0,0.2);
230}
231
232.project_list th,
233.shortlog th,
234.tree th,
235.commit_search th {
236 color: #afafaf;
237 font-weight: normal;
238}
239
240.project_list th {
241 font-weight: bold;
242}
243
244.project_list tr,
245.shortlog tr,
246.tree tr,
247.commit_search tr {
248 background: #eaeaea;
249 height: 2.5em;
250 text-align: left;
251 color: #545454;
252}
253
254.project_list tr.dark, .project_list tr.light,
255.shortlog tr.dark, .shortlog tr.light,
256.tree tr.dark, .tree tr.light,
257.commit_search tr.dark, .commit_search tr.light,
258.history tr.dark, .history tr.light,
259.heads tr.dark, .heads tr.light {
260 background: #F9F9F9; /* old browsers */
261 background: -moz-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%); /* firefox */
262 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F9F9F9), color-stop(100%,#EFEFEF)); /* webkit */
263 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#F9F9F9', endColorstr='#EFEFEF',GradientType=0 ); /* ie */
264 background: -o-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%);
265 height: 2.5em;
266 border-bottom: 1px solid #e1e1e1;
267}
268
269th .header {
270 background: transparent;
271 border: 0;
272 padding: 0;
273 font-weight: bold;
274}
275
276.tree {
277 width: 100%;
278 margin: 0;
279}
280
281.projsearch {
282 position: absolute;
283 right: 4%;
284 top: 15px;
285}
286
287.projsearch a {
288 display: none;
289}
290
291.commit_search {
292 background: #eaeaea;
293}
294
295.page_nav,
296.list_head,
297.page_path,
298.search {
299 width: 94%;
300 background: #eaeaea;
301 color: #545454;
302 border: 1px solid #d8d8d8;
303 padding: 5px;
304 margin: 0 auto 15px auto;
305}
306
307.history {
308 background: #eaeaea;
309}
310
311.title {
312 margin: 0 auto 15px auto;
313 padding: 5px;
314 width: 95%;
315}
316
317.readme {
318 background: #eaf2f5;
319 border: 1px solid #bedce7;
320 -moz-box-sizing: border-box;
321 -webkit-box-sizing: border-box;
322 box-sizing: border-box;
323 margin: 0 auto 15px auto;
324 padding: 15px;
325 width: 95%;
326}
327
328.readme h1 {
329 display: block;
330 font-size: 2em;
331 font-weight: bold;
332 margin-bottom: 0.67em;
333 margin-top: 0;
334}
335
336.readme h2 {
337 font-size: 1.5em;
338 font-weight: bold;
339 margin-bottom: 0.83em;
340}
341
342
343.readme h3 {
344 font-size: 1.17em;
345 font-weight: bold;
346 margin-bottom: 1em;
347}
348
349.readme p {
350 margin-bottom: 1em;
351}
352
353.readme ul {
354 list-style: disc;
355 margin-bottom: 1em;
356 margin-left: 1.5em;
357}
358
359.readme ul ul {
360 margin-bottom: 0;
361}
362
363.readme ol {
364 list-style: decimal;
365 margin-bottom: 1em;
366 margin-left: 1.5em;
367}
368
369.readme ol ol {
370 margin-bottom: 0;
371}
372
373.readme pre {
374 font-family: monospace;
375 margin: 1em 0;
376 white-space: pre;
377}
378
379.readme tt, .readme code, .readme kbd, .readme samp {
380 font-family: monospace;
381}
382
383.readme blockquote {
384 margin: 1em;
385}
386
387.projects_list,
388.tags {
389 width: 95%;
390 background: #f0f0f0;
391 color: #545454;
392 border: 1px solid #d8d8d8;
393 padding: 5px;
394 margin: 0 auto 15px auto;
395}
396
397.heads {
398 width: 95%;
399 color: #545454;
400 border: 1px solid #d8d8d8;
401 padding: 5px;
402 margin: 0 auto 15px auto;
403}
404
405.header {
406 width: 94%;
407 margin: 0 auto 15px auto;
408 background: #eaf2f5;
409 border: 1px solid #bedce7;
410 padding: 5px;
411}
412
413.header .age {
414 float: left;
415 color: #000;
416 font-weight: bold;
417 width: 10em;
418}
419
420.title_text {
421 width: 94%;
422 background: #eaf2f5;
423 border: 1px solid #bedce7;
424 padding: 5px;
425 margin: 0 auto 0 auto;
426}
427
428.log_body {
429 width: 94%;
430 background: #eaf2f5;
431 border: 1px solid #bedce7;
432 border-top: 0;
433 padding: 5px;
434 margin: 0 auto 15px auto;
435}
436
437.page_body {
438 line-height: 1.4em;
439 width: 94%;
440 background: #f8f8f8;
441 border: 1px solid #d8d8d8;
442 padding: 5px;
443 margin: 15px auto 15px auto;
444}
445
446.diff_tree {
447 width: 95%;
448 background: #f0f0f0;
449 border: 1px solid #d8d8d8;
450 padding: 5px;
451 margin: 0 auto 15px auto;
452}
453
454.page_body > .list_head {
455 width: 98.5%;
456}
457
458.page_body > .diff_tree {
459 width: 99.5%;
460}
461
462.patch > .header {
463 width: 99%;
464}
465
466.author .avatar,
467.author_date .avatar {
468 position: relative;
469 top: 3px;
470}
471
472.object_header .avatar {
473 border: 1px solid #D8D8D8;
474 float: right;
475}
476
477.object_header td,
478.object_header th {
479 vertical-align: top;
480}
481
482/* Refs
483---------------------------------------------------------------------------- */
484
485span.refs span {
486 color: #707070;
487 display: inline-block;
488 margin: 0;
489 background-color: #eee;
490 border: 1px solid #ccc;
491 border-radius: 3px;
492 height: 18px;
493 padding: 0 6px;
494 text-overflow: ellipsis;
495}
496
497span.refs span.ref {
498 color: #707070;
499 display: inline-block;
500 margin: 0;
501 background-color: #c4c4ff;
502 border: 1px solid #7878ff;
503 border-radius: 3px;
504 height: 18px;
505 padding: 0 6px;
506 text-overflow: ellipsis;
507 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUnpolg7AAAAHJQTFRFAAAAVVWqZmbMVVXVYGDgbW3td3fuc3PzdHT0cHD1d3f6dHT6dnb7dHT7dnb8dnb8dnb9d3f9dnb+eHj+d3f+eHj+d3f+d3f+d3f+eHj+d3f+eHj+d3f+eHj+d3f+d3f+eHj+d3f+d3f+d3f+eHj/////V9oQhQAAACR0Uk5TAAIEBQcNDhMVGCotNTZAT217i5CgobvExtjZ4eLr7vP09ff7uqQ6cgAAAAFiS0dEJcMByQ8AAABUSURBVBjTpc43AoAwDENRh95bgNBM1f3PyOpslD++RSJ61YgH5M2IbIkn4GocSR1MZVBL4t2n4FgkbaxI8Sqph041WknZCWAIrcmEUbpf3lNe0N9u59YFYHnZ78gAAAAASUVORK5CYII=);
508 background-repeat: no-repeat;
509 padding-left: 18px;
510}
511
512span.refs span.tag {
513 color: #707070;
514 display: inline-block;
515 margin: 0;
516 background-color: #ffffab;
517 border: 1px solid #d9d93b;
518 border-radius: 3px;
519 height: 18px;
520 padding: 0 6px;
521 text-overflow: ellipsis;
522 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUZZ+h9RwAAAGZQTFRFAAAAtrYkwMBAwMBAx8c4yso11NQ71NQ51dU52Ng71tY519c719c719c62Ng719c719c62Ng72dk62Ng62Ng72Ng72dk62Ng72Ng62dk62dk72dk62Ng62dk72Ng72Ng72dk7////ou/AnQAAACB0Uk5TAAYHCxESLjRCWWlqa4uNkpissbrO19jc3ufs8vf6/f7atAU2AAAAAWJLR0QhxGwNFgAAAF1JREFUGFeNy0cOgCAABVGw94rY5d//lC7omhhn+ZIh5Gf1xPk0Zi5dAABROIQjSU/fsAXhDkCUljAv8jW2wlQpaixpo4Nj+dtatVpjkSJjLNaizRVpvhBCu/4h391jzw1lU12Z7wAAAABJRU5ErkJggg==);
523 background-repeat: no-repeat;
524 padding-left: 18px;
525}
526
527span.refs span.head {
528 color: #707070;
529 display: inline-block;
530 margin: 0;
531 background-color: #c4ffc4;
532 border: 1px solid #78ff78;
533 border-radius: 3px;
534 height: 18px;
535 padding: 0 6px;
536 text-overflow: ellipsis;
537 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSYDsafX/gAAAUpJREFUOMvVkjFLA0EQhd/s7l06MSCihbV/wC5/QBDEIFYWprRIIQQJFqKFQi4kUbBQsFSwtrUQLQULUTBFLCzVIgimCXe7z0q5yIWcqfRVwzDzMTNvgL8mSUqWw3JOtFQJdsIwLDYyjdYgkEmkazl2oVtQWk36nn8AYBYASmFpxmizGtnoqO7Vb+M9KglEkASdpWU872nvVCiPRpuTnz2JIHGyqX3d0kZfR1G0Ht+g/do+FIhOBbLW3n/FNb/28D0puZ+dyL44ur1UoH5yzt2JyIj6UGdDgwrPhYzSagNEszJaeU/lWlylbmnaeGZZICsAppxzi6nt73HK85oQCMknOuarpno+FIjglVjZDXaCS2yDv3rIHlCb88FY0BlUl3hs7ektkhckb5DFWhoz+n12zr7ZPLpYUqLm0oBMn8NUzLhpAgjpWMS/1CcSJ3ykD7Rk1QAAAABJRU5ErkJggg==);
538 background-repeat: no-repeat;
539 padding-left: 18px;
540}
541
542span.refs a {
543 color: #4e4e4e;
544 font: 11px "Bitstream Vera Sans Mono", "DejaVu Sans Mono", Monaco, monospace;
545 line-height: 18px;
546}
547
548/* Diffs
549---------------------------------------------------------------------------- */
550
551div.diff.to_file a.path,
552div.diff.to_file {
553 color: #007000;
554}
555
556div.diff.from_file a.path,
557div.diff.from_file {
558 color: #aa0000;
559}
560
561.patch .header {
562 margin: 0;
563}
564
565.patchset {
566 overflow-x: auto;
567 overflow-y: hidden;
568}
569
570.chunk_header {
571 background: #eaf2f5;
572 color: #999;
573}
574
575.rem {
576 background: #ffdddd;
577}
578.rem .marked {
579 background: #ffaaaa;
580}
581.add {
582 background: #ddffdd;
583}
584.add .marked {
585 background: #7dff7d;
586}
587
588.extended_header {
589 width: 99.5%;
590}
591
592div.chunk_block {
593 overflow: hidden;
594}
595
596div.chunk_block div.old {
597 float: left;
598 width: 50%;
599 overflow: hidden;
600 border-right: 5px solid #EAF2F5;
601}
602
603div.chunk_block.rem,
604div.chunk_block.add {
605 background: transparent;
606}
607
608div.chunk_block div.old .add,
609div.chunk_block div.old .rem {
610 padding-right: 3px;
611}
612
613div.chunk_block div.new .add,
614div.chunk_block div.new .rem {
615 padding-left: 3px;
616}
617
618div.chunk_block div.new {
619 margin-left: 50%;
620 width: 50%;
621 border-left: 5px solid #EAF2F5;
622}
623
624/* Category
625---------------------------------------------------------------------------- */
626
627td.category {
628 background: #E6F1F6; /* old browsers */
629 background: -moz-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%); /* firefox */
630 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#C8D8E7), color-stop(100%,#E6F1F3)); /* webkit */
631 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#C8D8E7', endColorstr='#E6F1F3',GradientType=0 ); /* ie */
632 background: -o-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%);
633 font-weight: bold;
634 border-bottom: 1px solid #D1D1D1;
635 border-top: 1px solid #D1D1D1;
636}
637
638/* Age
639---------------------------------------------------------------------------- */
640
641/* noage: "No commits" */
642.project_list td.noage {
643 color: #cdcdcd;
644}
645
646/* age2: 60*60*24*2 <= age */
647.project_list td.age2, .blame td.age2 {
648 color: #545454;
649}
650
651/* age1: 60*60*2 <= age < 60*60*24*2 */
652.project_list td.age1 {
653 color: #009900;
654}
655
656/* age0: age < 60*60*2 */
657.project_list td.age0 {
658 color: #009900;
659 font-weight: bold;
660}
661
662/* File status
663---------------------------------------------------------------------------- */
664
665.diff_tree span.file_status.new {
666 color: #008000;
667}
668
669table.diff_tree span.file_status.deleted {
670 color: #c00000;
671}
672
673table.diff_tree span.file_status.moved,
674table.diff_tree span.file_status.mode_chnge {
675 color: #545454;
676}
677
678table.diff_tree span.file_status.copied {
679 color: #70a070;
680}
681
682span.cntrl {
683 border: dashed #aaaaaa;
684 border-width: 1px;
685 padding: 0px 2px 0px 2px;
686 margin: 0px 2px 0px 2px;
687}
688
689span.match {
690 background: #aaffaa;
691 color: #000;
692}
693
694td.error {
695 color: red;
696 background: yellow;
697}
698
699/* blob view */
700
701td.pre, div.pre, div.diff {
702 white-space: pre-wrap;
703}
704
705/* JavaScript-based timezone manipulation */
706
707.popup { /* timezone selection UI */
708 position: absolute;
709 /* "top: 0; right: 0;" would be better, if not for bugs in browsers */
710 top: 0; left: 0;
711 border: 1px solid #d8d8d8;
712 padding: 2px;
713 background-color: #f0f0f0;
714 font-style: normal;
715 color: #545454;
716 cursor: auto;
717}
718
719.close-button { /* close timezone selection UI without selecting */
720 /* float doesn't work within absolutely positioned container,
721 * if width of container is not set explicitly */
722 /* float: right; */
723 position: absolute;
724 top: 0px; right: 0px;
725 border: 1px solid #ffaaaa;
726 margin: 1px 1px 1px 1px;
727 padding-bottom: 2px;
728 width: 12px;
729 height: 10px;
730 font-size: 9px;
731 font-weight: bold;
732 text-align: center;
733 background-color: #ffdddd;
734 cursor: pointer;
735}
736
737/* Style definition generated by highlight 2.4.5, http://www.andre-simon.de/ */
738
739/* Highlighting theme definition: */
740
741.num { color:#6ecf36; }
742.esc { color:#ff00ff; }
743.str { color:#ff00d3; background-color: #edc9ec }
744.dstr { color:#818100; }
745.slc { color:#838183; font-style:italic; }
746.com { color:#838183; font-style:italic; }
747.dir { color:#008200; }
748.sym { color:#000000; }
749.line { color:#555555; }
750.kwa { color:#666666; font-weight:bold; }
751.kwb { color:#6b3099; }
752.kwc { color:#d4663d; }
753.kwd { color:#2928ff; }
754
755/**** Styles supplémentaires *****/
756
757.readme div.toc {
758 float: right;
759 border: 1px solid black;
760 background-color: white;
761}
762.readme div.toc span.toctitle {
763 display: inline-block;
764 width: 100%;
765 text-align: center;
766 font-weight: bold;
767}
768
769.readme table {
770 background-color: white;
771}
772
773.readme table thead tr {
774 background-color: #ccc;
775}
776
777.readme table tbody tr:nth-child(2n) {
778 background-color: #f8f8f8;
779}
780
781.readme table td, .readme table th {
782 border: 1px solid black;
783}
diff --git a/virtual/modules/gitweb/theme/gitweb.js b/virtual/modules/gitweb/theme/gitweb.js
new file mode 100644
index 0000000..72f3cfa
--- /dev/null
+++ b/virtual/modules/gitweb/theme/gitweb.js
@@ -0,0 +1,27 @@
1function include(filename, onload) {
2 var head = document.getElementsByTagName('head')[0];
3 var script = document.createElement('script');
4 script.src = filename;
5 script.type = 'text/javascript';
6 script.onload = script.onreadystatechange = function() {
7 if (script.readyState) {
8 if (script.readyState === 'complete' || script.readyState === 'loaded') {
9 script.onreadystatechange = null;
10 onload();
11 }
12 }
13 else {
14 onload();
15 }
16 }
17 head.appendChild(script);
18}
19
20include('static/gitweb.js', function() {});
21include('//code.jquery.com/jquery-3.1.0.min.js', function() {
22 $("div.title").each(function(index, element) {
23 if ($(element).text() === "readme" || $(element).text() === " ") {
24 $(element).hide();
25 }
26 });
27});