#!/usr/bin/env python3
"""Dekode bitmask capability pada /proc/self/status menjadi nama."""
NAMA_CAP = [
    "cap_chown", "cap_dac_override", "cap_dac_read_search",   # bit 0-2
    "cap_fowner", "cap_fsetid", "cap_kill",                   # bit 3-5
    "cap_setgid", "cap_setuid", "cap_setpcap",                # bit 6-8
    "cap_linux_immutable", "cap_net_bind_service",            # bit 9-10
    "cap_net_broadcast", "cap_net_admin", "cap_net_raw",      # bit 11-13
    "cap_ipc_lock", "cap_ipc_owner", "cap_sys_module",        # bit 14-16
    "cap_sys_rawio", "cap_sys_chroot", "cap_sys_ptrace",     # bit 17-19
    "cap_sys_pacct", "cap_sys_admin", "cap_sys_boot",         # bit 20-22
    "cap_sys_nice", "cap_sys_resource", "cap_sys_time",       # bit 23-25
    "cap_sys_tty_config", "cap_mknod", "cap_lease",           # bit 26-28
    "cap_audit_write", "cap_audit_control", "cap_setfcap",    # bit 29-31
    "cap_mac_override", "cap_mac_admin", "cap_syslog",        # bit 32-34
    "cap_wake_alarm", "cap_block_suspend", "cap_audit_read",  # bit 35-37
    "cap_perfmon", "cap_bpf", "cap_checkpoint_restore",       # bit 38-40
]


def baca_bitmask(bidang):
    """Ambil nilai heksadesimal field tertentu dari /proc/self/status."""
    with open("/proc/self/status") as f:
        for baris in f:
            if baris.startswith(bidang + ":"):
                return int(baris.split()[1], 16)
    return 0


def dekode(nilai):
    """Ubah bitmask integer menjadi daftar nama capability."""
    hasil = []
    for i, nama in enumerate(NAMA_CAP):
        if nilai >> i & 1:
            hasil.append(nama)
    return hasil


def tampil(label, daftar):
    if not daftar:
        print(f"{label}: (kosong)")
        return
    print(f"{label}: {len(daftar)} capability")
    for nama in daftar:
        print(f"  {nama}")


tampil("CapEff (efektif)", dekode(baca_bitmask("CapEff")))
tampil("CapBnd (bounding)", dekode(baca_bitmask("CapBnd")))
