From cb0a115ec4c6e5371e828cd479ca16f864bb46c4 Mon Sep 17 00:00:00 2001
From: nd <git@notandy.de>
Date: Sat, 11 Dec 2021 16:03:56 +0100
Subject: [PATCH] add an image to simply create directory listenings

---
 .gitlab-ci.yml                                |   2 +-
 ...erfile.debian-bullseye-directory-listening |   8 ++
 directory-listening/create-index.py           | 100 ++++++++++++++++++
 3 files changed, 109 insertions(+), 1 deletion(-)
 create mode 100644 Dockerfile.debian-bullseye-directory-listening
 create mode 100755 directory-listening/create-index.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0045f10..bdc262d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,4 +8,4 @@ build-buster:
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile.debian-buster-mkdocs --destination $CI_REGISTRY_IMAGE/buster-mkdocs:$CI_COMMIT_TAG
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile.debian-buster-hugo --destination $CI_REGISTRY_IMAGE/buster-hugo:$CI_COMMIT_TAG
     - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile.debian-bullseye-hugo --destination $CI_REGISTRY_IMAGE/bullseye-hugo:$CI_COMMIT_TAG
-      
+    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile.debian-bullseye-directory-listening --destination $CI_REGISTRY_IMAGE/bullseye-directory-listening:$CI_COMMIT_TAG
diff --git a/Dockerfile.debian-bullseye-directory-listening b/Dockerfile.debian-bullseye-directory-listening
new file mode 100644
index 0000000..1d4f31d
--- /dev/null
+++ b/Dockerfile.debian-bullseye-directory-listening
@@ -0,0 +1,8 @@
+FROM debian:bullseye
+
+RUN apt-get -qq update && \
+    apt-get -qq dist-upgrade && \
+    apt-get -qq install python3 python3-jinja2 && \
+    apt-get -qq clean
+
+COPY directory-listening/create-index.py /usr/local/bin/create-index
diff --git a/directory-listening/create-index.py b/directory-listening/create-index.py
new file mode 100755
index 0000000..07be7ef
--- /dev/null
+++ b/directory-listening/create-index.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+import jinja2
+import os
+import sys
+from datetime import datetime
+
+def timestamp_to_datetime(timestamp):
+	return datetime.fromtimestamp(timestamp)
+
+def main(inputfolder, outputfolder, ignore_files):
+	jinjaenv = jinja2.Environment(autoescape=jinja2.select_autoescape())
+	jinjaenv.filters["timestamp_to_datetime"] = timestamp_to_datetime
+	template = jinjaenv.from_string("""<!DOCTYPE html>
+		<html>
+			<head>
+				<meta http-equiv="content-type" content="text/html; charset=utf-8">
+				<meta name="viewport" content="width=device-width">
+				<style type="text/css">
+					body,html {
+						background: #fff;
+						font-family: "Bitstream Vera Sans","Lucida Grande","Lucida Sans Unicode",Lucidux,Verdana,Lucida,sans-serif;
+					}
+					tr:nth-child(even) {
+						background:#f4f4f4;
+					}
+					th,td {
+						padding:0.1em 0.5em;
+					}
+					th {
+						text-align:left;
+						font-weight:bold;
+						background:#eee;
+						border-bottom:1px solid #aaa;
+					}
+					#list {
+						border:1px solid #aaa;
+						width:100%;
+					}
+					a {
+						color:#a33;
+					}
+					a:hover {
+						color:#e33;
+					}
+				</style>
+			</head>
+			<body>
+				<h1>Index of /{{ path }}</h1>
+				<table id="list">
+					<thead>
+						<tr>
+							<th style="width:55%">
+								File Name
+							</th>
+							<th style="width:20%">
+								File Size</th>
+							<th style="width:25%">
+								Date
+							</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr>
+							<td class="link">
+								<a href="../">Parent directory/</a>
+							</td>
+							<td class="size">-</td>
+							<td class="date">-</td>
+						</tr>
+						{% for entry, stat, is_dir in entries %}
+						<tr>
+							<td class="link">
+								<a href="{{ entry + ('/' if is_dir else '') }}" title="{{ entry }}">{{ entry  + ('/' if is_dir else '') }}</a>
+							</td>
+							<td class="size">{{ '-' if is_dir else stat.st_size|filesizeformat }}</td>
+							<td class="date">{{ (stat.st_mtime|timestamp_to_datetime).isoformat(timespec='seconds') }}</td>
+						</tr>
+						{% endfor  %}
+					</tbody>
+				</table>
+				<p><a href="https://legal.cccv.de">Impressum - Datenschutzerklärung</a></p>
+			</body>
+		</html>
+	""")
+	for path, dirs, files in os.walk(inputfolder):
+		relativ_path_to_input = os.path.relpath(path, inputfolder)
+		entries = [(i, os.stat(os.path.join(path, i)), i in dirs) for i in dirs+files if not i in ignore_files]
+		html_index = template.render(path=relativ_path_to_input, entries=entries)
+		html_index_folder = os.path.join(outputfolder, relativ_path_to_input)
+		html_index_path = os.path.join(html_index_folder, 'index.html')
+		os.makedirs(html_index_folder, exist_ok=True)
+		outputfile = open(html_index_path, "w")
+		outputfile.write(html_index)
+		outputfile.close()
+
+if __name__ == '__main__':
+	if len(sys.argv) != 3:
+		print(f'Usage: {sys.argv[0]} <directory tree to create index from> <output path for index tree>')
+		sys.exit(1)
+	main(inputfolder=sys.argv[1], outputfolder=sys.argv[2], ignore_files=['index.html'])
-- 
GitLab