diff options
author | sanine <sanine.not@pm.me> | 2023-01-12 17:24:25 -0600 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2023-01-12 17:24:25 -0600 |
commit | 655cd79991ec9204afb9f5acf52495c13af14d25 (patch) | |
tree | c2f441e09ce65337bb622183107a77c40c0dad0b | |
parent | 35de9c18b9c9ce7d466e5aecec0b4becde2795bb (diff) |
begin go refactorgo-dynamic
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | config.lua | 12 | ||||
-rw-r--r-- | data/about.lua (renamed from site_root/about.lua) | 0 | ||||
-rw-r--r-- | data/blog/03-remote_full_system_encryption_with_arch.lua (renamed from site_root/blog/03-remote_full_system_encryption_with_arch.lua) | 0 | ||||
-rw-r--r-- | data/blog/announcing_honeysuckle.lua (renamed from site_root/blog/announcing_honeysuckle.lua) | 0 | ||||
-rw-r--r-- | data/blog/refactor-argent.lua (renamed from site_root/blog/refactor-argent.lua) | 0 | ||||
-rw-r--r-- | data/cgit.css (renamed from site_root/cgit.css) | 0 | ||||
-rw-r--r-- | data/favicon.svg (renamed from site_root/favicon.svg) | 0 | ||||
-rw-r--r-- | data/index.lua (renamed from site_root/index.lua) | 0 | ||||
-rw-r--r-- | data/index.md | 30 | ||||
-rw-r--r-- | data/projects/index.lua (renamed from site_root/projects/index.lua) | 0 | ||||
-rw-r--r-- | data/style.css (renamed from site_root/style.css) | 0 | ||||
-rw-r--r-- | layouts/base.lua | 63 | ||||
-rw-r--r-- | layouts/blog.lua | 8 | ||||
-rw-r--r-- | plugins/navigation.lua | 0 | ||||
-rw-r--r-- | plugins/toolkit.lua | 42 | ||||
-rwxr-xr-x | serve-http.sh | 19 | ||||
-rw-r--r-- | server/go.mod | 10 | ||||
-rw-r--r-- | server/go.sum | 17 | ||||
-rw-r--r-- | server/main.go | 48 | ||||
-rw-r--r-- | server/md-page.go | 95 |
21 files changed, 201 insertions, 144 deletions
@@ -1,3 +1,4 @@ *~ public/ publish.sh +server/sanine.net-server diff --git a/config.lua b/config.lua deleted file mode 100644 index 1f797ce..0000000 --- a/config.lua +++ /dev/null @@ -1,12 +0,0 @@ -return { - site_name = 'sanine.net', - site_address = 'https://sanine.net/', - site_directory = 'site_root', - - layout_directory = 'layouts', - plugin_directory = 'plugins', - - exclude = { '.*~' }, - - rss_include = { 'blog' }, -} diff --git a/site_root/about.lua b/data/about.lua index 9f87357..9f87357 100644 --- a/site_root/about.lua +++ b/data/about.lua diff --git a/site_root/blog/03-remote_full_system_encryption_with_arch.lua b/data/blog/03-remote_full_system_encryption_with_arch.lua index 43fccfa..43fccfa 100644 --- a/site_root/blog/03-remote_full_system_encryption_with_arch.lua +++ b/data/blog/03-remote_full_system_encryption_with_arch.lua diff --git a/site_root/blog/announcing_honeysuckle.lua b/data/blog/announcing_honeysuckle.lua index f078585..f078585 100644 --- a/site_root/blog/announcing_honeysuckle.lua +++ b/data/blog/announcing_honeysuckle.lua diff --git a/site_root/blog/refactor-argent.lua b/data/blog/refactor-argent.lua index 6b7ca4d..6b7ca4d 100644 --- a/site_root/blog/refactor-argent.lua +++ b/data/blog/refactor-argent.lua diff --git a/site_root/cgit.css b/data/cgit.css index 9242499..9242499 100644 --- a/site_root/cgit.css +++ b/data/cgit.css diff --git a/site_root/favicon.svg b/data/favicon.svg index 142a88c..142a88c 100644 --- a/site_root/favicon.svg +++ b/data/favicon.svg diff --git a/site_root/index.lua b/data/index.lua index c419830..c419830 100644 --- a/site_root/index.lua +++ b/data/index.lua diff --git a/data/index.md b/data/index.md new file mode 100644 index 0000000..c419830 --- /dev/null +++ b/data/index.md @@ -0,0 +1,30 @@ +local tk = require 'toolkit' + +function get_blog_links() + local links = '<ul>\n' + local pages = tk.pages('blog/') + table.sort(pages, function(a, b) return a.date > b.date end) + for _, page in pairs(pages) do + links = links .. + string.format('<li><a href="%s">[%s] %s</a></li>\n', page.href, page.date, page.title) + end + return links..'</ul>' +end + + +local md = string.format([[ +home +==== + +welcome to sanine.net! + +%s + +[subscribe via rss](/rss.xml) +]], get_blog_links()) + +return { + title='home', + layout='base', + markdown=md, +} diff --git a/site_root/projects/index.lua b/data/projects/index.lua index d8751b3..d8751b3 100644 --- a/site_root/projects/index.lua +++ b/data/projects/index.lua diff --git a/site_root/style.css b/data/style.css index 897b490..897b490 100644 --- a/site_root/style.css +++ b/data/style.css diff --git a/layouts/base.lua b/layouts/base.lua deleted file mode 100644 index 1c585d7..0000000 --- a/layouts/base.lua +++ /dev/null @@ -1,63 +0,0 @@ -local navigation_table = { - {'home', '/index.html'}, - {'projects', '/projects/'}, - {'git', '/git'}, - {'about', '/about.html'}, -} - -local navlinks = '' - -for _, link in pairs(navigation_table) do - navlinks = navlinks .. - string.format('<a href="%s">%s</a> ', link[2], link[1]) -end -navlinks = string.sub(navlinks, 1, -4) - -local navigation = string.format('<div id="navigation"><pre>%s</pre></div>', navlinks) - -return function(html, page_tbl) - local html = string.gsub( - html, - '<h1>(.-)</h1>', - function(s) - return string.format( - '<h1>%s</h1>%s</br>', - s, string.rep('=', string.len(s)) - ) - end - ) - - html = string.gsub( - html, - '<h2>(.-)</h2>', - function(s) - return string.format( - '<h2>%s</h2>%s</br>', - s, string.rep('-', string.len(s)) - ) - end - ) - - local fmt = [[ -<!doctype html> - <html> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <link rel="icon" type="image/svg+xml" href="/favicon.svg"> - <title>%s</title> - <link rel="stylesheet" href="/style.css"> - </html> - <body> - <div id="content"> - %s - %s - </div> - </body> -</html> -]] -return string.format( - fmt, - string.format('%s | %s', page_tbl.title, argent.config.site_name), - navigation, - html) -end diff --git a/layouts/blog.lua b/layouts/blog.lua deleted file mode 100644 index eaed8a2..0000000 --- a/layouts/blog.lua +++ /dev/null @@ -1,8 +0,0 @@ -local base = require('layouts.base') - -return function(html, page_tbl) - local html = string.format( - '<h1>%s</h1>\n\n%s', - page_tbl.title, html) - return base(html, page_tbl) -end diff --git a/plugins/navigation.lua b/plugins/navigation.lua deleted file mode 100644 index e69de29..0000000 --- a/plugins/navigation.lua +++ /dev/null diff --git a/plugins/toolkit.lua b/plugins/toolkit.lua deleted file mode 100644 index e5f162a..0000000 --- a/plugins/toolkit.lua +++ /dev/null @@ -1,42 +0,0 @@ -local toolkit = {} - -toolkit.file_iterator = function(directory) - local _, files = argent.scanDirectory(directory) - local i = 0 - local n = table.getn(files) - return function() - i = i+1 - if i<=n then return files[i] end - end -end - - -toolkit.basename = function(filename) - return string.gsub(filename, '%.lua$', '') -end - - -local function extract_page(file) - if not string.match(file, '%.lua$') then return nil end - - local success, result = pcall(loadfile(file), 0, 1) - if not success then return nil end - return result -end - -toolkit.pages = function(directory) - page_array = {} - local path = argent.config.site_directory..directory - for file in toolkit.file_iterator(path) do - local page = extract_page(path..file) - if page then - page.href = '/'..directory..toolkit.basename(file)..'.html' - table.insert(page_array, page) - end - end - - return page_array -end - - -return toolkit diff --git a/serve-http.sh b/serve-http.sh deleted file mode 100755 index 874b586..0000000 --- a/serve-http.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# this script is for previewing site changes ONLY!! it should not be used to -# actually serve a site. use apache or nginx or something for that. - -# launch webserver -python3 -m http.server --directory public/ & -server_pid="$!" -echo "server launched with PID $server_pid" - -# kill server on exit -trap "kill $server_pid && echo && echo \"bye!\"" EXIT - -# rebuild on file changes (inotifywait is from inotify-tools) -while inotifywait -qr --event modify .; do - echo "rebuilding site..." - argent - echo "done." -done diff --git a/server/go.mod b/server/go.mod new file mode 100644 index 0000000..6328a03 --- /dev/null +++ b/server/go.mod @@ -0,0 +1,10 @@ +module sanine.net/sanine.net-server + +go 1.19 + +require ( + github.com/russross/blackfriday/v2 v2.1.0 + github.com/sirupsen/logrus v1.9.0 +) + +require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect diff --git a/server/go.sum b/server/go.sum new file mode 100644 index 0000000..900e85f --- /dev/null +++ b/server/go.sum @@ -0,0 +1,17 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/server/main.go b/server/main.go new file mode 100644 index 0000000..63aadb5 --- /dev/null +++ b/server/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "net/http" + "flag" + "path/filepath" + log "github.com/sirupsen/logrus" +) + + +func main() { + log.SetFormatter(&log.TextFormatter{ + FullTimestamp: true, + }); + + pathFlag := flag.String( + "path", "data", "the path to load site data from", + ); + addrFlag := flag.String( + "addr", "127.0.0.1:8080", "the address to serve from", + ); + flag.Parse(); + log.Infof("data path: %v", *pathFlag); + log.Infof("serving from %v", *addrFlag); + + mux := http.NewServeMux() + mux.HandleFunc("/ip", func(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "%v", req.RemoteAddr); + }); + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + if req.URL.Path != "/" { + path := filepath.Join(*pathFlag, req.URL.Path); + Serve(w, req, path); + } else { + Serve(w, req, filepath.Join(*pathFlag, "index.md")); + } + }); + + server := http.Server{ + Addr: *addrFlag, + Handler: mux, + }; + err := server.ListenAndServe(); + if err != nil { + log.Fatal(err); + } +} diff --git a/server/md-page.go b/server/md-page.go new file mode 100644 index 0000000..8b378c5 --- /dev/null +++ b/server/md-page.go @@ -0,0 +1,95 @@ +package main + +import ( + "os" + "strings" + "net/http" + log "github.com/sirupsen/logrus" + md "github.com/russross/blackfriday/v2" +) + + +func ServeForbidden(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(403); + w.Write([]byte("403 forbidden")); +} + + +func ServeNotFound(w http.ResponseWriter, r *http.Request) { + http.NotFound(w, r); +} + + +func RenderMarkdown(path string) ([]byte, error) { + data, err := os.ReadFile(path); + if err != nil { + return []byte{}, err; + } + return md.Run(data), nil; +} + + +func ServeMarkdown(w http.ResponseWriter, r *http.Request, path string) (int, error) { + page, err := RenderMarkdown(path); + if err != nil { + return 404, err; + } + w.WriteHeader(200); + w.Write(page); + return 200, nil; +} + +func ServeFile(w http.ResponseWriter, r *http.Request, path string) (int, error) { + if strings.Contains(r.URL.Path, "..") { + // reject requests with ".." in the URL + return 403, nil; + } + data, err := os.ReadFile(path); + if err != nil { + return 404, err; + } + + w.WriteHeader(200); + w.Write(data); + return 200, nil; +} + + +func IsMarkdown(path string) bool { + return strings.HasSuffix(path, ".md"); +} + + +func Serve(w http.ResponseWriter, r *http.Request, path string) { + var status int; + var err error; + + if IsMarkdown(path) { + // render and serve markdown content + status, err = ServeMarkdown(w, r, path); + } else { + // serve raw file + status, err = ServeFile(w, r, path); + } + + if status == 200 { + log.Infof( + "%v 200\t%v <- %v", + r.Method, r.RemoteAddr, r.URL.Path, + ); + } else { + log.Errorf( + "%v %v\t%v <- %v: %v", + r.Method, status, r.RemoteAddr, r.URL.Path, err, + ); + switch status { + case 403: + ServeForbidden(w, r); + case 404: + ServeNotFound(w, r); + default: + w.WriteHeader(status); + w.Write([]byte("error")); + } + } +} |