add infrastructure for hardware database

To keep device information consistent, use a small per device database
embedded in the frontmatter of the device page source.

Device information is extracted from the database and formatted into
tables with the provided shortcodes

The data can then further be used to build comparison tables and filters for
specific usecases.

New devices should make use of the provided archetype, which provides an
example of most used fields:
```
hugo new content/hardware/my-device.md
```

Fixes: #5
This commit is contained in:
Johannes Kimmel 2023-02-22 22:46:05 +01:00
parent 6b56b1a9a9
commit 28031bd3d7
4 changed files with 224 additions and 1 deletions

50
archetypes/hardware.md Normal file
View File

@ -0,0 +1,50 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
hardware:
manufacturer: MFG
model: Model
chip: SoC
recommended: true
cores: 2
threads: 4
clock: 1000
ram: 262144
flash: 262144
serial:
- ttl
- usb
- rj45
interface:
- dev: eth0
type: rj45
speed: 1000
features: [ 24V, dsa, PD ]
roleL3: wan
roleNode: wan
- dev: eth1
type: rj45
speed: 1000
features: [ 802.3af, dsa ]
roleL3: client
roleNode: client
- dev: eth4
type: sfp
speed: 1000
features: [ ]
roleL3: client
roleNode: batman
- dev: wifi2
type: 2ghz
speed: 150
features: [ "n", 1T, 1R ]
- dev: wifi5
type: 5ghz
speed: 866
features: [ ac, 2T, 2R ]
benchmark:
benchmark1: measurement
---
## Spezifikation
{{< detailsofhardware >}}

View File

@ -4,4 +4,4 @@ bookCollapseSection: true
date: 2022-12-01T17:25:00+01:00
---
{{< section >}}
{{< tableofhardware >}}

View File

@ -0,0 +1,147 @@
{{ $hw := .Page.Params.hardware }}
<h3>Datenblatt</h3>
{{ with $hw }}
<table>
<tr>
<td>Bezeichnung</td>
<td>{{ .manufacturer }} {{ .model }}</td>
</tr>
<tr>
<td>Empfohlen</td>
<td>{{ cond .recommended (emojify ":heavy_check_mark:") (emojify ":x:") }}</td>
</tr>
<tr>
<td>SoC</td>
<td>{{ .chip }}</td>
</tr>
<tr>
<td>CPU</td>
<td>{{ .cores }} Core {{ .threads }} Threads @ {{ .clock }} MHz</td>
</tr>
<tr>
<td>RAM</td>
<td>{{ div .ram 1024 }}MiB</td>
</tr>
<tr>
<td>Flash</td>
<td>{{ div .flash 1024 }}MiB</td>
</tr>
{{ with .serial }}
<tr>
<td>Serielle Schnittstelle</td>
<td>{{ delimit . ", " }}</td>
</tr>
{{ end }}
</table>
{{ end }}
{{ with $hw.interface }}
<h3>Schnittstellen</h3>
{{ $wired := where . "type" "in" (slice "rj45" "sfp") }}
{{ with $wired }}
<h4>Kabelgebunden</h4>
<table>
<tr>
<th></th>
{{ range . -}}
<th>{{ .dev }}</th>
{{ end }}
</tr>
<tr>
<th>Typ</th>
{{ range . -}}
<td>{{ .speed }}Mbps {{ .type | upper }}</td>
{{ end }}
</tr>
{{ if where . ".features" "intersect" (slice "24V" "802.3af" "802.3at" "PD") }}
<tr>
<th>PoE</th>
{{ range . -}}
<td>{{ delimit (intersect .features (slice "24V" "802.3af" "802.3at" "PD")) ", " }}</td>
{{ end }}
</tr>
{{ end }}
{{ if where . ".features" "intersect" (slice "dsa") }}
<tr>
<th>DSA Port</th>
{{ range . -}}
<td>{{ cond (in .features "dsa") (emojify ":heavy_check_mark:") "" }}</td>
{{ end }}
</tr>
{{ end }}
{{ if where . "roleL3" "!=" nil }}
<tr>
<th>Belegung L3</th>
{{ range . -}}
<td>{{ echoParam . "roleL3" }}</td>
{{ end }}
</tr>
{{ end }}
{{ if where . "roleNode" "!=" nil }}
<tr>
<th>Belegung Node</th>
{{ range . -}}
<td>{{ echoParam . "roleNode" }}</td>
{{ end }}
</tr>
{{ end }}
</table>
{{ end }}
{{ $wireless := where $hw.interface "type" "in" (slice "2ghz" "5ghz") }}
{{ with $wireless }}
<h4>Wireless</h4>
<table>
<tr>
<th></th>
{{ range . -}}
<th>{{ .dev }}</th>
{{ end }}
</tr>
{{ if where . ".features" "intersect" (slice "bg" "n" "ac" "ax") }}
<tr>
<th>Standard</th>
{{ range . -}}
<td>{{ delimit (intersect .features (slice "bg" "n" "ac" "ax")) ", " }}</td>
{{ end }}
</tr>
{{ end }}
{{ if where . ".speed" "!=" nil }}
<tr>
<th>Datenrate</th>
{{ range . -}}
<td>{{ echoParam . "speed" }} Mbit/s</td>
{{ end }}
</tr>
{{ end }}
</table>
{{ end }}
{{ end }}
{{ with $hw.benchmark }}
<h4>Benchmarks</h4>
<table>
<tr>
<th>Benchmark</th>
<th>Messung</th>
</tr>
{{ range $b, $m := . }}
<tr>
<td>{{ $b }}</td>
<td>{{ $m }}</td>
</tr>
{{ end }}
</table>
{{ end }}
<!-- test -->
<h2>debug :)</h2>
{{ template "treeview" .Page.Params.hardware }}
{{ define "treeview" }}
<ul>
{{ range $k, $v := . }}
<li>{{ $k }}
{{ if (or (reflect.IsMap $v) (reflect.IsSlice $v)) }}{{ template "treeview" $v }}{{ else }}{{ $v }}{{end}}
</li>
{{ end }}
</ul>
{{ end }}
{{ highlight (jsonify (dict "indent" "\t") .Page.Params.hardware) "json" }}

View File

@ -0,0 +1,26 @@
<table>
<tr>
<th>Hersteller</th>
<th>Modell</th>
<th>DSA Ports</th>
<th>Radios</th>
<th>Schnittstellen</th>
<th>Empfohlen</th>
</tr>
{{ range $device := where .Page.Pages "Params.hardware" "!=" nil }}
{{ $hw := $device.Params.hardware }}
<tr>
<td>{{ $hw.manufacturer }}</td>
<td><a href="{{ $device.RelPermalink }}">{{ $hw.model }}</a></td>
<td>{{ where $hw.interface "features" "intersect" (slice "dsa") | len }}</td>
<td>{{ where $hw.interface "type" "in" (slice "2ghz" "5ghz") | len }}</td>
<td>
{{ range $type := slice "sfp" "rj45" "2ghz" "5ghz" }}
{{ $n := (where $hw.interface "type" "in" (slice $type) | len) }}
{{ if gt $n 0 }}{{ $n }}x<code>{{ $type }}</code>{{ end }}
{{ end }}
</td>
<td>{{ cond $hw.recommended (emojify ":heavy_check_mark:") (emojify ":x:") }}</td>
</tr>
{{ end }}
</table>