From 280bd602ee932829678f566173c5fbd472c56742 Mon Sep 17 00:00:00 2001 From: Florian Paul Azim Hoberg Date: Tue, 14 May 2024 14:47:41 +0200 Subject: [PATCH] feature(website): Add initial content for BoxyBSD.com website --- README.md | 20 +- website/_assets/css/dark.css | 47 +++ website/_assets/css/grey.css | 47 +++ website/_assets/css/grey_blue.css | 47 +++ website/_assets/css/light.css | 40 +++ website/_assets/files/gpg.key | 77 +++++ website/_assets/img/boxybsd.jpg | Bin 0 -> 8217 bytes website/_assets/img/favicon.ico | Bin 0 -> 12014 bytes website/_templates/feed.xml | 17 + website/_templates/item.html | 5 + website/_templates/item.xml | 14 + website/_templates/list.html | 3 + website/_templates/page.html | 80 +++++ website/_templates/page_tags.html | 82 +++++ website/_templates/post.html | 4 + website/blog.conf | 31 ++ website/content/_index.html | 21 ++ website/content/about.html | 16 + website/content/abuse.html | 6 + .../2023-11-11-manpageblog-release-1-0.md | 29 ++ ...pageblog-now-available-in-freebsd-ports.md | 9 + .../2023-11-15-manpageblog-release-1-1.md | 19 ++ ...21-manpageblog-in-the-1-mb-website-club.md | 11 + .../2023-11-22-manpageblog-release-1-2.md | 19 ++ ...block-container-image-for-docker-podman.md | 24 ++ .../2024-01-09-manpageblog-release-1-3.md | 20 ++ .../2024-01-14-manpageblog-release-1-3-1.md | 15 + website/content/contact.html | 30 ++ website/content/donate.html | 12 + website/content/faq.html | 77 +++++ website/content/imprint.html | 13 + website/content/privacy_policy.html | 177 +++++++++++ website/content/shell.html | 38 +++ website/content/sponsors.html | 19 ++ website/content/status.html | 6 + website/content/toc.html | 36 +++ website/content/vserver.html | 55 ++++ website/dynamic/abuse.php | 162 ++++++++++ website/dynamic/status.php | 103 ++++++ website/manpageblog | 300 ++++++++++++++++++ website/scripts/create.sh | 0 41 files changed, 1730 insertions(+), 1 deletion(-) create mode 100644 website/_assets/css/dark.css create mode 100644 website/_assets/css/grey.css create mode 100644 website/_assets/css/grey_blue.css create mode 100644 website/_assets/css/light.css create mode 100644 website/_assets/files/gpg.key create mode 100644 website/_assets/img/boxybsd.jpg create mode 100644 website/_assets/img/favicon.ico create mode 100644 website/_templates/feed.xml create mode 100644 website/_templates/item.html create mode 100644 website/_templates/item.xml create mode 100644 website/_templates/list.html create mode 100644 website/_templates/page.html create mode 100644 website/_templates/page_tags.html create mode 100644 website/_templates/post.html create mode 100644 website/blog.conf create mode 100644 website/content/_index.html create mode 100644 website/content/about.html create mode 100644 website/content/abuse.html create mode 100644 website/content/blog/2023-11-11-manpageblog-release-1-0.md create mode 100644 website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md create mode 100644 website/content/blog/2023-11-15-manpageblog-release-1-1.md create mode 100644 website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md create mode 100644 website/content/blog/2023-11-22-manpageblog-release-1-2.md create mode 100644 website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md create mode 100644 website/content/blog/2024-01-09-manpageblog-release-1-3.md create mode 100644 website/content/blog/2024-01-14-manpageblog-release-1-3-1.md create mode 100644 website/content/contact.html create mode 100644 website/content/donate.html create mode 100644 website/content/faq.html create mode 100644 website/content/imprint.html create mode 100644 website/content/privacy_policy.html create mode 100644 website/content/shell.html create mode 100644 website/content/sponsors.html create mode 100644 website/content/status.html create mode 100644 website/content/toc.html create mode 100644 website/content/vserver.html create mode 100644 website/dynamic/abuse.php create mode 100644 website/dynamic/status.php create mode 100755 website/manpageblog create mode 100644 website/scripts/create.sh diff --git a/README.md b/README.md index e42a56f..82ad73a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ # BoxyBSD -BoxyBSD.com website \ No newline at end of file + +




+ + + +## Table of Content +- [BoxyBSD](#boxybsd) + - [Table of Content](#table-of-content) + - [General](#general) + - [Content](#content) + +## General +BoxyBSD is a free BSD-focused hosting solution and service for the community. At BoxyBSD, we believe in the power of open-source technology and the principles of the BSD and open-source communities, which prioritize providing free and open solutions to all. + +Our project is driven by a dedication to fostering education, exploration, and experimentation within the realm of BSD-based systems. We offer a range of free services, including virtual machine (VM) hosting, shell hosting, email hosting, and web hosting, all built on BSD-focused solutions. Therefore, BoxyBSD is fully a non-profit project. + + +## Content +This repository contains everything around BoxyBSD.com. It holds the content of the website but also the utilities to create the resource objects. \ No newline at end of file diff --git a/website/_assets/css/dark.css b/website/_assets/css/dark.css new file mode 100644 index 0000000..31222a2 --- /dev/null +++ b/website/_assets/css/dark.css @@ -0,0 +1,47 @@ +body { + background-color: #000000; +} + +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #d3d3d3; + text-decoration: underline dotted; + } + + a:hover, a:active { + color: #d3d3d3; + text-decoration: underline dotted; + } + + header section, footer section, manpage { + color: #d3d3d3; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/css/grey.css b/website/_assets/css/grey.css new file mode 100644 index 0000000..2ed2045 --- /dev/null +++ b/website/_assets/css/grey.css @@ -0,0 +1,47 @@ +body { + background-color: #3d3d3d; +} + +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #d3d3d3; + text-decoration: underline dotted; + } + + a:hover, a:active { + color: #d3d3d3; + text-decoration: underline dotted; + } + + header section, footer section, manpage { + color: #d3d3d3; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + color: #d3d3d3; + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/css/grey_blue.css b/website/_assets/css/grey_blue.css new file mode 100644 index 0000000..cfee0ce --- /dev/null +++ b/website/_assets/css/grey_blue.css @@ -0,0 +1,47 @@ +body { + background-color: #3d3d3d; +} + +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #6082B6; + text-decoration: underline dotted; + } + + a:hover, a:active { + color: #6082B6; + text-decoration: underline dotted; + } + + header section, footer section, manpage { + color: #6082B6; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + color: #6082B6; + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + color: #6082B6; + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/css/light.css b/website/_assets/css/light.css new file mode 100644 index 0000000..dae5bca --- /dev/null +++ b/website/_assets/css/light.css @@ -0,0 +1,40 @@ +img { + max-width: 100%; + height: auto; + } + + a:link, a:visited { + color: #6d6d6d; + text-decoration: none + } + + a:hover, a:active { + color: #6d6d6d; + text-decoration: underline + } + + header section, footer section, manpage { + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 0%; + max-width: 40em; + } + + main, nav section, name section { + max-width: 60em; + font-size: 14px; + font-family: "Courier New", monospace; + margin-left: 5%; + margin-right: auto; + padding: 0 0.5em; + } + + code { + max-width: 60em; + font-size: 14px; + font-style: italic; + font-family: "Courier New", monospace; + margin-left: 10%; + margin-right: auto; + padding: 0 0.5em; + } diff --git a/website/_assets/files/gpg.key b/website/_assets/files/gpg.key new file mode 100644 index 0000000..f92cd99 --- /dev/null +++ b/website/_assets/files/gpg.key @@ -0,0 +1,77 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=9+F9 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/website/_assets/img/boxybsd.jpg b/website/_assets/img/boxybsd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..606b3cc37e888cc9cce00a01e6747b93835745c9 GIT binary patch literal 8217 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 Z&(b?AxWr%OjNs}CLuZ80tN$yX{{!D8uN?pY literal 0 HcmV?d00001 diff --git a/website/_templates/feed.xml b/website/_templates/feed.xml new file mode 100644 index 0000000..09bca31 --- /dev/null +++ b/website/_templates/feed.xml @@ -0,0 +1,17 @@ + + + + +{{ title }} +{{ site_url }}/ +{{ description }} + + {{ logo_site }} + {{ title }} + {{ site_url }}/ + + +{{ content }} + + + diff --git a/website/_templates/item.html b/website/_templates/item.html new file mode 100644 index 0000000..93c5b90 --- /dev/null +++ b/website/_templates/item.html @@ -0,0 +1,5 @@ + +
diff --git a/website/_templates/item.xml b/website/_templates/item.xml new file mode 100644 index 0000000..4df1310 --- /dev/null +++ b/website/_templates/item.xml @@ -0,0 +1,14 @@ + +{{ title }} +{{ site_url }}/{{ blog }}/{{ slug }}/ +{{ site_url }}/{{ blog }}/{{ slug }}/ + + +{{ summary }} ... +

+

Read More

+]]> +
+{{ rfc_2822_date }} +
diff --git a/website/_templates/list.html b/website/_templates/list.html new file mode 100644 index 0000000..37898f0 --- /dev/null +++ b/website/_templates/list.html @@ -0,0 +1,3 @@ +{{ title }} +

+{{ content }} diff --git a/website/_templates/page.html b/website/_templates/page.html new file mode 100644 index 0000000..e84c7fa --- /dev/null +++ b/website/_templates/page.html @@ -0,0 +1,80 @@ + + + + {{ title }} | {{ subtitle }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + {{ name }} + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+{{ content }} +
+ + + + + diff --git a/website/_templates/page_tags.html b/website/_templates/page_tags.html new file mode 100644 index 0000000..bab6586 --- /dev/null +++ b/website/_templates/page_tags.html @@ -0,0 +1,82 @@ + + + + {{ title }} | {{ subtitle }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + {{ name }} + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+{{ content }} +
+ + +
TAGS
+
+ +
+{{ keywords }} +
+ +
+
+

© {{ current_year }} {{ copyright }}

+
+
+ + + diff --git a/website/_templates/post.html b/website/_templates/post.html new file mode 100644 index 0000000..bdd941c --- /dev/null +++ b/website/_templates/post.html @@ -0,0 +1,4 @@ + diff --git a/website/blog.conf b/website/blog.conf new file mode 100644 index 0000000..199db79 --- /dev/null +++ b/website/blog.conf @@ -0,0 +1,31 @@ +[general] +name: BoxyBSD +description: BoxyBSD is a non-profit VM & service provider for the open-source community with a focus on BSD based Systems like FreeBSD, OpenBSD and NetBSD. BoxyBSD also provides additional services like webhosting, git, email and DNS solutions for open-source projects to give valuable things back to the community. BoxyBSD is a project of gyptazy. +keywords: boxybsd, gyptazy, hosting, free vm, free vms, freebsd, netbsd, openbsd, community, open-source, virtual machines, hosting, non-profit +keywords_show: meta +robots: index,follow +subtitle: BoxyBSD - BSD focused hosting +author: admin +copyright: BoxyBSD +preview_words: 150 +logo_site: https://boxybsd.com/boxybsd.jpg +logo_favicon: https://boxybsd.com/boxybsd.jpg +logo_apple_touch: https://boxybsd.com/boxybsd.jpg + +[social] +mastodon: https://mastodon.bsd.cafe/@BoxyBSD +twitter: @BoxyBSD +github: manpageblog + +[opengraph] +image_width: 800 +image_height: 375 + +[processing] +site_url: https://boxybsd.com +base_path: +assets: _assets +template_path: _templates +output_path: docroot +output_from_scratch: force +theme: dark diff --git a/website/content/_index.html b/website/content/_index.html new file mode 100644 index 0000000..6e8dd32 --- /dev/null +++ b/website/content/_index.html @@ -0,0 +1,21 @@ + + + + +Welcome +

+Welcome to BoxyBSD, your destination for free BSD-focused solutions and services for the community. At BoxyBSD, we believe in the power of open-source technology and the +principles of the BSD and open-source communities, which prioritize providing free and open solutions to all. +

+Our project is driven by a dedication to fostering education, exploration, and experimentation within the realm of BSD-based systems. We offer a range of free services, +including virtual machine (VM) hosting, email hosting, and web hosting, all built on BSD-focused solutions. Therefore, BoxyBSD is fully a non-profit project. +

+By providing these services at no cost, we aim to empower enthusiasts, students, and professionals to gain hands-on experience without the financial barriers typically +associated with setting up and managing virtual environments. Whether you're looking to delve into the intricacies of BSD systems, learn about system administration, +networking, or security practices, BoxyBSD provides a safe and controlled environment for your exploration. +

+In addition to our VM hosting services, we also offer secure email and web hosting solutions with state of the art technologies. +

+Join us at BoxyBSD and be part of a community committed to advancing knowledge, collaboration, and the principles of open-source technology. Experience the freedom +to learn, experiment, and innovate with BoxyBSD today. +

diff --git a/website/content/about.html b/website/content/about.html new file mode 100644 index 0000000..f8d47c7 --- /dev/null +++ b/website/content/about.html @@ -0,0 +1,16 @@ + + + +About +

+Like probably the most ones I started with Wordpress which is a pretty cool but also a very bloated software for a personal blog. +Running such a software requires multiple application with different dependencies, continuous updates and more resources on the +system to serve the whole content. Creating additional backups of the docroot and the database require additional time and efforts. +All of this is not really necessary when the content is more or less static and comments are deactivated or not used. A flat file +approach provides the optional possibility to run and keep everything in git. Generated HTML pages can easily be served even on +low resource systems. While this way of blogging mostly targets tech-enthusiasts that are already working on Unix-like systems the +idea was to provide a blog engine in a layout and theming of a Unix-like `man page` (manual page). Man pages always align to the +same formatting based on troff which make man pages look always the same. While man pages provide information of a cli command +the idea was to adapt this to a blog. A blog also provides information and especially when serving tech related content it makes +much sense to provide it in a similar way. This is the story of how manpageblog was born. +

diff --git a/website/content/abuse.html b/website/content/abuse.html new file mode 100644 index 0000000..d3d6449 --- /dev/null +++ b/website/content/abuse.html @@ -0,0 +1,6 @@ + + + +Abuse +

+

diff --git a/website/content/blog/2023-11-11-manpageblog-release-1-0.md b/website/content/blog/2023-11-11-manpageblog-release-1-0.md new file mode 100644 index 0000000..42b5bb7 --- /dev/null +++ b/website/content/blog/2023-11-11-manpageblog-release-1-0.md @@ -0,0 +1,29 @@ + + + + +manpageblog finally got its first release. With version +1.0 a public release is now present. A small, lightweight blog engine written in Python and offers several advantages +in a look of a man page (Unix like manual page). Firstly, it provides simplicity and ease of use, making it accessible even for users with limited technical knowledge. The lightweight nature ensures quick installation and minimal resource consumption, making it suitable for various hosting environments. No database is needed at all. +Firstly, it provides simplicity and ease of use, making it accessible even for users with limited technical knowledge. +The lightweight nature ensures quick installation and minimal resource consumption, making it suitable for various hosting environments. +

+Python's readability and straightforward syntax make the blog engine easy to customize and extend, allowing users +to tailor it to their specific needs. Additionally, being Python-based means leveraging a vast ecosystem of libraries +and frameworks, enhancing the blog's functionality without unnecessary complexity. +

+The lightweight nature also contributes to faster loading times, improving user experience and search engine rankings. +Overall, a small, lightweight blog engine in Python combines simplicity, flexibility, and efficiency, making it an +ideal choice for those prioritizing a streamlined and customizable blogging experience. + +Of course, manpageblog also supports regular html tags and code markers which makes it ideal to use for DevOps and developers. +

+ + + + + + +

+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md b/website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md new file mode 100644 index 0000000..de510db --- /dev/null +++ b/website/content/blog/2023-11-13-manpageblog-now-available-in-freebsd-ports.md @@ -0,0 +1,9 @@ + + + + +manpageblog can now also be installed by the FreeBSD Ports. +Thanks to Stefan E. for pushing manpageblog to the ports. +

+FreeBSD Ports is a system for managing and installing software packages on FreeBSD, a Unix-like operating system. The Ports +Collection is a set of makefiles and scripts that simplify the process of compiling and installing third-party software on FreeBSD. diff --git a/website/content/blog/2023-11-15-manpageblog-release-1-1.md b/website/content/blog/2023-11-15-manpageblog-release-1-1.md new file mode 100644 index 0000000..8a554ac --- /dev/null +++ b/website/content/blog/2023-11-15-manpageblog-release-1-1.md @@ -0,0 +1,19 @@ + + + + +manpageblog just got released in version 1.1 Version 1.1 comes along with +several bug fixes and some new features.

+ +Features
+* Open Graph support (for sharing on social media paltforms)
+* Logo support in RSS feed
+
+Fixes
+* Validate if option are set from config
+* Dynamic word-wrap limit now works
+* Adjusted documentation
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md b/website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md new file mode 100644 index 0000000..ebd6d5c --- /dev/null +++ b/website/content/blog/2023-11-21-manpageblog-in-the-1-mb-website-club.md @@ -0,0 +1,11 @@ + + + + +manpageblog is now part of the 1MB Club, a collection of performance-focused web pages. +The 1MB Club is a growing collection of performance-focused web pages weighing less than 1 megabyte. Therefore, the goal +is to get back to slim and performant but also content rich web pages again.

+ +About the 1MB Club
+The internet has become a bloated mess. Massive JavaScript libraries. Countless client-side queries. Overly complex frontend frameworks. +But we can make a difference - no matter how small it may seem. 1MB Club is a growing collection of performance-focused web pages found across the internet. All member websites weigh less than 1 megabyte in page size. diff --git a/website/content/blog/2023-11-22-manpageblog-release-1-2.md b/website/content/blog/2023-11-22-manpageblog-release-1-2.md new file mode 100644 index 0000000..ea5511b --- /dev/null +++ b/website/content/blog/2023-11-22-manpageblog-release-1-2.md @@ -0,0 +1,19 @@ + + + + +manpageblog just got released in version 1.2 Version 1.2 comes along with +several bug fixes and some new features.

+ +Features
+* Add Twitter card support
+* Add dynamic favicon support
+* Add apple-touch favicon support
+* Add grey-scale theme
+
+Fixes
+* Fixed missing language type in html element
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md b/website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md new file mode 100644 index 0000000..094c089 --- /dev/null +++ b/website/content/blog/2023-12-15-manpageblock-container-image-for-docker-podman.md @@ -0,0 +1,24 @@ + + + + +manpageblog can now also be tested in a Container image which is supported by Docker, Podman, etc. +This allows people do test manpageblog without any other dependencies before switching. The Dockerfile can also be found within the GitHub project. +

+Resources:
+ + + + + + + + + + + + + + + +
Name Version  Container Image Preview Source
manpageblog 1.2  cnt-reg.gyptazy.ch/gyptazy/manpageblog:1.2 manpageblog GitHub
diff --git a/website/content/blog/2024-01-09-manpageblog-release-1-3.md b/website/content/blog/2024-01-09-manpageblog-release-1-3.md new file mode 100644 index 0000000..f099e38 --- /dev/null +++ b/website/content/blog/2024-01-09-manpageblog-release-1-3.md @@ -0,0 +1,20 @@ + + + + + +manpageblog just got released in version 1.3 Version 1.3 comes along with +several bug fixes and some new features.

+ +Features
+* Add meta keyword support
+* Add tag support
+* Add robot support
+* Add blue/grey theme
+
+Fixes
+* Fixed rendering issue
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/blog/2024-01-14-manpageblog-release-1-3-1.md b/website/content/blog/2024-01-14-manpageblog-release-1-3-1.md new file mode 100644 index 0000000..2601bc2 --- /dev/null +++ b/website/content/blog/2024-01-14-manpageblog-release-1-3-1.md @@ -0,0 +1,15 @@ + + + + + +manpageblog just got released in version 1.3.1 Version 1.3.1 comes along with +a bug fixe regarding the RSS feed.

+ +Fixes
+* Fixed missing xmlns rss atom feed
+* Fixed missing atomic url in each element
+ +
+Now, you can start blogging. More information can be found on manpageblog.
+Download: manpageblog diff --git a/website/content/contact.html b/website/content/contact.html new file mode 100644 index 0000000..3e33f21 --- /dev/null +++ b/website/content/contact.html @@ -0,0 +1,30 @@ + + + +Contact +

+We are thrilled that you are interested in reaching out to us! At BoxyBSD, we strive to make it as easy as possible for +you to connect with us regarding any inquiries, feedback, or collaborations you may have in mind. Your thoughts and +questions are important to us, and we're here to assist you every step of the way. Every request is important but there +might be some cases which might be more important (e.g. someone is abusing the service) where we kindly ask you to use +the corresponding addresses. +

+ +Email
+Support: support@boxybsd.com
+Abuse:   abuse@boxybsd.com
+NOC:     noc@boxybsd.com
+GPG:     362A 53C0 E41C BCE8 9C18  7117 217A 875C FA93 FBF9 (download)
+
+ +Community Chat
+We also have a community chat available on the BSD Cafe's Matrix instance. Join us there to engage in discussions and connect with fellow enthusiasts.
+#boxybsd:bsd.cafe +

+ +Social Media
+You can also find this project on the Fediverse (Mastodon) and Twitter:
+Twitter: twitter.com/BoxyBSD
+Fediverse: mastodon.bsd.cafe/@BoxyBSD +

+

diff --git a/website/content/donate.html b/website/content/donate.html new file mode 100644 index 0000000..78041a0 --- /dev/null +++ b/website/content/donate.html @@ -0,0 +1,12 @@ + + + +Donate +

+BoxyBSD is currently in its nascent stages, eager to gauge community reception before soliciting donations. +As the project gains traction and establishes itself as a stable, long-term endeavor, contributions may be +considered. At present, refraining from donation collection prevents any perception of sudden closure or +suspicion in the event of unforeseen circumstances. The focus remains on fostering trust and sustainability +within the community before financial support is sought.

+Instead of donating, you may have a look at sponsoring the project with hardware resources. See also our FAQ. +

diff --git a/website/content/faq.html b/website/content/faq.html new file mode 100644 index 0000000..1bab76a --- /dev/null +++ b/website/content/faq.html @@ -0,0 +1,77 @@ + + + +FAQ +

+Can I get a new BSD based VM?
+Yes - but it takes some time. This project is free and the resources are limited. Each hypervisor will only run +a limited amount of free VMs. Slots will be freed when someone cancels the VM or a new host node gets attached +to the cluster. I still have to pay for the resources that you are using for free which means I cannot simply +add new nodes. +

+ +Can I choose an OS?
+You can choose between the following OS:
+  * FreeBSD 14
+  * OpenBSD 7.5
+  * NetBSD 10
+  * Open Indiana (beta) +

+ +Where are the systems hosted?
+All VMs are hosted in Germany. Unfortunately, it depends on the usage of the host nodes +where new VMs are created. The systems are located all over Germany - a VM may be created +in Nürnberg (hosted on netcup, Hetzner), Frankfurt (Maincubes, ProHosting24), Düsseldorf (Plusserver, PawHost). +

+ +Where are IP subnets located & hosted?
+No native IP subnets are used for this service. All IP subnets are assigned by AS6939 (Hurricane Electric LLC). +Different tunnel pops provide different subnets in different countries. Currently, it can be served from Germany, Switzerland, USA and Dschibuti (Africa). +

+ +Traffic & Bandwidth?
+Traffic is needed and you should do what you need to do but please do not generate unnecessary traffic. Please do not provide any download portals and do not run P2P sharing systems like Torrent. +This is currently stated as "fair use" traffic but may change at any time. The host nodes are connected with multiple Gbit interfaces but each VM is limited to 10Mbit. If there is any reason to get more bandwidth, please contact us. +

+ +How do we get support?
+For further support you can write an email to support@boxybsd.com. You may also find more help +in the Matrix channel on the BSD.Cafe server:
+#boxybsd:bsd.cafe +

+ +Can we donate?
+Please see the current status of donations at donate. +

+ +Can we sponsor?
+Yes, sponsoring is absolutely appreciated! If you are working in or for an AS (Autonomous System) or in a data center and can provide hardware resources with a minimum of 32GB memory and 500GB disk space, including upstream and at least a single +/48 IPv6 subnet, this can be integrated into the BoxyBSD project. Please get in touch with the project via our contact page. +

+ +Are there things forbidden?
+The initial idea of this project is to provide a valuable platform for people interested in BSD and open-source. This means, that it +should also be used and treated in this way - for research and learning. Do not waste resources (especially network traffic)! You should +also take care for your instance and keep it up to date and secure.
+Strongly forbidden is everything which results into illegal activities (e.g., hacking, ddos etc.) but also annoying things like port scanning +of foreign systems and so on. Every kind of pornographic material is forbidden and also running TOR nodes, Torrent etc.. +

+ +Can the hosting and service be terminated?
+Yes, the services may be terminated at any time without any further notice! +

+ +Are there backups?
+No! YOU are responsible for your instance and backups. +

+ +What CMS are you using?
+This project runs on manpageblog which is free and open-source. You can find the source on +github but it is also available in the FreeBSD ports. +

+ +Who is behind this project?
+This project is founded and driven by gyptazy. I'm a BSD user for more than +15 years and belive in the strenght of the community. You can also find me on Twitter and the Fediverse. +

+

diff --git a/website/content/imprint.html b/website/content/imprint.html new file mode 100644 index 0000000..88fb733 --- /dev/null +++ b/website/content/imprint.html @@ -0,0 +1,13 @@ + + + +Imprint +

+BoxyBSD
+Duesseldorferstrasse 68
+41460 Neuss
+Germany

+ +Phone: +41 44 500 87 44
+Email: support@boxybsd.com +

diff --git a/website/content/privacy_policy.html b/website/content/privacy_policy.html new file mode 100644 index 0000000..719cf78 --- /dev/null +++ b/website/content/privacy_policy.html @@ -0,0 +1,177 @@ + + + +Privacy Policy +

Last updated: April 07, 2024

+

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

+

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the Privacy Policy Generator.

+

Interpretation and Definitions

+

Interpretation

+

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

+

Definitions

+

For the purposes of this Privacy Policy:

+
    +
  • +

    Account means a unique account created for You to access our Service or parts of our Service.

    +
  • +
  • +

    Affiliate means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.

    +
  • +
  • +

    Company (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to Boxy.

    +
  • +
  • +

    Cookies are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.

    +
  • +
  • +

    Country refers to: Nordrhein-Westfalen, Germany

    +
  • +
  • +

    Device means any device that can access the Service such as a computer, a cellphone or a digital tablet.

    +
  • +
  • +

    Personal Data is any information that relates to an identified or identifiable individual.

    +
  • +
  • +

    Service refers to the Website.

    +
  • +
  • +

    Service Provider means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.

    +
  • +
  • +

    Usage Data refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).

    +
  • +
  • +

    Website refers to Boxy, accessible from boxy.com

    +
  • +
  • +

    You means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.

    +
  • +
+

Collecting and Using Your Personal Data

+

Types of Data Collected

+

Personal Data

+

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

+
    +
  • +

    Email address

    +
  • +
  • +

    Usage Data

    +
  • +
+

Usage Data

+

Usage Data is collected automatically when using the Service.

+

Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

+

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

+

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

+

Tracking Technologies and Cookies

+

We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:

+
    +
  • Cookies or Browser Cookies. A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.
  • +
  • Web Beacons. Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).
  • +
+

Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies on the Privacy Policies website article.

+

We use both Session and Persistent Cookies for the purposes set out below:

+
    +
  • +

    Necessary / Essential Cookies

    +

    Type: Session Cookies

    +

    Administered by: Us

    +

    Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.

    +
  • +
  • +

    Cookies Policy / Notice Acceptance Cookies

    +

    Type: Persistent Cookies

    +

    Administered by: Us

    +

    Purpose: These Cookies identify if users have accepted the use of cookies on the Website.

    +
  • +
  • +

    Functionality Cookies

    +

    Type: Persistent Cookies

    +

    Administered by: Us

    +

    Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.

    +
  • +
+

For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.

+

Use of Your Personal Data

+

The Company may use Personal Data for the following purposes:

+
    +
  • +

    To provide and maintain our Service, including to monitor the usage of our Service.

    +
  • +
  • +

    To manage Your Account: to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.

    +
  • +
  • +

    For the performance of a contract: the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.

    +
  • +
  • +

    To contact You: To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.

    +
  • +
  • +

    To provide You with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.

    +
  • +
  • +

    To manage Your requests: To attend and manage Your requests to Us.

    +
  • +
  • +

    For business transfers: We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.

    +
  • +
  • +

    For other purposes: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.

    +
  • +
+

We may share Your personal information in the following situations:

+
    +
  • With Service Providers: We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.
  • +
  • For business transfers: We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.
  • +
  • With Affiliates: We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.
  • +
  • With business partners: We may share Your information with Our business partners to offer You certain products, services or promotions.
  • +
  • With other users: when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.
  • +
  • With Your consent: We may disclose Your personal information for any other purpose with Your consent.
  • +
+

Retention of Your Personal Data

+

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

+

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

+

Transfer of Your Personal Data

+

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

+

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

+

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

+

Delete Your Personal Data

+

You have the right to delete or request that We assist in deleting the Personal Data that We have collected about You.

+

Our Service may give You the ability to delete certain information about You from within the Service.

+

You may update, amend, or delete Your information at any time by signing in to Your Account, if you have one, and visiting the account settings section that allows you to manage Your personal information. You may also contact Us to request access to, correct, or delete any personal information that You have provided to Us.

+

Please note, however, that We may need to retain certain information when we have a legal obligation or lawful basis to do so.

+

Disclosure of Your Personal Data

+

Business Transactions

+

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

+

Law enforcement

+

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

+

Other legal requirements

+

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

+
    +
  • Comply with a legal obligation
  • +
  • Protect and defend the rights or property of the Company
  • +
  • Prevent or investigate possible wrongdoing in connection with the Service
  • +
  • Protect the personal safety of Users of the Service or the public
  • +
  • Protect against legal liability
  • +
+

Security of Your Personal Data

+

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

+

Children's Privacy

+

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

+

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

+

Links to Other Websites

+

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

+

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

+

Changes to this Privacy Policy

+

We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

+

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

+

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

+

Contact Us

+

If you have any questions about this Privacy Policy, You can contact us:

+
    +
  • By email: privacy@boxybsd.com
  • +
+

diff --git a/website/content/shell.html b/website/content/shell.html new file mode 100644 index 0000000..eb28f99 --- /dev/null +++ b/website/content/shell.html @@ -0,0 +1,38 @@ + + + +Shell +

+This shared systems platform provides users with Unix shell accounts for various purposes such as experimentation, collaboration, and learning. +It offers a diverse range of services including email, web hosting, and programming environments. Users can connect to the related system via SSH +and utilize its resources to explore the world of Unix, networking, and programming. Instead of having to manage a full virtual machine it often +might even be enough to have a dedicated user account to run unix applications. + + + + + + + + + + + + + + + + + + + + +
Community Nick
Email
Login name
SSH Pubkey
OS
+ + + I Agree Terms & Conditions (TOS).
+ + +

+ +

diff --git a/website/content/sponsors.html b/website/content/sponsors.html new file mode 100644 index 0000000..c3e31ae --- /dev/null +++ b/website/content/sponsors.html @@ -0,0 +1,19 @@ + + + +Sponsors +

+Sponsoring is absolutely appreciated! If you're involved with an Autonomous System (AS) or work within a data center, your support +in providing hardware resources with at least 32GB memory and 500GB disk space, along with upstream and a single /48 IPv6 subnet, is +appreciated to the BoxyBSD project. Your contribution will enhance the development and capabilities of our project. +Please reach out to us through our contact page to discuss how you can be involved. +

+ +Current Sponsors
+ + + + + +
gyptazy.ch    gyptazy logo
+

diff --git a/website/content/status.html b/website/content/status.html new file mode 100644 index 0000000..6a5edc7 --- /dev/null +++ b/website/content/status.html @@ -0,0 +1,6 @@ + + + +Status +

+

diff --git a/website/content/toc.html b/website/content/toc.html new file mode 100644 index 0000000..ed22001 --- /dev/null +++ b/website/content/toc.html @@ -0,0 +1,36 @@ + + + +Terms and Conditions +

+By using BoxyBSD, you agree to comply with and be bound by these Terms. If you do not agree to these Terms, you may not use our services. +

+Service Description
+BoxyBSD offers free hosting services for individuals and organizations to host their websites and applications. +

+Service Termination
+BoxyBSD reserves the right to terminate its services at any time, without prior notice. This termination may occur on any day and for any reason, including but not limited to technical issues, operational changes, or violations of these Terms. +

+Service Availability
+While BoxyBSD strives to provide uninterrupted service, we make no guarantee regarding the availability or continuity of our services. Interruptions may occur due to factors beyond our control, including but not limited to server maintenance, network issues, or cyber attacks. +

+User Responsibilities
+* Users are solely responsible for the content they host on BoxyBSD servers.
+* Users must comply with all applicable laws and regulations while using our services.
+* Users must not engage in any activity that may disrupt or interfere with the proper functioning of BoxyBSD servers or networks.
+* Limitation of Liability: In no event shall BoxyBSD, its affiliates, or its partners be liable for any direct, indirect, incidental, special, or consequential damages arising out of or in any way connected with the use of our services. +

+Indemnification
+Users agree to indemnify and hold BoxyBSD, its affiliates, and its partners harmless from any claims, losses, damages, liabilities, and expenses (including legal fees) arising out of or in connection with their use of BoxyBSD services. +

+Modification of Terms
+BoxyBSD reserves the right to modify these Terms at any time. Users will be notified of any changes to the Terms, and continued use of our services after such notification constitutes acceptance of the modified Terms. +

+Governing Law
+These Terms shall be governed by and construed in accordance with the laws of [Jurisdiction], without regard to its conflict of law principles. +

+Contact Us
+If you have any questions or concerns about these Terms, please contact us at support@boxybsd.com. +

+By using BoxyBSD services, you acknowledge that you have read, understood, and agree to be bound by these Terms and Conditions. +

\ No newline at end of file diff --git a/website/content/vserver.html b/website/content/vserver.html new file mode 100644 index 0000000..5e5bdfc --- /dev/null +++ b/website/content/vserver.html @@ -0,0 +1,55 @@ + + + +vServer / VM +

+Our platform offers free virtual machines (VMs) leveraging resource leftovers from our infrastructure. Located across Germany, our +systems provide a reliable and accessible environment for BSD enthusiasts to explore, experiment, and innovate. At BoxyBSD, we +understand the importance of flexibility and choice. That's why we offer optional IP subnets from different allocations, allowing +users to tailor their experience to their specific needs and preferences. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Community Nick
Email
OS
ARCH
CPU
RAM
HDD
IP
NET
+ + + I Agree Terms & Conditions (TOS).
+ + +

+Note: Due to the enormous interest, there are currently no slots available for the time being. As soon as new Hypervisors are available, additional VMs can be provisioned. +

diff --git a/website/dynamic/abuse.php b/website/dynamic/abuse.php new file mode 100644 index 0000000..997dda1 --- /dev/null +++ b/website/dynamic/abuse.php @@ -0,0 +1,162 @@ +"; + } + else{ + $error = "Could not create abuse report. Please try again."; + } + } + } +?> + + + + + + Abuse | BoxyBSD - BSD focused hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + BoxyBSD + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+Abuse
+At BoxyBSD, we prioritize the safety and security of our platform and users. Our abuse policy aims to create a safe and conducive environment +for all users while ensuring the integrity of our services. +By adhering to these principles and policies, we aim to foster a secure and trustworthy environment for all our users, +promoting responsible usage of our services while mitigating potential risks associated with abuse. + +

Prohibited Activities
+We strictly prohibit any activities that violate our terms of service, including but not limited to:
+  * Illegal or malicious activities such as hacking, phishing, or spreading malware.
+  * Spamming or sending unsolicited emails.
+  * Hosting or distributing illegal content.
+  * Hosting or distributing copyrighted materials without proper authorization.
+  * Engaging in activities that cause harm to our infrastructure or other users. + +

Response to Abuse Reports
+Upon receiving an abuse report, we promptly investigates the issue to verify its validity and assess the severity. +Depending on the nature of the abuse, we take appropriate actions, which may include:
+  * Suspension or termination of the offending account.
+  * Removal of offending content.
+  * Cooperation with law enforcement authorities if the abuse involves illegal activities. + +

Report Abuse
+We encourage our users and third parties to report any instances of abuse or violations of our policies promptly. Reports +can be submitted through our dedicated channels in Matrix or email. We take all reports seriously and investigate them thoroughly. +For abuse reports please immediately reach out to us by email (abuse@boxybsd.com) or fill out the following form:

+ + ".$success.""; + } + else { ?> +
+

+ + +   
+
+ +  
+
+ +
+
+ + + + +

+ + '.$error.''; + } ?> +
+ + + + + \ No newline at end of file diff --git a/website/dynamic/status.php b/website/dynamic/status.php new file mode 100644 index 0000000..fff24a5 --- /dev/null +++ b/website/dynamic/status.php @@ -0,0 +1,103 @@ + + + + Abuse | BoxyBSD - BSD focused hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME
+
+ + +
+ + BoxyBSD + +
+
+ + +
OPTIONS
+
+ + + + + +
CONTENT
+
+ +
+Status
+

+ + + +

+Smokeping
+Google:
+ +

+Cloudflare:
+ +

+BSDCafe:
+ +

+HE.net:
+ +

+
+ + + + + diff --git a/website/manpageblog b/website/manpageblog new file mode 100755 index 0000000..8ef6387 --- /dev/null +++ b/website/manpageblog @@ -0,0 +1,300 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2023 Florian Paul Azim Hoberg @gyptazy +# All rights reserved +# +# This software is a derivative of the original makesite.py. +# The license text of the original makesite.py is included below. +# The MIT License (MIT) +# +# Copyright (c) 2018-2022 Sunaina Pai +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +import argparse +import configparser +import datetime +import glob +import json +import os +import re +import sys +import shutil +import sys + + +def parse_arguments(): + """ Parse arguments by cli input """ + args_parser = argparse.ArgumentParser(description='manpageblog', usage='%(prog)s') + args_parser.add_argument('-c', '--config', default='blog.conf', type=str, help='Path to manpageblog config file.', required=False) + return args_parser.parse_args() + + +def parse_config(config_file): + """ Parse config file for manpageblog """ + try: + config = configparser.ConfigParser() + config.read(config_file) + return config + except configparser.ParsingError: + log('Error parsing config file: Impossible to parse file.') + sys.exit(2) + except KeyError: + log('Error parsing config file: Key/Value not found.') + sys.exit(2) + + +def validate(config): + """ Validate config file for mandatory options """ + log_error = False + + if len(config['general']['name']) == 0: + log('Error: Mandatory field "name" missing.') + log_error = True + + if len(config['general']['description']) == 0: + log('Error: Mandatory field "description" missing.') + log_error = True + + if len(config['general']['subtitle']) == 0: + log('Error: Mandatory field "subtitle" missing.') + log_error = True + + if len(config['processing']['site_url']) == 0: + log('Error: Mandatory field "site_url" missing.') + log_error = True + + if len(config['processing']['assets']) == 0: + log('Error: Mandatory field "assets" missing.') + log_error = True + + if len(config['processing']['template_path']) == 0: + log('Error: Mandatory field "template_path" missing.') + log_error = True + + if len(config['processing']['output_path']) == 0: + log('Error: Mandatory field "output_path" missing.') + log_error = True + + if log_error: + sys.exit(1) + + +def fread(file_name): + """ Read file and close the file """ + with open(file_name, 'r') as f: + return f.read() + + +def fwrite(file_name, text): + """ Write content to file and close the file """ + basedir = os.path.dirname(file_name) + if not os.path.isdir(basedir): + os.makedirs(basedir) + + with open(file_name, 'w') as f: + f.write(text) + + +def log(msg, *args): + """ Log message with specified arguments """ + sys.stderr.write(msg.format(*args) + '\n') + + +def truncate(text, words): + """ Remove tags and truncate text to the specified number of words """ + return ' '.join(re.sub('(?s)<.*?>', ' ', text).split()[:words]) + + +def read_headers(text): + """ Parse headers in text and yield (key, value, end-index) tuples """ + for match in re.finditer(r'\s*\s*|.+', text): + if not match.group(1): + break + yield match.group(1), match.group(2), match.end() + + +def rfc_2822_format(date_str): + """ Convert yyyy-mm-dd date string to RFC 2822 format date string """ + d = datetime.datetime.strptime(date_str, '%Y-%m-%d') + return d.strftime('%a, %d %b %Y %H:%M:%S +0000') + + +def read_content(filename): + """ Read content and metadata from file into a dictionary """ + text = fread(filename) + + # Read metadata and save it in a dictionary. + date_slug = os.path.basename(filename).split('.')[0] + match = re.search(r'^(?:(\d\d\d\d-\d\d-\d\d)-)?(.+)$', date_slug) + content = { + 'date': match.group(1) or '1970-01-01', + 'slug': match.group(2), + } + + # Read headers. + end = 0 + for key, val, end in read_headers(text): + content[key] = val + + # Separate content from headers. + text = text[end:] + + # Convert Markdown content to HTML. + if filename.endswith(('.md', '.mkd', '.mkdn', '.mdown', '.markdown')): + try: + from markdown_it import MarkdownIt + md = MarkdownIt() + text = md.render(text) + except ImportError as error: + log('WARNING: Cannot render Markdown in {}: {}', filename, str(error)) + + # Update the dictionary with content and RFC 2822 date. + content.update({ + 'content': text, + 'rfc_2822_date': rfc_2822_format(content['date']) + }) + + return content + + +def render(template, **params): + """ Replace placeholders in template with values from params """ + return re.sub(r'{{\s*([^}\s]+)\s*}}', + lambda match: str(params.get(match.group(1), match.group(0))), + template) + + +def make_pages(src, dst, layout, **params): + """ Generate pages from page content """ + items = [] + + for src_path in glob.glob(src): + content = read_content(src_path) + + page_params = dict(params, **content) + + # Populate placeholders in content if content-rendering is enabled. + if page_params.get('render') == 'yes': + rendered_content = render(page_params['content'], **page_params) + page_params['content'] = rendered_content + content['content'] = rendered_content + + items.append(content) + + dst_path = render(dst, **page_params) + output = render(layout, **page_params) + + log('Rendering {} => {} ...', src_path, dst_path) + fwrite(dst_path, output) + + return sorted(items, key=lambda x: x['date'], reverse=True) + + +def make_list(config, posts, dst, list_layout, item_layout, **params): + """ Generate list page for a blog """ + items = [] + + for post in posts: + item_params = dict(params, **post) + item_params['summary'] = truncate(post['content'], int(config['general'].get('preview_words', 150))) + item = render(item_layout, **item_params) + items.append(item) + + params['content'] = ''.join(items) + dst_path = render(dst, **params) + output = render(list_layout, **params) + + log('Rendering list => {} ...', dst_path) + fwrite(dst_path, output) + + +def main(): + """ Run manpageblog """ + arguments = parse_arguments() + config = parse_config(arguments.config) + validate(config) + + # Create a new directory from scratch + # WARNING: If enabled this will remove the whole directory including all files! + # Since parsing a string from ini would always result in true we make an explicit + # check for the word 'force' + if config['processing']['output_from_scratch'] == 'force': + if os.path.isdir(config['processing']['output_path']): + shutil.rmtree(config['processing']['output_path']) + shutil.copytree(config['processing']['assets'], f"{config['processing']['output_path']}/assets") + + # Remap vars from config + params = { + '_version': '1.1', + 'name': config['general']['name'], + 'description': config['general']['description'], + 'keywords': config['general'].get('keywords', 'unknown'), + 'keywords_show': config['general'].get('keywords_show', 'meta'), + 'robots': config['general'].get('robots', 'noindex,nofollow'), + 'subtitle': config['general']['subtitle'], + 'author': config['general'].get('author', 'unknown'), + 'copyright': config['general'].get('copyright', 'manpageblog'), + 'logo_site': config['general'].get('logo_site', ''), + 'logo_favicon': config['general'].get('logo_favicon', ''), + 'logo_apple_touch': config['general'].get('logo_apple_touch', ''), + 'profile_mastodon': config['social'].get('mastodon', 'unknown'), + 'profile_twitter': config['social'].get('twitter', 'unknown'), + 'image_width': config['opengraph'].get('image_width', '800'), + 'image_height': config['opengraph'].get('image_hight', '375'), + 'profile_github': config['social'].get('github', 'unknown'), + 'site_url': config['processing']['site_url'], + 'base_path': config['processing']['base_path'], + 'theme': config['processing'].get('theme', 'light'), + 'current_year': datetime.datetime.now().year + } + + # Load layouts + if params.get('keywords_show') != 'meta': + page_layout = fread(f'{config["processing"]["template_path"]}/page_tags.html') + else: + page_layout = fread(f'{config["processing"]["template_path"]}/page.html') + post_layout = fread(f'{config["processing"]["template_path"]}/post.html') + list_layout = fread(f'{config["processing"]["template_path"]}/list.html') + item_layout = fread(f'{config["processing"]["template_path"]}/item.html') + feed_xml = fread(f'{config["processing"]["template_path"]}/feed.xml') + item_xml = fread(f'{config["processing"]["template_path"]}/item.xml') + + # Combine layouts to form final layouts + post_layout = render(page_layout, content=post_layout) + list_layout = render(page_layout, content=list_layout) + + # Create site pages + make_pages('content/_index.html', config['processing']['output_path']+'/index.html', page_layout, **params) + make_pages('content/[!_]*.html', config['processing']['output_path']+'/{{ slug }}/index.html', page_layout, **params) + + # Create blogs + blog_posts = make_pages('content/blog/*.md', config['processing']['output_path']+'/blog/{{ slug }}/index.html', post_layout, blog='blog', **params) + + # Create blog list pages + make_list(config, blog_posts, config['processing']['output_path']+'/blog/index.html', list_layout, item_layout, blog='blog', title='Blog', **params) + + # Create RSS feeds + make_list(config, blog_posts, config['processing']['output_path']+'/blog/rss.xml', feed_xml, item_xml, blog='blog', title='Blog', **params) + + +if __name__ == '__main__': + main() diff --git a/website/scripts/create.sh b/website/scripts/create.sh new file mode 100644 index 0000000..e69de29