summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xREADME31
-rwxr-xr-xetc/hypermail/hmrc17
-rwxr-xr-xetc/hypermail/hypermail-footer.html2
-rwxr-xr-xetc/hypermail/hypermail-index-header.html18
-rwxr-xr-xetc/hypermail/hypermail-message-header.html18
-rwxr-xr-xetc/hypermail/mdir2mbox.lua98
-rwxr-xr-xetc/hypermail/mdir2mbox.sh119
-rwxr-xr-xetc/hypermail/reverse-summary-order.sh17
-rwxr-xr-xetc/hypermail/styles.css226
-rwxr-xr-xetc/periodic/15min/hyperarchives63
10 files changed, 609 insertions, 0 deletions
diff --git a/README b/README
new file mode 100755
index 0000000..ccabca2
--- /dev/null
+++ b/README
@@ -0,0 +1,31 @@
+
+/etc/periodic/15min/hyperarchives
+ cron job that periodically recreate the mail archive
+ packages needed:
+ hypermail lua lua-posix
+
+/etc/hypermail/hmrc
+ hypermail config
+
+/etc/hypermail/mdir2mbox.lua
+ lua script to convert maildir to mbox format
+
+/var/spool/mlmmj/*/archive/
+ the mlmmj archives in maildir format
+ postfix sends mails to pipe, mlmmj
+ mail files are saved into
+ /var/spool/mlmmj
+
+/var/www/domains/lists.alpinelinux.org/www
+ mail archive in html (created by /etc/periodic/15min/hyperarchives)
+ running webserver:
+ busybox httpd -p 80 -h /var/www/domains/lists.alpinelinux.org/www/
+
+
+
+
+
+
+
+
+
diff --git a/etc/hypermail/hmrc b/etc/hypermail/hmrc
new file mode 100755
index 0000000..a5307ab
--- /dev/null
+++ b/etc/hypermail/hmrc
@@ -0,0 +1,17 @@
+language=en
+about=none
+spamprotect=1
+icss_url=/style.css
+mcss_url=/style.css
+
+#folder_by_date="%y%m"
+monthly_index=1
+yearly_index=1
+reverse=1
+usemeta=1
+hm_reverse=1
+
+hm_ihtmlheaderfile=/etc/hypermail/hypermail-index-header.html
+hm_ihtmlfooterfile=/etc/hypermail/hypermail-footer.html
+hm_mhtmlheaderfile=/etc/hypermail/hypermail-message-header.html
+hm_mhtmlfooterfile=/etc/hypermail/hypermail-footer.html
diff --git a/etc/hypermail/hypermail-footer.html b/etc/hypermail/hypermail-footer.html
new file mode 100755
index 0000000..7a15064
--- /dev/null
+++ b/etc/hypermail/hypermail-footer.html
@@ -0,0 +1,2 @@
+</body>
+</html>
diff --git a/etc/hypermail/hypermail-index-header.html b/etc/hypermail/hypermail-index-header.html
new file mode 100755
index 0000000..1c53e0a
--- /dev/null
+++ b/etc/hypermail/hypermail-index-header.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="generator" content="hypermail, see http://www.hypermail-project.org/" />
+ <title>%l: %s</title>
+ <meta name="%l" content="%s" />
+ <link rel="stylesheet" type="text/css" href="../styles.css"/>
+ <link rel="stylesheet" type="text/css" href="http://alpinelinux.org/font.css"/> <!-- logo -->
+ <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600" />
+ <link rel="shortcut icon" href="http://alpinelinux.org/alpine-logo.ico" />
+</head>
+<body>
+ <div class="head_top">
+ <a class="alpine-logo left" href="http://alpinelinux.org"><span class="icon-alpine-logo"></span></a>
+ <div id="title"><h1>Mail archive<br />%l (%s)</h1></div>
+ </div>
+ <div class="footer">This archive was generated by <a href="%h">%p %v</a> : %g</div>
diff --git a/etc/hypermail/hypermail-message-header.html b/etc/hypermail/hypermail-message-header.html
new file mode 100755
index 0000000..e4f0512
--- /dev/null
+++ b/etc/hypermail/hypermail-message-header.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="generator" content="hypermail, see http://www.hypermail-project.org/" />
+ <title>%l: %s</title>
+ <meta name="%l" content="%s" />
+ <link rel="stylesheet" type="text/css" href="../styles.css"/>
+ <link rel="stylesheet" type="text/css" href="http://alpinelinux.org/font.css"/> <!-- logo -->
+ <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600" />
+ <link rel="shortcut icon" href="http://alpinelinux.org/alpine-logo.ico" />
+</head>
+<body>
+ <div class="head_top">
+ <a class="alpine-logo left" href="http://alpinelinux.org"><span class="icon-alpine-logo"></span></a>
+ <div id="title"><h1>Mail archive<br />%l</h1></div>
+ </div>
+ <div class="footer">This archive was generated by <a href="%h">%p %v</a> : %g</div>
diff --git a/etc/hypermail/mdir2mbox.lua b/etc/hypermail/mdir2mbox.lua
new file mode 100755
index 0000000..99b6f59
--- /dev/null
+++ b/etc/hypermail/mdir2mbox.lua
@@ -0,0 +1,98 @@
+#!/usr/bin/lua
+-- This script takes a mlmmj archive "maildir format" directory and
+-- writes out an mbox formatted file to stdout
+-- Copyright (c) 2009,2010 N. Angelacos under the GPL 2 License
+
+posix = require "posix"
+
+-- command line parser, or exit
+check_command_line = function ()
+ local source_dir = arg[1]
+ local source_time = arg[2]
+
+ if (source_dir == nil ) then
+ io.stderr:write("mdir2mbox source_dir [hours]\n" ..
+ "Writes an mbox formatted file to stdout from the files in source_dir\n" ..
+ "If [hours] is given, then only files newer then [hours] are processed\n")
+ os.exit(-1)
+ end
+
+ if (posix.stat(source_dir, "type") ~= "directory") then
+ io.stderr:write(source_dir .. " is not a directory\n")
+ os.exit(-1)
+ end
+
+ return source_dir, source_time
+end
+
+-- Get candidates
+get_candidates = function (source, hours)
+ local all = posix.dir(source)
+ local candidates = {}
+ local timestamp = 0
+
+ if (hours) then
+ timestamp = os.time() - hours * 3600
+ end
+
+ for k,v in ipairs(all) do
+ local st = posix.stat(source .. "/" .. v)
+ if (st) and (st.type == "regular") and (st.mtime > timestamp) then
+ table.insert(candidates,source .. "/" .. v)
+ end
+ end
+
+ return candidates
+end
+
+file_to_mbox = function (path)
+ local fh = io.open(path)
+ if (fh == nil) then
+ return
+ end
+ local headers = ""
+ local l = ""
+ -- get headers
+ repeat
+ headers = headers .. l
+ l = (fh:read("*l") or "" ) .. "\n"
+ until (#l == 1)
+
+ local from = string.match("\n" .. headers, "\nFrom: ([^\n]*)")
+ if from == nil then
+ from = string.match("\n" .. headers, "\nReply-To: ([^\n]*)")
+ end
+ if from == nil then
+ from = "<nobody@nowhere.com>"
+ end
+ from = string.match(from, "<([^>]*)>") or string.match(from, "([^ ]*)")
+
+
+ local date = string.match("\n" .. headers, "\nDate: ([^\n]*)")
+ if date == nil then
+ date = os.date ("%a, %d %b %Y %X +%z", posix.stat(path, "mtime"))
+ end
+
+ local weekday,day,month,year,time,offset = string.match((date or ""), "([^,]*), +(%d+)[%s-](%a+)[%s-](%d+) ([%d:]*) ([-+%w]*)")
+
+ print ("From " .. from .. " " .. string.format("%s %s %s %s %s", weekday, month, day, time, year, offset ))
+ print (headers)
+
+ -- get rest of message
+ repeat
+ local foo = fh:read("*l")
+ if foo then
+ print(foo)
+ end
+ until (foo == nil)
+
+fh:close()
+end
+
+candidates = get_candidates(check_command_line ())
+
+for k,v in ipairs(candidates) do
+ file_to_mbox(v)
+end
+print ("")
+
diff --git a/etc/hypermail/mdir2mbox.sh b/etc/hypermail/mdir2mbox.sh
new file mode 100755
index 0000000..2446e55
--- /dev/null
+++ b/etc/hypermail/mdir2mbox.sh
@@ -0,0 +1,119 @@
+#! /bin/bash
+#
+# For alpinelinux - this script /does/ require bash
+#
+# Get a directory name as input and convert all mail files inside
+# to mbox format
+#
+# NOTE: processing of subdirectories not yet implemented correctly:
+# all mails in subfolders are put into the same mbox
+# (it would be better if an mbox file will be generated for
+# each subfolder)
+# NOTE: calculation of message date in case of 'From:' doesn't recognise
+# time zones
+#
+# History:
+# Feb 06 2001 Joerg Reinhardt
+# - first edition
+# Feb 07 2001 Joerg Reinhardt
+# - added usage output
+# Feb 12 2001 Joerg Reinhardt
+# - mails not containing a 'From:' field but an 'X-From-Line:' or a
+# 'Reply-To:' field are now recognised and also processed (e.g. put into
+# the mbox file); this works fine for all my mails
+# - added progress information
+# - warning about corrupt files is now written to stderr
+#
+#
+# check for argument or help argument respectively
+if [[ ($1 == "") ||
+ ($1 == "-h") ||
+ ($1 == "--help") ||
+ ($1 == "-help") ]]; then
+ echo "Usage: "$0" <Xfmail-mail-directory>";
+fi;
+
+# check if parameter is a directory
+if [[ -d $1 ]]; then
+# set target filename
+ dirname=`echo $1 | awk '{while(substr($0,length($0),1)=="/"){$0=substr($0,1,length($0)-1);}print $0;}'`;
+ mboxfile=$dirname'.mbox';
+
+# check if directory is empty
+ if [[ `find $dirname -type f` == "" ]]; then
+ echo $dirname": directory empty."
+ exit 1;
+ fi;
+
+# prevent automatic overwriting of target
+ if [[ -e $mboxfile ]]; then \
+ dialogtext="Write file "$mboxfile"?";
+ if dialog --yesno "$dialogtext" 10 60; then
+ clear;
+ rm -vf $mboxfile;
+ else
+ clear; exit 1;
+ fi;
+ fi;
+
+ echo "writing xfmail mail directory '$1' to '$mboxfile'.";
+
+# collect files inside Xfmail mail-directory and produce MBOX format
+# target file
+ for i in `find $1/* -type f`; do
+# output progress information
+ echo -n -e \\r" "
+ echo -n -e \\rprocessing $i
+# look for senders email address in the order
+# 'From:'
+# 'X-From-Line:'
+# 'Reply-To:'
+ shortfromflag='true';
+ fromline=`grep 'From:' $i`;
+# parse 'From:' field
+ from=`echo $fromline | awk 'BEGIN{FS="<";}{if($0~/</) {pos=index($2,">");if(pos!=0) {print substr($2,1,pos-1);}} else {pos=index($0,":");print substr($0,pos+1);}}'`;
+ if [[ $from == "" ]]; then
+ shortfromflag='false';
+ fromline=`grep 'X-From-Line:' $i`;
+ from=`echo $fromline | awk 'BEGIN{FS="Line:";}{print $2;}'`;
+ if [[ $from == "" ]]; then
+ shortfromflag='true';
+ fromline=`grep 'Reply-To:' $i`;
+# parse 'Reply-To:' field
+ from=`echo $fromline | awk 'BEGIN{FS="<";}{if($0~/</) {pos=index($2,">");if(pos!=0) {print substr($2,1,pos-1);}} else {pos=index($0,":");print substr($0,pos+1);}}'`;
+ if [[ $from == "" ]]; then
+ echo;
+ echo "WARNING: "$i": no 'From:' nor 'X-From-Line:' nor 'Reply-To:' field found." >&2;
+ continue;
+ fi;
+ fi;
+ fi;
+ if [[ $shortfromflag == "true" ]]; then
+# parse date field
+ dateline=`grep 'Date:' $i`;
+ if [[ $dateline == "" ]]; then
+# set dummy date if no date field found
+ dateline="Date: Thu, 01 Jan 1970 00:00:00 +0000 (GMT)";
+ fi;
+ weekday=`echo $dateline | awk '{gsub(/,/,"",$2);print $2;}'`;
+ day=`echo $dateline | awk '{print $3;}'`;
+ month=`echo $dateline | awk '{print $4;}'`;
+ year=`echo $dateline | awk '{print $5;}'`;
+ time=`echo $dateline | awk '{print $6;}'`;
+ diffGMT=`echo $dateline | awk '{print $7;}'`;
+ timezone=`echo $dateline | awk '{print $8;}'`;
+
+# output MBOX mail header
+ echo "From " $from $weekday $month $day $time $year >> $mboxfile;
+ else
+# output long MBOX mail header found in 'X-From-Line:' field
+ echo $from >> $mboxfile;
+ fi;
+
+# output mail itself
+ cat $i >> $mboxfile;
+ done;
+ echo;
+else
+ echo $1": not a directory.";
+fi;
diff --git a/etc/hypermail/reverse-summary-order.sh b/etc/hypermail/reverse-summary-order.sh
new file mode 100755
index 0000000..4845cac
--- /dev/null
+++ b/etc/hypermail/reverse-summary-order.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+if [ -n "$1" ]; then
+ echo "" > /tmp/summary-rows
+ while read line; do
+ if [ -n "$(echo $line | grep '<tr><td>')" ]; then
+ echo $line >> /tmp/summary-rows
+ else
+ if [ -n "$(echo $line | grep '</table>')" ]; then
+ tac /tmp/summary-rows
+ fi
+ echo $line
+ fi
+ done < $1
+else
+ echo "Error in reverse sorting summary."
+fi
diff --git a/etc/hypermail/styles.css b/etc/hypermail/styles.css
new file mode 100755
index 0000000..7df2339
--- /dev/null
+++ b/etc/hypermail/styles.css
@@ -0,0 +1,226 @@
+html {
+ position: relative;
+ height: 100%;
+}
+
+html, body {
+ overflow-x: hidden;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ background-color: white;
+ color: #111;
+ font-family: "Open Sans", sans-serif;
+ font-size: .9em;
+ position: relative;
+ min-height: 100%;
+}
+
+.head_top {
+ background: #eee; /* Old browsers */
+ /* IE9 SVG, needs conditional override of 'filter' to 'none' */
+ background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNDAlIiBzdG9wLWNvbG9yPSIjZWVlZWVlIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjZWVlZWVlIiBzdG9wLW9wYWNpdHk9IjEiLz4KICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RkZGRkZCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgPC9saW5lYXJHcmFkaWVudD4KICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2dyYWQtdWNnZy1nZW5lcmF0ZWQpIiAvPgo8L3N2Zz4=");
+ background: -moz-linear-gradient(-45deg, #ffffff 0%, #eeeeee 40%, #eeeeee 75%, #dddddd 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, right bottom, color-stop(0%,#ffffff), color-stop(40%,#eeeeee), color-stop(75%,#eeeeee), color-stop(100%,#dddddd)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(-45deg, #ffffff 0%,#eeeeee 40%,#eeeeee 75%,#dddddd 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(-45deg, #ffffff 0%,#eeeeee 40%,#eeeeee 75%,#dddddd 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(-45deg, #ffffff 0%,#eeeeee 40%,#eeeeee 75%,#dddddd 100%); /* IE10+ */
+ background: linear-gradient(135deg, #ffffff 0%,#eeeeee 40%,#eeeeee 75%,#dddddd 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#dddddd',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
+ vertical-align: top;
+ border-color: #17a;
+
+ position: relative;
+ z-index: 1;
+
+ width: 100%;
+ display: inline-block;
+ margin: 0 0 -4px 0; /* in bottom -4px to remove unneeded space after object with inline-block */
+ padding: 0;
+ border-style: none none solid none;
+}
+
+.head, #navbar ul {
+ /* background: #e8f1f6; */
+ /* generate on http://www.colorzilla.com/gradient-editor/ */
+ /* background: #def0f9; */ /* Old browsers */
+ background: #d3e5ef;
+ /* IE9 SVG, needs conditional override of 'filter' to 'none' */
+ background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2RlZjBmOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iI2QzZTVlZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2QzZTVlZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNiM2M1Y2YiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+");
+ background: -moz-linear-gradient(top, #def0f9 0%, #d3e5ef 10%, #d3e5ef 70%, #b3c5cf 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#def0f9), color-stop(10%,#d3e5ef), color-stop(70%,#d3e5ef), color-stop(100%,#b3c5cf)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #def0f9 0%,#d3e5ef 10%,#d3e5ef 70%,#b3c5cf 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #def0f9 0%,#d3e5ef 10%,#d3e5ef 70%,#b3c5cf 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #def0f9 0%,#d3e5ef 10%,#d3e5ef 70%,#b3c5cf 100%); /* IE10+ */
+ background: linear-gradient(to bottom, #def0f9 0%,#d3e5ef 10%,#d3e5ef 70%,#b3c5cf 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#def0f9', endColorstr='#b3c5cf',GradientType=0 ); /* IE6-8 */
+ border-style: none none solid none;
+ border-color: #8db2c5;
+ margin: 0;
+ padding: 1.7em 2.3em;
+
+}
+.head #navbar ul {
+ background: none;
+ border: none;
+ padding: .5em .3em;
+}
+.head ul.links {
+ padding: 0em .3em;
+}
+
+.head h1 {
+ margin: 0;
+}
+
+.mail {
+ /* for centering use: margin: 0 auto; */
+ /*max-width: 54em;*/
+ margin: 0;
+ padding: 1.4em 1.4em;
+ overflow: hidden;
+}
+
+.foot {
+ background: #eee;
+ border-color: #d3e5ef;
+ border-style: solid none;
+ margin: 0;
+ padding: 0;
+}
+
+.links {
+ margin: 0;
+ padding: 0.7em 2em;
+}
+
+.footer {
+ background-color: #0D597F;
+ font-size: .7em;
+ color: white;
+ text-align: center;
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+ margin: 0;
+ padding: 0.7em;
+ height: 1.1em; /* height with padding is 1.8em */
+ overflow: hidden;
+}
+.footer a, .footer a:link, .footer a:hover, .footer a:active, .footer a:visited {
+ color: #CDCDCD;
+}
+
+.alpine-logo {
+ font-size: 425%;
+ color: #0D597F;
+ padding: .1em .5em .0765em .25em;
+}
+a.alpine-logo:hover, a.alpine-logo:active {
+ text-decoration: none;
+}
+
+#title {
+ float: right;
+ padding-right: 1em;
+}
+#title h1 {
+ text-align: right;
+}
+
+.left { float: left; }
+.right { float: right; }
+
+a { color: #0D597F; text-decoration: none; }
+a:hover, a:active { text-decoration: underline; }
+
+h1, h2, h3, h4 {
+ margin: 1em 1ex 0.5ex 0;
+ color: #0D597F;
+}
+h1 { font-size: 1.4em; }
+h2 { font-size: 1.3em; }
+h3 { font-size: 1.2em; }
+h4 { font-size: 1.1em; }
+
+table {
+ text-align: left;
+ border-spacing: 0;
+ margin: 1.7em 1.4em 3.2em 1.4em;
+ /* there is a footer (with position: absolute) in the bottom */
+}
+.center table {
+ margin: 1.4em; /* without extra 1.8em in the bottom */
+ /* in this case there is a .foot who makes bottom-margin */
+}
+table.archive_list td {
+ font-size: 100%;
+}
+.foot {
+ margin-bottom: 1.8em;
+ /* there is a footer (with position: absolute) in the bottom */
+}
+
+tr:hover td {
+ background-color: #EDEDED;
+}
+td {
+ vertical-align: top;
+ padding: .1em .5em .1em .7em;
+ border-bottom: 1px solid #DCDCDC;
+ font-size: 85%;
+}
+
+.center, .mail, li{
+ font-size: 95%;
+}
+
+/* .foot should not be inside ul li but hypermate generates it so */
+/* fix */
+ul li .foot {
+ margin: 1em 1em 0 -2.5em;
+ padding: 1.4em 0;
+ font-size: 1.1em;
+ background: none;
+ border: none;
+}
+ul li .foot ul li {
+ list-style: disc;
+}
+.searchbox {
+ margin: 0;
+ padding: 1.5em 1.4em 0 1.4em;
+}
+.searchbox form {
+ margin-top: .3em;
+}
+.searchbox a {
+ font-size:90%
+}
+
+
+@media all and (max-width:32.000em) {
+ .alpine-logo {
+ font-size: 325%;
+ width: 100%;
+ background-color: white;
+ text-align: center;
+ padding: .2em .1em .0765em 0;
+ }
+ .head, .foot, #title, ul, #navbar a, ul {
+ padding: 0;
+ margin: 0;
+ }
+ ul {
+ padding: .5em;
+ }
+ #navbar ul {
+ padding-top: 1em;
+ padding-bottom: 1em;
+ }
+ #title h1 {
+ margin: 0;
+ }
+}
diff --git a/etc/periodic/15min/hyperarchives b/etc/periodic/15min/hyperarchives
new file mode 100755
index 0000000..ef4b68b
--- /dev/null
+++ b/etc/periodic/15min/hyperarchives
@@ -0,0 +1,63 @@
+#!/bin/sh
+# Brute Force the hypermail archives each evening
+
+
+candidates="$(find /var/spool/mlmmj -type d -name "archive" | sed "s-/archive--; s-^.*/--")"
+
+for x in $candidates; do
+ /etc/hypermail/mdir2mbox.lua /var/spool/mlmmj/$x/archive 2>/dev/null 1>/tmp/archive.mbox
+ rm -rf /var/www/domains/lists.alpinelinux.org/www/$x
+ hypermail -c /etc/hypermail/hmrc -d /var/www/domains/lists.alpinelinux.org/www/$x \
+ -m /tmp/archive.mbox -l "$x" -s html -T 2>/dev/null 1>/dev/null
+ rm /tmp/archive.mbox
+ cp /etc/hypermail/*.css /var/www/domains/lists.alpinelinux.org/www/$x/
+ sh /etc/hypermail/reverse-summary-order.sh /var/www/domains/lists.alpinelinux.org/www/$x/summary.html > /tmp/summary.html
+ mv /tmp/summary.html /var/www/domains/lists.alpinelinux.org/www/$x/summary.html
+done
+
+cp /etc/hypermail/styles.css /var/www/domains/lists.alpinelinux.org/www/
+
+cat >/var/www/domains/lists.alpinelinux.org/www/index.html <<-EOF
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="generator" content="hypermail, see http://www.hypermail-project.org/" />
+ <title>lists.alpinelinux.org Mail archives</title>
+ <meta name="%l" content="%s" />
+ <link rel="stylesheet" type="text/css" href="styles.css"/>
+ <link rel="stylesheet" type="text/css" href="http://alpinelinux.org/font.css"/> <!-- logo -->
+ <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600" />
+ <link rel="shortcut icon" href="http://alpinelinux.org/alpine-logo.ico" />
+</head>
+<body>
+ <div class="head_top">
+ <a class="alpine-logo left" href="http://alpinelinux.org"><span class="icon-alpine-logo"></span></a>
+ <div id="title"><h1>lists.alpinelinux.org<br />Mail archives</h1></div>
+ </div>
+ <div class="searchbox">
+ &nbsp; Google site search for <a href="http://lists.alpinelinux.org">http://lists.alpinelinux.org</a>
+ <form method="get" action="http://www.google.com/search?query">
+ <input size="50" name="query" value="">
+ <input type="hidden" name="sitesearch" value="lists.alpinelinux.org">
+ <input type="submit" value="Search">
+ </form>
+ </div>
+ <table class="archive_list">
+EOF
+
+for x in $candidates; do
+ echo "
+ <tr>
+ <td><a href=\"$x/summary.html\">$x</a></td>
+ <td><a href=\"$x/summary.html\">summary</a></td>
+ <td><a href=\"$x/index.html\">all</a></td>
+ </tr>
+ " >> /var/www/domains/lists.alpinelinux.org/www/index.html
+done
+cat >>/var/www/domains/lists.alpinelinux.org/www/index.html <<-EOF
+ </table>
+ <div class="footer">© Copyright 2015 Alpine Linux Development Team all rights reserved | <a href="/privacy-policy.html">Privacy Policy</a></div>
+</body>
+</html>
+EOF