summaryrefslogtreecommitdiff
path: root/chaski/services
diff options
context:
space:
mode:
authorstuebinm2022-01-18 09:43:24 +0100
committerstuebinm2022-01-20 13:19:44 +0100
commit0bcabe1c4b1dd74af233674dfa6c6ec3011ce2c0 (patch)
tree5c58943f99245ff7f745f50b46c34ae288c3e503 /chaski/services
parentdb83a406bc6e63289e47ff5d2228c08430832655 (diff)
restructuring directories
Diffstat (limited to 'chaski/services')
-rw-r--r--chaski/services/VaaS/.gitignore1
-rw-r--r--chaski/services/VaaS/CHANGELOG.md5
-rw-r--r--chaski/services/VaaS/app/Main.hs58
-rw-r--r--chaski/services/VaaS/default.nix30
-rw-r--r--chaski/services/VaaS/haskell.cabal35
-rw-r--r--chaski/services/VaaS/index.html46
-rw-r--r--chaski/services/geolocation.nix6
-rw-r--r--chaski/services/gtfs.nix38
-rw-r--r--chaski/services/jitsi.nix59
-rw-r--r--chaski/services/uplcg.nix23
-rw-r--r--chaski/services/woitb.nix32
-rw-r--r--chaski/services/woitb/index.html124
-rw-r--r--chaski/services/woitb/info.html180
13 files changed, 637 insertions, 0 deletions
diff --git a/chaski/services/VaaS/.gitignore b/chaski/services/VaaS/.gitignore
new file mode 100644
index 0000000..b5e3679
--- /dev/null
+++ b/chaski/services/VaaS/.gitignore
@@ -0,0 +1 @@
+dist-newstyle/*
diff --git a/chaski/services/VaaS/CHANGELOG.md b/chaski/services/VaaS/CHANGELOG.md
new file mode 100644
index 0000000..500a0d0
--- /dev/null
+++ b/chaski/services/VaaS/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for haskell
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/chaski/services/VaaS/app/Main.hs b/chaski/services/VaaS/app/Main.hs
new file mode 100644
index 0000000..b5697d7
--- /dev/null
+++ b/chaski/services/VaaS/app/Main.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Main where
+
+import Control.Exception (try)
+import Control.Exception.Base (handle)
+import qualified Data.ByteString as BS
+import Data.ByteString.Base32
+import qualified Data.ByteString.Char8 as C8
+import qualified Data.ByteString.Lazy as LB
+import Data.Maybe (mapMaybe)
+import Network.HTTP.Client (httpLbs, newManager, parseRequest,
+ responseBody)
+import Network.HTTP.Client.TLS
+import Network.HTTP.Types
+import Network.Wai
+import Network.Wai.Handler.Warp (run)
+import qualified System.Environment as SE
+import System.Process
+
+simpleResponse = responseLBS status200 [("Content-Type", "text/plain")]
+
+simpleError = responseLBS status400 [("Content-Type", "text/plain")]
+
+serveFile filename = do
+ content <- LB.readFile filename
+ pure $ responseLBS status200 [("Content-Type", "text/html")] content
+
+app :: FilePath -> FilePath -> Application
+app validator index req respond =
+ case requestMethod req of
+ "GET" -> case pathInfo req of
+ [] -> serveFile index >>= respond
+ ["validate"] -> do
+ let gtfsuri = head $ mapMaybe (\case { ("gtfs",a) -> Just a; _ -> Nothing }) $ queryString req
+ putStrLn $ "uri is " <> show gtfsuri
+ case gtfsuri of
+ Just uri -> do
+ man <- newManager tlsManagerSettings
+ request <- parseRequest $ C8.unpack uri
+ gtfs <- httpLbs request man
+ let filename = "/tmp/" <> C8.unpack (encodeBase32' uri) <> ".zip"
+ LB.writeFile filename (responseBody gtfs)
+ readProcessWithExitCode "python" [validator,"-n", filename, "--output", "/tmp/gtfs-validated.html"] ""
+
+ serveFile "/tmp/gtfs-validated.html" >>= respond
+
+ Nothing -> respond $ simpleError "missing gtfs parameter"
+ _ -> respond $ simpleError "unknown path"
+ _ -> respond $ simpleError "invalid reqeust method"
+
+main :: IO ()
+main = do
+ args <- SE.getArgs
+ let validator = head args
+ putStrLn "http://localhost:7000/"
+ run 7000 $ app validator (args!!1)
diff --git a/chaski/services/VaaS/default.nix b/chaski/services/VaaS/default.nix
new file mode 100644
index 0000000..427270c
--- /dev/null
+++ b/chaski/services/VaaS/default.nix
@@ -0,0 +1,30 @@
+{ pkgs, compiler ? "default", doBenchmark ? false }:
+
+let
+
+ inherit pkgs;
+
+ f = { mkDerivation, base, base32, bytestring, http-client
+ , http-client-tls, http-types, lib, process, wai, warp
+ }:
+ mkDerivation {
+ pname = "VaaS";
+ version = "0.1.0.0";
+ src = ./.;
+ isLibrary = false;
+ isExecutable = true;
+ executableHaskellDepends = [
+ base base32 bytestring http-client http-client-tls http-types
+ process wai warp
+ ];
+ license = "unknown";
+ hydraPlatforms = lib.platforms.none;
+ };
+
+ haskellPackages = if compiler == "default"
+ then pkgs.haskellPackages
+ else pkgs.haskell.packages.${compiler};
+
+ variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;
+in
+ variant (haskellPackages.callPackage f {})
diff --git a/chaski/services/VaaS/haskell.cabal b/chaski/services/VaaS/haskell.cabal
new file mode 100644
index 0000000..262b65f
--- /dev/null
+++ b/chaski/services/VaaS/haskell.cabal
@@ -0,0 +1,35 @@
+cabal-version: 2.4
+name: VaaS
+version: 0.1.0.0
+
+-- A short (one-line) description of the package.
+-- synopsis:
+
+-- A longer description of the package.
+-- description:
+
+-- A URL where users can report bugs.
+-- bug-reports:
+
+-- The license under which the package is released.
+-- license:
+author: stuebinm
+maintainer: stuebinm@disroot.org
+
+-- A copyright notice.
+-- copyright:
+-- category:
+extra-source-files: CHANGELOG.md
+
+executable VaaS
+ main-is: Main.hs
+
+ -- Modules included in this executable, other than Main.
+ -- other-modules:
+
+ -- LANGUAGE extensions used by modules in this package.
+ -- other-extensions:
+ build-depends: base ^>=4.14.1.0, wai, warp, http-types, bytestring, process,
+ http-client, http-client-tls, base32
+ hs-source-dirs: app
+ default-language: Haskell2010
diff --git a/chaski/services/VaaS/index.html b/chaski/services/VaaS/index.html
new file mode 100644
index 0000000..a7f59e0
--- /dev/null
+++ b/chaski/services/VaaS/index.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<html class="no-js" lang="">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
+ <title>GTFS Validator</title>
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png">
+ <!-- Place favicon.ico in the root directory -->
+
+ </head>
+ <body>
+ <!--[if lt IE 8]>
+ <p class="browserupgrade">
+ You are using an <strong>outdated</strong> browser. Please
+ <a href="http://browsehappy.com/">upgrade your browser</a> to improve
+ your experience.
+ </p>
+ <![endif]-->
+
+ <h1>GTFS Validator</h1>
+ <p>
+ This runs the validator contained in the
+ <a href="https://github.com/google/transitfeed">transitfeed
+ git repository
+ </a>.
+ </p>
+
+ <p>Paste the url to your GTFS zip below</p>
+
+ <input id="url">
+ <button id="submit">Validate</button>
+
+ <script>
+ let submit = document.getElementById("submit");
+ let url = document.getElementById("url");
+
+ submit.onclick = () => {
+ window.location =
+ "/validate?gtfs=" + url.value
+ }
+ </script>
+ </body>
+</html>
diff --git a/chaski/services/geolocation.nix b/chaski/services/geolocation.nix
new file mode 100644
index 0000000..9fe0973
--- /dev/null
+++ b/chaski/services/geolocation.nix
@@ -0,0 +1,6 @@
+{ config, lib, pkgs, ... }:
+
+{
+ services.nginx.virtualHosts."ilztal.live".locations."/geolocation".root =
+ ../ilztal.live;
+}
diff --git a/chaski/services/gtfs.nix b/chaski/services/gtfs.nix
new file mode 100644
index 0000000..61837a1
--- /dev/null
+++ b/chaski/services/gtfs.nix
@@ -0,0 +1,38 @@
+{ config, lib, pkgs, ... }:
+
+let
+ vaas = import ./VaaS/default.nix {inherit pkgs; };
+
+ transitfeed = pkgs.fetchFromGitHub {
+ owner = "google";
+ repo = "transitfeed";
+ rev = "d727e97cb66ac2ca2d699a382ea1d449ee26c2a1";
+ sha256 = "0kmcmdja6h7gzvi40c9qfzxh6qwv5184g2rgpqx5rhj4ql9ini3h";
+ };
+
+ index = pkgs.copyPathToStore ./VaaS/index.html;
+in
+{
+ systemd.services.vaas = {
+ enable = true;
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target" ];
+ description = "GTFS feed validator as a service";
+ path = [ pkgs.python2 pkgs.python2Packages.pytz pkgs.python2Packages.enum34 ];
+ serviceConfig = {
+ ExecStart = "${vaas}/bin/VaaS ${transitfeed}/feedvalidator.py ${index}";
+ Restart = "always";
+ PrivateTmp = "true";
+ PrivateDevices = "true";
+ ProtectSystem = "strict";
+ ReadWritePaths = [ "/tmp" ];
+ };
+
+ };
+
+ services.nginx.virtualHosts."gtfs.stuebinm.eu" = {
+ enableACME = true;
+ forceSSL = true;
+ locations."/".proxyPass = "http://localhost:7000";
+ };
+}
diff --git a/chaski/services/jitsi.nix b/chaski/services/jitsi.nix
new file mode 100644
index 0000000..d6f398b
--- /dev/null
+++ b/chaski/services/jitsi.nix
@@ -0,0 +1,59 @@
+{config, pkgs, ...}:
+
+with pkgs.luaPackages;
+with pkgs;
+let extraLua = import ../../../../playground/jitsi/test.nix;
+in
+
+{
+ services.jitsi-meet = {
+ enable = true;
+ hostName = "jitsi.stuebinm.eu";
+ config = {
+ enableWelcomePage = true;
+ prejoinPageEnabled = true;
+ };
+ interfaceConfig = {
+ SHOW_JITSI_WATERMARK = false;
+ SHOW_WATERMARK_FOR_GUESTS = false;
+ };
+ };
+ services.jitsi-videobridge.openFirewall = true;
+
+ services.nginx.virtualHosts."api.jitsi.stuebinm.eu" = {
+ locations."/room-size" = {
+ proxyPass = pkgs.lib.mkForce
+ "http://jitsi.stuebinm.eu:5280/room-size?$args&domain=jitsi.stuebinm.eu";
+
+ extraConfig = ''
+ add_header Access-Control-Allow-Origin *;
+ '';
+ };
+ locations."/room-list" = {
+ proxyPass = "http://jitsi.stuebinm.eu:5280/room-list?domain=jitsi.stuebinm.eu";
+ extraConfig = ''
+ add_header Access-Control-Allow-Origin *;
+ '';
+ };
+ locations."/dashboard/".root =
+ pkgs.copyPathToStore ../../../../playground/jitsi/html;
+
+ enableACME = true;
+ forceSSL = true;
+ };
+
+ services.nginx.recommendedProxySettings = false;
+
+ services.prosody = {
+ #extraModules = [ "muc_size2" ];
+ extraModules = [ "jitsi_bundled" ];
+ extraPluginPaths = [
+ (pkgs.copyPathToStore ../../../../playground/jitsi/plugins)
+ ];
+ package = pkgs.prosody.override {
+ withExtraLibs = with extraLua; [ basexx luajwtjitsi net-url ];
+ };
+ };
+
+
+}
diff --git a/chaski/services/uplcg.nix b/chaski/services/uplcg.nix
new file mode 100644
index 0000000..5605046
--- /dev/null
+++ b/chaski/services/uplcg.nix
@@ -0,0 +1,23 @@
+{ config, lib, pkgs, inputs, ... }:
+
+{
+ imports = [
+ "${inputs.uplcg.outPath}/module.nix"
+ ];
+
+ services.uplcg = {
+ enable = true;
+ port = 9080;
+ domain = "0.0.0.0";
+ };
+
+ services.nginx.enable = true;
+ services.nginx.virtualHosts."cards.stuebinm.eu" = {
+ locations."/" = {
+ proxyPass = "http://localhost:9080";
+ proxyWebsockets = true;
+ };
+ enableACME = true;
+ forceSSL = true;
+ };
+}
diff --git a/chaski/services/woitb.nix b/chaski/services/woitb.nix
new file mode 100644
index 0000000..0c50617
--- /dev/null
+++ b/chaski/services/woitb.nix
@@ -0,0 +1,32 @@
+{ config, lib, pkgs, inputs, ... }:
+
+let
+ #sources = ../../nix/sources.nix;
+ sources = /home/stuebinm/Dokumente/utils/playground/ilztal/server;
+in
+{
+ # systemd.services.woitb = {
+ # enable = true;
+ # description = "wo ist die ilztalbahn?";
+ # wantedBy = [ "multi-user.target" ];
+ # serviceConfig.type = "simple";
+ # script = "${import sources}/bin/woitb";
+ # };
+
+ services.nginx.enable = true;
+ services.nginx.virtualHosts."ilztal.live" = {
+ enableACME = true;
+ forceSSL = true;
+ locations."/".root = pkgs.copyPathToStore ./woitb;
+
+ # locations."/upnext".proxyPass = "http://localhost:8000";
+ # locations."/geoloc".proxyPass = "http://localhost:8000";
+ };
+
+ services.nginx.virtualHosts."track.ilztal.live" = {
+ enableACME = true;
+ forceSSL = true;
+ locations."/".root = inputs.tracktrain;
+ };
+
+}
diff --git a/chaski/services/woitb/index.html b/chaski/services/woitb/index.html
new file mode 100644
index 0000000..8d08826
--- /dev/null
+++ b/chaski/services/woitb/index.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html lang="de"><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <meta charset="utf-8">
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
+ <title>Wo ist die Ilztalbahn?</title>
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <link rel="apple-touch-icon" href="https://ilztal.live/apple-touch-icon.png">
+ <!-- Place favicon.ico in the root directory -->
+ <style>
+
+ body {
+ background-color: olivedrab;
+ color: white;
+ font-family: "Sans Serif";
+ max-width: 60em;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 4em;
+ }
+
+ body > p, #sonst p {
+ text-align: center;
+ margin-bottom: 4rem;
+ }
+
+ section > p {
+ text-align: center;
+ }
+
+ a {
+ text-decoration: none;
+ }
+
+ h1, h2, h3 {
+ font-weight: lighter
+ }
+
+ h1 {
+ font-size: 40pt;
+ text-align: center;
+ }
+
+ @media only screen and (max-width: 1000px) {
+ h1 {
+ font-size: 30pt;
+ }
+ body {
+ margin: 1em;
+ }
+ }
+
+ h2 {
+ font-size: 23pt;
+ }
+
+ tr {
+ background-color: white;
+ color: black;
+ }
+
+ td {
+ margin-left: 0;
+ padding: 0.5em;
+ }
+
+ #wo {
+ color: black;
+ background-color: white;
+ padding: 1em;
+ max-width: 40em;
+ margin: auto;
+ font-weight: bold;
+ }
+
+ #wo div h2 {
+ margin-left: 2rem;
+ }
+
+ #wo div p {
+ margin-left: 3rem;
+ }
+
+ #fahrplan {
+ margin: auto;
+ max-width: 40em;
+ }
+
+ #fahrplan table tr td:last-child {
+ min-width: 70%;
+ }
+
+ #fahrplan table {
+ width: 100%;
+ }
+
+ </style>
+ </head>
+ <body>
+ <!--[if lt IE 8]>
+ <p class="browserupgrade">
+ You are using an <strong>outdated</strong> browser. Please
+ <a href="http://browsehappy.com/">upgrade your browser</a> to improve
+ your experience.
+ </p>
+ <![endif]-->
+
+ <h1>Wo ist die <a href="https://ilztalbahn.eu/">Ilztalbahn</a> gerade?</h1>
+
+ <p>(es gibt eh nur eine)</p>
+
+ <div id="root"><main id=""><h2 id="">Gerade nicht unterwegs</h2><div id="wo"><h2 id="">Nächste Fahrt 2022</h2><p id="">Fahrplan ist noch nicht bekannt.</p></div></main></div>
+
+ <section>
+ <p>Andere Abfahrten ab Passau <a href="https://marudor.de/NPA">via marudor.de</a> | <a href="https://iris.noncd.db.de/wbt/js/index.html?bhf=NPA&amp;Zeilen=20">via Iris der DB</a></p>
+
+ <p style="margin-top:3em">(Diese Seite also known as "oh, die Ilztalbahn <a href="https://ilztalbahn.eu/wp-content/uploads/2020/07/gtfs.zip">hat ja Open Data</a> 😍" – <a href="https://ilztal.live/info.html">Weitere Infos</a>)</p>
+ </section>
+
+
+
+</body></html>
diff --git a/chaski/services/woitb/info.html b/chaski/services/woitb/info.html
new file mode 100644
index 0000000..e68d728
--- /dev/null
+++ b/chaski/services/woitb/info.html
@@ -0,0 +1,180 @@
+<!doctype html>
+<html lang="de">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
+ <title>Wo ist die Ilztalbahn?</title>
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png">
+ <!-- Place favicon.ico in the root directory -->
+ <style>
+
+ body {
+ background-color: olivedrab;
+ color: white;
+ font-family: "Sans Serif";
+ max-width: 60em;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 4em;
+ }
+
+ body > p, #sonst p {
+ text-align: center;
+ margin-bottom: 4rem;
+ }
+
+ section > p {
+ text-align: center;
+ }
+
+ a {
+ text-decoration: none;
+ }
+
+ h1, h2, h3 {
+ font-weight: lighter
+ }
+
+ h1 {
+ font-size: 40pt;
+ text-align: center;
+ }
+
+ @media only screen and (max-width: 1000px) {
+ h1 {
+ font-size: 30pt;
+ }
+ body {
+ margin: 1em;
+ }
+ }
+
+ h2 {
+ font-size: 23pt;
+ }
+
+ tr {
+ background-color: white;
+ color: black;
+ }
+
+ td {
+ margin-left: 0;
+ padding: 0.5em;
+ }
+
+ #wo {
+ color: black;
+ background-color: white;
+ padding: 1em;
+ max-width: 40em;
+ margin: auto;
+ font-weight: bold;
+ }
+
+ #wo div h2 {
+ margin-left: 2rem;
+ }
+
+ #wo div p {
+ margin-left: 3rem;
+ }
+
+ #fahrplan {
+ margin: auto;
+ max-width: 40em;
+ }
+
+ #fahrplan table tr td:last-child {
+ min-width: 70%;
+ }
+
+ #fahrplan table {
+ width: 100%;
+ }
+
+ </style>
+ </head>
+ <body>
+ <!--[if lt IE 8]>
+ <p class="browserupgrade">
+ You are using an <strong>outdated</strong> browser. Please
+ <a href="http://browsehappy.com/">upgrade your browser</a> to improve
+ your experience.
+ </p>
+ <![endif]-->
+
+ <h1><a href="index.html">Wo ist die Ilztalbahn</a> – Über</h1>
+
+ <main>
+ <h2>Was ist das hier?</h2>
+ <p>
+ Diese Webseite zeigt den Fahrplan der <a href="https://ilztalbahn.eu">Ilztalbahn</a> an,
+ und macht sonst nicht viel. Bitte beachtet, dass diese Seite nicht von der Ilztalbahn GmbH,
+ dem Förderverein o.ä. betrieben wird, sondern nur ein privates Projekt einer einzelnen Person
+ ohne jede Verfügbarkeitsgarantie ist.
+ </p>
+
+ <h2>Wie funktioniert das?</h2>
+ <p>
+ Die Ilztalbahn bietet ihren Fahrplan im offenen Standard <a href="https://gtfs.org/">GTFS</a>
+ an. Weil GTFS an einigen Stellen ein manchmal schwer zu benutzender Standard ist (und nicht
+ jeder Besuch dieser Webseite einen Aufruf des GTFS der Ilztalbahn triggern muss), hängt noch
+ ein kleiner Server dazwischen der die relevanten Teile in JSON übersetzt.
+ </p>
+ <p>
+ Der Fahrplan ist jeweils für einen ganzen Sommer gültig, und wird auch währenddessen
+ (soweit ich sehen kann) nicht verändert oder aktualisiert — es gibt also keinerlei Garantie,
+ dass die Daten hier korrekt sind!
+ </p>
+
+ <h2>Gibt es das auch als App?</h2>
+ <p>
+ Aktuell nicht. Wenn ihr die Webseite im Browser offen lasst, sollte sie sich aber auch offline
+ noch automatisch aktualisieren.
+ </p>
+
+ <h2>Werden Verspätungen/etc. angezeigt?</h2>
+ <p>
+ Leider nein. Es gibt für einige Fahrten der Ilztalbahn zwar Echtzeitdaten von der DB, diese
+ sind aber nicht im Datensatz der Ilztalbahn enthalten. Vielleicht kommen die hier noch
+ irgendwann mit rein, solange könnt ihr sie (falls es sie gibt) bei
+ <a href="https://marudor.de/Passau%20Hbf">marudor.de</a> anschauen.
+ </p>
+
+ <h2>Gibts hier Quellcode zu?</h2>
+ <p>
+ Ja klar, hier: <a href="https://stuebinm.eu/git/woitb">git-Repository</a>
+ </p>
+
+ <h2>Datenschutz?</h2>
+ <p>
+ Diese Seite läuft aktuell auf einer kleinen vps bei <a href="https://hetzner.de">Hetzner</a>,
+ geloggt werden aktuell nur Zugriffe, aber keine IP-Adressen.
+ </p>
+
+ <h2>Wer macht das hier?</h2>
+ <p>
+ Auch nur so ein Mensch im Internet. Falls ihr wollt könnt ihr
+ <a href="https://pleroma.stuebinm.eu/stuebinm">auf meinem Pleroma</a> vorbeischauen.
+ </p>
+
+ <h2>Ich hab ne Idee für ein Feature!</h2>
+ <p>
+ Schreibt mich über Pleroma an, vielleicht habe ich Zeit und Lust es einzubauen.
+ </p>
+
+ <h2>Ich hab ein Feature dazuimplementiert!</h2>
+ <p>
+ Cool! Schick mir gerne nen Patch! (Mail ist im Repository)
+ </p>
+ </main>
+ <section>
+ <p style="margin-top:3em;">(Diese Seite also known as "oh, die Ilztalbahn <a href="https://ilztalbahn.eu/wp-content/uploads/2020/07/gtfs.zip">hat ja Open Data</a> 😍" – <a href="info.html">Weitere Infos</a>)</p>
+ </section>
+
+ </body>
+</html>