diff options
author | Toby Vincent <tobyv13@gmail.com> | 2023-05-18 00:54:27 -0500 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2023-05-18 00:54:27 -0500 |
commit | b3a68d6838bfa3560b4718cf8437ffb4b1fa3eea (patch) | |
tree | 8675c9956d3d6c190df7705422aedfdb5f8e8937 | |
parent | e2cd16b211dbd88772ee8a6cbe3ca724fe2014bd (diff) |
feat: create templates and basic content pages
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | config.toml | 8 | ||||
-rw-r--r-- | content/_index.md | 12 | ||||
-rw-r--r-- | content/about.md | 8 | ||||
-rw-r--r-- | content/posts/_index.md | 5 | ||||
-rw-r--r-- | content/posts/bees.md | 10 | ||||
-rw-r--r-- | content/posts/yubikey.md | 116 | ||||
-rw-r--r-- | content/projects.md | 5 | ||||
-rw-r--r-- | sass/style.scss | 166 | ||||
-rw-r--r-- | static/publickey.asc | 157 | ||||
-rw-r--r-- | templates/index.html | 61 | ||||
-rw-r--r-- | templates/macros.html | 71 | ||||
-rw-r--r-- | templates/page.html | 9 | ||||
-rw-r--r-- | templates/post.html | 14 | ||||
-rw-r--r-- | templates/section.html | 23 |
15 files changed, 664 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a48cf0d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +public diff --git a/config.toml b/config.toml index 79660f7..8608327 100644 --- a/config.toml +++ b/config.toml @@ -11,10 +11,14 @@ highlight_code = true highlight_theme = "gruvbox-dark" [extra] +repository = "https://git.sr.ht/~tobyvin/tobyvin.dev" +license = "MIT" author = "Toby Vincent" -email = "tobyv13@gmail.com" +email = "contact@tobyvin.dev" +pgp = "C8F6E06F5C8E2634" github = "tobyvin" -twitter = "toby_wan94" sourcehut = "~tobyvin" +linkedin = "tobyvin" +twitter = "toby_wan94" favicon = "" headerImage = "" diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..bf4a2dd --- /dev/null +++ b/content/_index.md @@ -0,0 +1,12 @@ ++++ +title = "Toby Vincent" +description = "Software Engineer - Tinker - Problem ~~creator~~ solver" ++++ + +## Meta + +- email: [contact@tobyvin.dev]("mailto:contact@tobyvin.dev") +- github: [tobyvin]("https://github.com/tobyvin") +- sourcehut: [~tobyvin]("https://sr.ht/~tobyvin") +- linkedin: [tobyvin](https://linkedin.com/in/tobyvin) +- pgp: [C8F6E06F5C8E2634](/publickey.asc) diff --git a/content/about.md b/content/about.md new file mode 100644 index 0000000..65d0adb --- /dev/null +++ b/content/about.md @@ -0,0 +1,8 @@ ++++ +title = "About" +date = 2023-05-17 ++++ + +## Toby Vincent + +I am me. diff --git a/content/posts/_index.md b/content/posts/_index.md new file mode 100644 index 0000000..21e938a --- /dev/null +++ b/content/posts/_index.md @@ -0,0 +1,5 @@ ++++ +title = "Posts" +sort_by = "date" +page_template = "post.html" ++++ diff --git a/content/posts/bees.md b/content/posts/bees.md new file mode 100644 index 0000000..329318d --- /dev/null +++ b/content/posts/bees.md @@ -0,0 +1,10 @@ ++++ +title = "Bees" +date = 2023-05-17 ++++ + +## Bees, what are they even about + +What makes a bee a bee. Is it the yellow parts? Are there any non yellow bees? I +bet there are, we just probably don't recognize them because they are not +yellow. diff --git a/content/posts/yubikey.md b/content/posts/yubikey.md new file mode 100644 index 0000000..b06adc2 --- /dev/null +++ b/content/posts/yubikey.md @@ -0,0 +1,116 @@ ++++ +title = "WSL2, Yubikey, and You! 🫵" +description = "A WSL2 YubiKey setup guide." +date = 2022-08-04T18:57:50Z ++++ + +## UPDATE 2022-8-24 + +This is no longer necessary due to +[usbipd-win](https://github.com/dorssel/usbipd-win) + +I am now using [usbipd-win](https://github.com/dorssel/usbipd-win) to mount the +yubikey directly into WSL2, and using +[distod](https://github.com/nullpo-head/wsl-distrod) (adds bottled systemd to +wsl) to start services as I normally would in linux + +Regardless, I am posting this here for posterity. + +## Intro + +The following two sections are the result of a painstaking amount of google +searches and GitHub issues followed by troubleshooting, tears, and tea breaks. +Well, more accurately, the 20% came from the aforementioned alliteration. The +80% came from the following two guides. + +- [drduh/YubiKey-Guide](https://github.com/drduh/YubiKey-Guide) +- [The ultimate guide to YubiKey on WSL2](https://dev.to/dzerycz/series/11353) +- [Forwarding gpg-agent to a remote system over SSH](https://wiki.gnupg.org/AgentForwarding) + +The former is an incredibly detailed guide to setting up GPG keys using YubiKey +as a smart card. The amount of information drduh has organized in that +repository in immense, so I urge you to go star it if you find anything in this +section helpful, as he deserves at least that much. + +The second guide was used more as a reference/verification source for the first +guide but none-the-less I found it to be helpful, so I figured I would include +it here. + +While I went down this rock filled rabbit hole for the purpose of getting my +YubiKey working (seamlessly) in WSL2, the majority of this should be helpful +even if you don't use a security key, as its specificity deals with getting the +respective agents/sockets communicating between WSL2 and Windows. + +<!-- TODO ssh/git config to use gpnupg --> +<!-- TODO setting up remote gpg/ssh forwarding --> + +## Windows + +### SSH Agent + +Install [gpg-bridge](https://github.com/BusyJay/gpg-bridge) using cargo + +```powershell +# Powershell +cargo install -f --git https://github.com/busyjay/gpg-bridge +``` + +Set gpg-bridge to run on startup + +```powershell +# Powershell +$cmd_path = "$HOME\.cargo\bin\gpg-bridge.exe" +$pipe = "\\.\pipe\gpg-bridge-ssh" +$cmdl = "$cmd_path gpg-bridge-ssh --extra 127.0.0.1:4321 --ssh $pipe --detach" +$key = New-Item -Path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Force +New-ItemProperty -Path $key.PSPath -Name "gpg-bridge" -Value "$cmdl" +``` + +Set SSH_AUTH_SOCK to have ssh use the translated pipe + +```powershell +# Powershell +[System.Environment]::SetEnvironmentVariable('SSH_AUTH_SOCK',"\\.\pipe\gpg-bridge-ssh") +``` + +One-off to run gpg-bridge.exe without restarting + +```powershell +# Powershell +Invoke-Expression "& $cmdl" +``` + +### GPG Agent + +On the windows side the YubiKey is fully accessible, the GPG agent should just +work. + +## In WSL2 + +### SSH Agent + +```sh +# Bash + +# Install depends +sudo apt install socat iproute2 + +# Install wsl2-ssh-pageant +destination="$HOME/.ssh/wsl2-ssh-pageant.exe" +url="https://github.com/BlackReloaded/wsl2-ssh-pageant/releases/latest/download/wsl2-ssh-pageant.exe" +curl -sL "$url" -o "$destination" +# wget -O "$destination" "https://github.com/BlackReloaded/wsl2-ssh-pageant/releases/latest/download/wsl2-ssh-pageant.exe" +# Set the executable bit. +chmod +x "$destination" +``` + +### GPG Agent + +The only setup needed for getting the YubiKey working in WSL2 is to +source/copy-paste [gpg.sh](wsl/gpg.sh) in your shell profile. + +Along with the initialization code, I wrote a small function the resets all the +related agents/sockets. If you do not attempt to access the YubiKey while it is +not inserted, in my experience, GPG works great has no issues once reinserting +the YubiKey. It is only (inconsistently) when you try to access a YubiKey that +you have removed that puts it in a failed state. diff --git a/content/projects.md b/content/projects.md new file mode 100644 index 0000000..6a1d392 --- /dev/null +++ b/content/projects.md @@ -0,0 +1,5 @@ ++++ +title = "Projects" ++++ + +## Projectr diff --git a/sass/style.scss b/sass/style.scss new file mode 100644 index 0000000..833d2c7 --- /dev/null +++ b/sass/style.scss @@ -0,0 +1,166 @@ +// gruvbox colors +@media (prefers-color-scheme: dark) { + :root { + // --bg: #1d2021; // hard + // --bg: #32302f; // soft + --bg: #282828; + --bg1: #3c3836; + --bg2: #504945; + --bg3: #665c54; + --bg4: #7c6f64; + + --fg: #fbf1c7; + --fg1: #ebdbb2; + --fg2: #d5c4a1; + --fg3: #bdae93; + --fg4: #a89984; + + --red: #fb4934; + --green: #b8bb26; + --yellow: #fabd2f; + --blue: #83a598; + --purple: #d3869b; + --aqua: #8ec07c; + --gray: #928374; + --orange: #fe8019; + + --red-dim: #cc2412; + --green-dim: #98971a; + --yellow-dim: #d79921; + --blue-dim: #458588; + --purple-dim: #b16286; + --aqua-dim: #689d6a; + --gray-dim: #a89984; + --orange-dim: #d65d0e; + } +} + +@media (prefers-color-scheme: light) { + :root { + // --bg: #f9f5d7; // hard + // --bg: #f2e5bc; // soft + --bg: #fbf1c7; + --bg1: #ebdbb2; + --bg2: #d5c4a1; + --bg3: #bdae93; + --bg4: #a89984; + + --fg: #282828; + --fg1: #3c3836; + --fg2: #504945; + --fg3: #665c54; + --fg4: #7c6f64; + + --red: #9d0006; + --green: #79740e; + --yellow: #b57614; + --blue: #076678; + --purple: #8f3f71; + --aqua: #427b58; + --orange: #af3a03; + --gray: #928374; + + --red-dim: #cc2412; + --green-dim: #98971a; + --yellow-dim: #d79921; + --blue-dim: #458598; + --purple-dim: #b16286; + --aqua-dim: #689d6a; + --orange-dim: #d65d0e; + --gray-dim: #7c6f64; + } +} + +html { + background: var(--bg); + color: var(--fg); + font-size: 14pt; + font-family: monospace; +} + +::selection { + color: var(--bg); + background-color: var(--fg); +} + +body { + line-height: 1.4; + max-width: 900px; + margin: 0 auto; +} + +a { + color: var(--blue); +} + +a:visited { + color: var(--blue-dim); +} + +a:hover { + text-decoration: none; +} + +a:active { + background: var(--fg1); +} + +header > h2:has(+ p) { + margin-bottom: 0; +} + +header > h2 + p { + margin-top: 0; +} + +nav a { + color: var(--aqua); + font-weight: bold; + text-decoration: none; +} + +nav a.active { + color: var(--orange-dim); +} + +nav a:hover { + text-decoration: underline; +} + +nav a:active { + background: var(--fg); +} + +nav.toc { + text-align: left; + font-size: 0.9rem; + margin-bottom: 2rem; +} + +header.banner > nav { + display: flex; + justify-content: space-between; +} + +header.banner > nav h1 { + display: flex; +} + +header.banner > nav ul { + display: flex; + list-style: none; +} + +header.banner > nav li + li { + margin-inline-start: 1em; +} + +header.banner > nav a { + font-size: 1.2rem; +} + +footer { + margin-top: 2rem; + text-align: center; + font-size: 0.8rem; +} diff --git a/static/publickey.asc b/static/publickey.asc new file mode 100644 index 0000000..c747b3b --- /dev/null +++ b/static/publickey.asc @@ -0,0 +1,157 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +DZS5eYsKnJ4SGj1y0p8cvp2S8+gnUQs= +=mCbv +-----END PGP PUBLIC KEY BLOCK----- diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..94fe80f --- /dev/null +++ b/templates/index.html @@ -0,0 +1,61 @@ +{% import "macros.html" as macros -%} +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta name="robots" content="noindex" /> + <title> + {% if this.title %}{{ this.title }} -{% endif %} + {{ config.title }} + </title> + <link rel="icon" type="image/png" href="/avatar.png" /> + <meta name="description" + content="{{ section.description | default(value=config.description) }}" /> + <meta name="keywords" content="blog" /> + <link rel="alternate" + type="application/rss+xml" + title="RSS" + href="{{ get_url(path="rss.xml") | safe }}" /> + <link rel="stylesheet" type="text/css" href="/style.css" /> + <link rel="stylesheet" + type="text/css" + href="/syntax-theme-dark.css" + media="(prefers-color-scheme: dark)" /> + <link rel="stylesheet" + type="text/css" + href="/syntax-theme-light.css" + media="(prefers-color-scheme: light)" /> + </head> + <body> + <header class="banner"> + <nav> + <h1>{{ macros::nav_item(name=config.title, url=config.base_url) }}</h1> + <ul> + {%- set root = get_section(path="_index.md") %} + {%- for p in root.pages -%} + <li>{{ macros::nav_item(name=p.title,url=p.permalink) }}</li> + {%- endfor -%} + {% for p in root.subsections %} + {%- set s = get_section(path=p) %} + <li>{{ macros::nav_item(name=s.title,url=s.permalink) }}</li> + {% endfor %} + </ul> + </nav> + </header> + <main> + {% block content %} + <header> + <h1>{{ section.title | safe }}</h1> + <h3>{{ section.description | markdown(inline=true) | safe }}</h3> + </header> + {{ section.content | safe }} + {% endblock content %} + </main> + <footer> + This site was was built using <a href="https://www.getzola.org/">Zola</a>. + The <a href="{{ config.extra.repository }}">code</a> is licensed under + <a href="https://opensource.org/licenses/{{ config.extra.license }}">{{ config.extra.license }}</a>. + </footer> + </body> +</html> diff --git a/templates/macros.html b/templates/macros.html new file mode 100644 index 0000000..6c6020a --- /dev/null +++ b/templates/macros.html @@ -0,0 +1,71 @@ +{% macro tags(tags) %} + {% for tag in tags -%} + <a href="{{ get_taxonomy_url(kind="tags", name=tag ) }}">#{{ tag }}</a> + {% endfor -%} +{% endmacro tags %} +{% macro nav_item(name, url) %} + {%- if page %} + {%- set this = page %} + {%- elif section %} + {%- set this = section %} + {%- endif %} + <a {% if this.permalink == url %}class="active"{%- endif %} href={{ url }}>{{ name }}</a> +{% endmacro nav %} +{% macro toc(page) %} + {% if page.toc %} + <nav class="toc"> + <ul> + {% for h1 in page.toc %} + <li> + <a href="{{ h1.permalink | safe }}">{{ h1.title }}</a> + {% if h1.children %} + <ul> + {% for h2 in h1.children %} + <li> + <a href="{{ h2.permalink | safe }}">{{ h2.title }}</a> + </li> + {% if h2.children %} + <ul> + {% for h3 in h2.children %} + <li> + <a href="{{ h3.permalink | safe }}">{{ h3.title }}</a> + {% if h3.children %} + <ul> + {% for h4 in h3.children %} + <li> + <a href="{{ h4.permalink | safe }}">{{ h4.title }}</a> + </li> + {% if h4.children %} + <ul> + {% for h5 in h4.children %} + <li> + <a href="{{ h5.permalink | safe }}">{{ h5.title }}</a> + {% if h5.children %} + <ul> + {% for h6 in h5.children %} + <li> + <a href="{{ h5.permalink | safe }}">{{ h6.title }}</a> + </li> + {% endfor %} + </ul> + {% endif %} + </li> + {% endfor %} + </ul> + {% endif %} + {% endfor %} + </ul> + {% endif %} + </li> + {% endfor %} + </ul> + {% endif %} + {% endfor %} + </ul> + {% endif %} + </li> + {% endfor %} + </ul> + </nav> + {% endif %} +{% endmacro %} diff --git a/templates/page.html b/templates/page.html new file mode 100644 index 0000000..350652a --- /dev/null +++ b/templates/page.html @@ -0,0 +1,9 @@ +{% import "macros.html" as macros %} +{% extends "index.html" %} +{% block content %} + <header> + <h1>{{ page.title | safe }}</h1> + <h3>{{ page.description | default(value="") | markdown(inline=true) | safe }}</h3> + </header> + {{ page.content | safe }} +{% endblock content %} diff --git a/templates/post.html b/templates/post.html new file mode 100644 index 0000000..0dd3bbb --- /dev/null +++ b/templates/post.html @@ -0,0 +1,14 @@ +{% import "macros.html" as macros -%} +{% extends "index.html" %} +{% block content %} + <header> + <h1 id="title">{{ page.title }}</h1> + {% if page.date %} + <time datetime="{{ page.date | date(format="%Y-%m-%d") }}"> + {{ page.date | date(format="%d %b %Y") }} + </time> + {% endif %} + </header> + {{ macros::toc(page=page) }} + {{ page.content | safe }} +{% endblock content %} diff --git a/templates/section.html b/templates/section.html new file mode 100644 index 0000000..4d390aa --- /dev/null +++ b/templates/section.html @@ -0,0 +1,23 @@ +{% extends "index.html" %} +{% block content %} + <h1>{{ section.title }}</h1> + <div> + {% for page in section.pages %} + <article> + <div> + <h2> + <a href="{{ page.permalink }}">{{ page.title }}</a> + - + <time datetime="{{ page.date | date(format="%Y-%m-%d") }}"> + {{ page.date | date(format="%d %b %Y") }} + </time> + </h2> + </div> + {% if page.summary %} + <p>{{ page.summary | safe }}</p> + <a href="{{ page.permalink }}#continue-reading">...</a> + {% endif %} + </article> + {% endfor %} + </div> +{% endblock content %} |