forked from pa-0/PwshScripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcollect-kernel-log.nu
More file actions
executable file
·81 lines (69 loc) · 2.57 KB
/
collect-kernel-log.nu
File metadata and controls
executable file
·81 lines (69 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env nu
# -----------------------------------------------------------------------------
# Script : Kernel log collector
# Desc : Create per-kernel dir and capture boot/kernel logs for current boot.
# Date : 09-12-2025
# Deps : Nushell core + journalctl (systemd)
#
# Usage:
# ./bug-tool.nu <category> <slug>
# ex: ./bug-tool.nu amdgpu memory_error
#
# Notes:
# - linux-only; requires systemd-journald
# TODO: illumos/solaris for dmesg or /var/adm/**log
# - Creates: ~/bugs/kernel/<X.Y.Z>/<category>/
# - Files: MM-DD_<slug>_b.log (boot), MM-DD_<slug>.log (kernel)
# - TODO: use numbering on file name when creating logs starting 01_ since there
# can be multiple logs per day
# -----------------------------------------------------------------------------
def main [
category: string
slug: string
] {
# Validate args (disallow path separators).
if ($category | str contains '/') or ($slug | str contains '/') {
print "error: category/slug must not contain '/'"
exit 2
}
# Base dir for kernel bugs.
let bugs_base = ($env.HOME | path join "bugs" | path join "kernel")
# Kernel version X.Y.Z from uname kernel-release.
let kr = (uname | get kernel-release)
let kv = ($kr | split row '-' | first)
# Target dir for this kernel/category.
let kdir = ($bugs_base | path join $kv)
let cdir = ($kdir | path join $category)
# Create dir if missing; print tilde-style path.
if not ($cdir | path exists) {
mkdir $cdir
let cdir_disp = ("~/" + ($cdir | path relative-to $env.HOME))
print $"Initialized: ($cdir_disp)"
}
# Today (MM-DD).
let date_str = (date now | format date "%m-%d")
# Sanitize slug (spaces -> underscores).
let safe_slug = ($slug | str replace -a ' ' '_')
# Output file paths.
let base = $"($date_str)_($safe_slug)"
let boot_fp = ($cdir | path join $"($base)_b.log")
let kern_fp = ($cdir | path join $"($base).log")
# Boot log (current boot). Color on; no pager.
let _ = (try {
with-env {SYSTEMD_COLORS: "1"} {
journalctl --no-hostname --boot --no-pager
} | save --force --raw $boot_fp
} catch { print "error: journalctl boot log failed" })
# Kernel log (dmesg from current boot). Color on; no pager.
let _ = (try {
with-env {SYSTEMD_COLORS: "1"} {
journalctl --no-hostname --boot --dmesg --no-pager
} | save --force --raw $kern_fp
} catch { print "error: journalctl kernel log failed" })
# Summary.
print "Logs collected:"
print $"1. ("~/" + ($boot_fp | path relative-to $env.HOME))"
print $"2. ("~/" + ($kern_fp | path relative-to $env.HOME))"
print ""
ls $cdir
}