mirror of
https://github.com/anotherhadi/nur-packages.git
synced 2026-10-05 11:18:25 +02:00
@@ -23,19 +23,28 @@ jobs:
|
||||
|
||||
- name: Update packages
|
||||
run: |
|
||||
python_pkgs=(toutatis ignorant ghunt user-scanner)
|
||||
go_pkgs=(github-recon gravatar-recon spilltea usbguard-tui jwt-tui settuings fztea)
|
||||
for pkg_dir in pkgs/*/; do
|
||||
pkg="$(basename "$pkg_dir")"
|
||||
default_nix="${pkg_dir}default.nix"
|
||||
[ -f "$default_nix" ] || continue
|
||||
|
||||
for pkg in "${python_pkgs[@]}"; do
|
||||
echo "==> $pkg"
|
||||
nix run nixpkgs#nix-update -- --flake "$pkg" || true
|
||||
done
|
||||
|
||||
for pkg in "${go_pkgs[@]}"; do
|
||||
echo "==> $pkg"
|
||||
if grep -qE 'buildGoModule|buildGo[0-9]+Module' "$default_nix"; then
|
||||
echo "==> $pkg (go)"
|
||||
nix run nixpkgs#nix-update -- --flake --build "$pkg" || true
|
||||
elif grep -qE 'buildPythonApplication|buildPythonPackage' "$default_nix"; then
|
||||
echo "==> $pkg (python)"
|
||||
nix run nixpkgs#nix-update -- --flake "$pkg" || true
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Update README package list
|
||||
run: python3 scripts/update-readme.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Clean build results
|
||||
run: rm -rf result result-*
|
||||
|
||||
- uses: peter-evans/create-pull-request@v7
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
+2
-1
@@ -1,2 +1,3 @@
|
||||
.claude/
|
||||
result/
|
||||
result
|
||||
result-*
|
||||
|
||||
@@ -12,13 +12,20 @@
|
||||
|
||||
## Packages
|
||||
|
||||
| Package | Description | Source |
|
||||
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
||||
| `github-recon` | Retrieves and aggregates public OSINT data about a GitHub user using Go and the GitHub API. Finds hidden emails in commit history, previous usernames, friends, other GitHub accounts, and more. | [anotherhadi/github-recon](https://github.com/anotherhadi/github-recon) |
|
||||
| `gravatar-recon` | Retrieve and aggregate public OSINT data from Gravatar. Given an email address, the tool queries the Gravatar API and extracts useful information such as profile metadata, avatar, social accounts, and contact info. | [anotherhadi/gravatar-recon](https://github.com/anotherhadi/gravatar-recon) |
|
||||
| `toutatis` | Toutatis is a tool that allows you to extract information from instagrams accounts such as e-mails, phone numbers and more. | [megadose/toutatis](https://github.com/megadose/toutatis) |
|
||||
| `ignorant` | ignorant allows you to check if a phone number is used on different sites like snapchat, instagram. | [megadose/ignorant](https://github.com/megadose/ignorant) |
|
||||
| `user-scanner` | Emaill and Username OSINT tool that analyzes username and email presence across multiple platforms, intended for security research, investigations, legitimate analysis. | [kaifcodec/user-scanner](https://github.com/kaifcodec/user-scanner) |
|
||||
<!-- Generated by scripts/update-readme.py — do not edit by hand. -->
|
||||
<!-- PACKAGES:START -->
|
||||
| Package | Description | Source | Updated |
|
||||
| --- | --- | --- | --- |
|
||||
| `fztea` | Remote control your flipper from the local terminal or over SSH | [jon4hz/fztea](https://github.com/jon4hz/fztea) | 2024-09-01 |
|
||||
| `github-recon` | Retrieves and aggregates public OSINT data about a GitHub user using Go and the GitHub API. Finds hidden emails in commit history, previous usernames, friends, other GitHub accounts, and more. | [anotherhadi/github-recon](https://github.com/anotherhadi/github-recon) | 2025-09-22 |
|
||||
| `gravatar-recon` | Retrieve and aggregate public OSINT data from Gravatar. Given an email address, the tool queries the Gravatar API and extracts useful information such as profile metadata, avatar, social accounts, and contact info. | [anotherhadi/gravatar-recon](https://github.com/anotherhadi/gravatar-recon) | 2025-09-25 |
|
||||
| `jwt-tui` | A TUI for inspecting, editing, and signing JSON Web Tokens (JWTs). | [anotherhadi/jwt-tui](https://github.com/anotherhadi/jwt-tui) | 2026-05-26 |
|
||||
| `monitui` | Delightfully minimal TUI for wrangling Hyprland monitors | [nathaniel-fargo/monitui](https://github.com/nathaniel-fargo/monitui) | 2026-03-14 |
|
||||
| `revshell` | CLI reverse shell generator | [Gubarz/revshell](https://github.com/Gubarz/revshell) | 2026-04-12 |
|
||||
| `settuings` | A TUI to manage your Linux system settings like wifi, bluetooth, and more, without leaving the terminal. | [anotherhadi/settuings](https://github.com/anotherhadi/settuings) | 2026-08-13 |
|
||||
| `spilltea` | A minimal, terminal-based HTTP(S) proxy for pentesters and CTF players. | [anotherhadi/spilltea](https://github.com/anotherhadi/spilltea) | 2026-05-30 |
|
||||
| `usbguard-tui` | A terminal UI for managing USB devices via usbguard. | [anotherhadi/usbguard-tui](https://github.com/anotherhadi/usbguard-tui) | 2026-08-23 |
|
||||
<!-- PACKAGES:END -->
|
||||
|
||||
More tools coming soon.
|
||||
|
||||
|
||||
Executable
+127
@@ -0,0 +1,127 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Regenerate the package table in README.md from the flake's own outputs.
|
||||
|
||||
No package names are hardcoded here: every package exposed by
|
||||
`packages.<system>` (except the `default` alias) gets a row, built from its
|
||||
`meta.description` / `meta.homepage`, plus the upstream commit date for the
|
||||
pinned `rev` (fetched from the GitHub API), so the table shows how fresh
|
||||
each pinned version actually is.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import pathlib
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.error
|
||||
import urllib.request
|
||||
|
||||
ROOT = pathlib.Path(__file__).resolve().parent.parent
|
||||
PKGS_DIR = ROOT / "pkgs"
|
||||
README = ROOT / "README.md"
|
||||
START = "<!-- PACKAGES:START -->"
|
||||
END = "<!-- PACKAGES:END -->"
|
||||
|
||||
|
||||
def current_system() -> str:
|
||||
return subprocess.run(
|
||||
["nix", "eval", "--raw", "--impure", "--expr", "builtins.currentSystem"],
|
||||
check=True, capture_output=True, text=True,
|
||||
).stdout.strip()
|
||||
|
||||
|
||||
def package_metadata(system: str) -> dict:
|
||||
expr = (
|
||||
"pkgs: builtins.mapAttrs (name: pkg: {"
|
||||
' description = pkg.meta.description or "";'
|
||||
' homepage = pkg.meta.homepage or "";'
|
||||
"}) (builtins.removeAttrs pkgs [\"default\"])"
|
||||
)
|
||||
out = subprocess.run(
|
||||
["nix", "eval", "--json", f".#packages.{system}", "--apply", expr],
|
||||
check=True, capture_output=True, text=True, cwd=ROOT,
|
||||
).stdout
|
||||
return json.loads(out)
|
||||
|
||||
|
||||
def pinned_rev(name: str) -> str | None:
|
||||
"""Extract the literal `rev` pinned in pkgs/<name>/default.nix, resolving
|
||||
a `${version}` interpolation if present."""
|
||||
default_nix = PKGS_DIR / name / "default.nix"
|
||||
if not default_nix.is_file():
|
||||
return None
|
||||
content = default_nix.read_text()
|
||||
|
||||
rev_match = re.search(r'\brev\s*=\s*"([^"]+)"', content)
|
||||
if not rev_match:
|
||||
return None
|
||||
rev = rev_match.group(1)
|
||||
|
||||
if "${version}" in rev:
|
||||
version_match = re.search(r'\bversion\s*=\s*"([^"]+)"', content)
|
||||
if not version_match:
|
||||
return None
|
||||
rev = rev.replace("${version}", version_match.group(1))
|
||||
|
||||
return rev
|
||||
|
||||
|
||||
def upstream_commit_date(homepage: str, rev: str) -> str | None:
|
||||
match = re.match(r"https://github\.com/([^/]+)/([^/]+)/?$", homepage)
|
||||
if not match:
|
||||
return None
|
||||
owner, repo = match.groups()
|
||||
|
||||
url = f"https://api.github.com/repos/{owner}/{repo}/commits/{rev}"
|
||||
req = urllib.request.Request(url, headers={"User-Agent": "nur-packages-readme-bot"})
|
||||
token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN")
|
||||
if token:
|
||||
req.add_header("Authorization", f"Bearer {token}")
|
||||
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=15) as resp:
|
||||
data = json.load(resp)
|
||||
except (urllib.error.URLError, urllib.error.HTTPError) as exc:
|
||||
print(f"warning: could not fetch commit date for {owner}/{repo}@{rev}: {exc}", file=sys.stderr)
|
||||
return None
|
||||
|
||||
date = data.get("commit", {}).get("committer", {}).get("date")
|
||||
return date.split("T")[0] if date else None
|
||||
|
||||
|
||||
def render_table(meta: dict) -> str:
|
||||
lines = [
|
||||
"| Package | Description | Source | Updated |",
|
||||
"| --- | --- | --- | --- |",
|
||||
]
|
||||
for name in sorted(meta):
|
||||
info = meta[name]
|
||||
description = info["description"].strip()
|
||||
homepage = info["homepage"]
|
||||
label = homepage.removeprefix("https://github.com/") if homepage else homepage
|
||||
source = f"[{label}]({homepage})" if homepage else ""
|
||||
|
||||
updated = ""
|
||||
rev = pinned_rev(name)
|
||||
if homepage and rev:
|
||||
updated = upstream_commit_date(homepage, rev) or ""
|
||||
|
||||
lines.append(f"| `{name}` | {description} | {source} | {updated} |")
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
system = current_system()
|
||||
meta = package_metadata(system)
|
||||
table = render_table(meta)
|
||||
|
||||
content = README.read_text()
|
||||
pattern = re.compile(re.escape(START) + r".*" + re.escape(END), re.S)
|
||||
if not pattern.search(content):
|
||||
raise SystemExit(f"README.md is missing {START}/{END} markers")
|
||||
|
||||
README.write_text(pattern.sub(f"{START}\n{table}\n{END}", content))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user