Skip to content

Instantly share code, notes, and snippets.

View suhlig's full-sized avatar
😻
Happy

Steffen Uhlig suhlig

😻
Happy
View GitHub Profile
@suhlig
suhlig / show-systems-json-messages.markdown
Created July 27, 2024 17:30
Systemd can print logs as JSON, making custom log formats simple. In addition, if the messages themselves are JSON, jq can unescape them.
$ journalctl -u concourse-web -f -o json | jq '.MESSAGE | fromjson'
{
  "timestamp": "2024-07-27T17:29:50.525878425Z",
  "level": "info",
  "source": "atc",
  "message": "atc.scanner.tick.start",
 "data": {
@suhlig
suhlig / fetch_file_content_at.go
Created July 24, 2024 21:35
Fetch content of a file from GitHub at a given committish
package main
import (
"context"
"encoding/base64"
"fmt"
"log"
"os"
"github.com/google/go-github/v63/github"
curl -L $(curl -L https://api.github.com/repos/derailed/k9s/releases/latest | jq --raw-output '.assets[] | select(.name == "k9s_Linux_amd64.tar.gz") | .browser_download_url') | tar xz k9s
@suhlig
suhlig / b2-buckets-by-size.sh
Last active May 5, 2024 11:07
Table of b2 buckets sorted by total size
b2 list-buckets --json \
| jq '.[].bucketName' \
| xargs -n 1 b2 get-bucket --showSize \
| jq -r --slurp '["name","size"], (.[] | [.bucketName, .totalSize]) | @csv' \
| qsv sort --numeric --reverse --select size \
| qsv table

Example for a Concourse pipeline triggered my a webhook

Assmuming this pipeline was set as

$ fly --target example set-pipeline --pipeline manual-trigger --config manual-trigger.yml

then you can trigger a new build with

@suhlig
suhlig / go-work-update-all.sh
Last active November 14, 2023 15:00
Update dependencies of all modules in a go workspace
go work edit -json \
| jq --raw-output '.Use.[].DiskPath' \
| xargs -I MODULE zsh -o errexit -c "
cd MODULE
pwd
go get -d -u -t ./...
go mod tidy
[ -d vendor ] && go mod vendor
"
@suhlig
suhlig / tasmota-discover.sh
Created June 9, 2023 10:18
Discover Tasmota devices using MQTT
timeout 2 \
mosquitto_sub \
--url 'mqtts://user:[email protected]/tasmota/discovery/+/config' \
-F %J \
| jq -r '[ .payload.dn, .payload.ip ] | join(" => ")'
@suhlig
suhlig / concourse-fail-step.yml
Last active July 31, 2023 17:41
Make a Concourse job fail so that we can inspect it
- task: fail-for-inspection
config:
platform: linux
image_resource: { type: mock, source: { mirror_self: true } }
run: { path: sh, args: [ -c , "false" ] }
@suhlig
suhlig / attributes.j2
Created February 20, 2023 20:35
Dealing with attributes in HA templates
{% set SENSOR = 'device_tracker.hexa' -%}
{{ SENSOR }} manufactured by {{ device_attr(SENSOR, 'manufacturer') }}
Attributes:
{% for attr in states[SENSOR].attributes -%}
- {{ attr }}: {{state_attr(SENSOR, attr)}}
{% endfor %}
hexa has {{ state_attr('device_tracker.hexa', 'AP SSID') }}
@suhlig
suhlig / concourse-container-metrics.markdown
Created January 15, 2023 10:01
Pulling simple container metrics with jq
  • Container count by pipeline

    $ fly -t uh cs --json | jq -r '[group_by(.pipeline_name)[] | {(.[0].pipeline_name): length }] | add'
    {
      "concourse-resource-proxy": 2,
      "concourse-rss-resource": 2,
      "env-sensors": 7,
      "forwardemail-webhook-rs": 2,
      "mosquitto-prometheus-exporter": 7,