Skip to content

Instantly share code, notes, and snippets.

View muety's full-sized avatar
🤓

Ferdinand Mütsch muety

🤓
View GitHub Profile
@muety
muety / immich_clean_duplicates.py
Created August 1, 2024 20:36
Script to clean up duplicates in Immich based on their file size.
#!/usr/bin/python
# Script to clean up duplicates in Immich based on their file size.
#
# Rationale: I observed that photos which I had applied the Google Photos' "Optimize" filter to, are imported in their original and edited versions,
# while the edited version usually seems to have a smaller file size, despite same resolution (lower JPEG quality, maybe?).
# This script iterates all duplicates detected by Immich itself and, given a pair of two, removes the smaller one if their file names and creations dates match
#
# Prerequisites:
# 1. Run Immich Smart Search
@muety
muety / tibber.py
Created July 19, 2024 13:03
Script to fetch the current electricity market price in Germany
#!/usr/bin/python
# Script to fetch the current electricity market price in Germany from Tibber's API.
# Borrowed from https://github.com/mampfes/ha_epex_spot/blob/main/custom_components/epex_spot/EPEXSpot/Tibber/__init__.py, thanks!
import argparse
import asyncio
import aiohttp
from datetime import datetime, timedelta
@muety
muety / smard.py
Created June 27, 2024 06:31
Script to fetch the current electricity market price in Germany
#!/usr/bin/python
# Script to fetch the current electricity market price in Germany.
# Borrowed from https://github.com/mampfes/ha_epex_spot/blob/main/custom_components/epex_spot/EPEXSpot/SMARD/__init__.py, thanks!
import argparse
from datetime import datetime, timedelta, timezone
import aiohttp
import asyncio
@muety
muety / next_subuid.sh
Last active August 17, 2023 10:20
Script to determine the next available subuid on Linux
#!/bin/bash
# Author: Ferdinand Mütsch <ferdinand@muetsch.io>
# Script to determine the next subuid / subgid for a user.
# It will consider (a) all already existing subuid / subgid ranges and (b) all "real" user ids.
#
# Note: When using LDAP login (e.g. with SSSD), /etc/passwd won't contain those external users.
# In the case of SSSD, you will have to enable enumeration (https://access.redhat.com/solutions/500433) to make "getent passwd" all local AD / LDAP users.
# However, on the other hand, enabling recommendation is not recommended, because it will cause high load on server and client (https://docs.pagure.org/sssd.sssd/users/faq.html#when-should-i-enable-enumeration-in-sssd-or-why-is-enumeration-disabled-by-default).
# before: https://anchr.io/i/1NQ3x.png
# after: https://anchr.io/i/iMkiK.png
# script is interactive
# it will first fetch all broken products and then ask you for confirmation before actually updating them
import re
import sys
from typing import Tuple, Set, List, Any, Dict
import requests
@muety
muety / current_power.py
Created April 20, 2023 06:12
Simple script to print current power draw in Watts on Linux notebooks
import time
if __name__ == '__main__':
while True:
with open('/sys/class/power_supply/BAT0/current_now', 'r') as f:
current = float(f.readline().strip())
with open('/sys/class/power_supply/BAT0/voltage_now', 'r') as f:
voltage = float(f.readline().strip())
print(f'{current * voltage / 1000000000000} W', end='\r')
@muety
muety / webdav-fileserver.caddyfile
Created April 10, 2023 07:43
Caddy config for anonymous file uploads
http://localhost:8080 {
@get method GET
@propfind method PROPFIND
root * /tmp/data
# TODO: add basic auth for DELETE, PROPPATCH, LOCK, etc.
# TODO: add matchers so uploaded file keys must be uuids
route {
@muety
muety / shelly_wifi_reconnect.js
Last active April 12, 2024 10:07
Shelly 2. Gen device script to repeatedly check for WiFi status and reboot the device if disconnected for long enough
// Reboot after 5 minutes of disconnect
let wait_sec = 30;
let retries = 10;
let c = 0;
let timer = Timer.set(wait_sec * 1000, true, function () {
Shelly.call('WiFi.GetStatus', null, function (result, error_code) {
if (result.status !== 'got ip') {
if (c++ < retries) {
print('wifi not connected, waiting another', (retries - c) * wait_sec, 'seconds until reboot');
@muety
muety / main.py
Created October 24, 2022 19:51
Single FastAPI on_startup() hook with multiple Gunicorn workers (run only once for all processes combined)
# run with gunicorn:
# gunicorn --preload --workers 4 --worker-class=uvicorn.workers.UvicornWorker app.main:app
# ('preload' is the important bit here)
# alternatively, set GUNICORN_CMD_ARGS='--preload'
import ctypes
import multiprocessing as mp
from fastapi import FastAPI
#!/usr/bin/python
# TODO: https://stackoverflow.com/a/58840987/3112139
import os
import stat
import time
import logging
import asyncio
from dataclasses import dataclass