#!/usr/bin/env python3
import os
import subprocess
import uuid


def get_part_label(block):
    for device in os.listdir("/dev/disk/by-label/"):
        if block == os.path.basename(os.readlink(f"/dev/disk/by-label/{device}")):
            return device

def detect_os(path):
    if os.path.isfile(f"{path}/etc/os-release"):
        with open(f"{path}/etc/os-release", "r") as f:
            for line in f.readlines():
                if line.startswith("NAME="):
                    distro = line.split("=")[1].strip()
                    if distro[0] == '"' and distro[-1] == '"':
                        distro = distro[1:-1]
                    return distro
    elif os.path.isfile(f"{path}/Windows/System32/ntoskrnl.exe"):
        return "Windows"
    elif os.path.isfile(f"{path}/EFI/pardus/grubx64.efi"):
        return "Pardus (EFI)"
    elif os.path.isfile(f"{path}/EFI/Microsoft/Boot/bootmgfw.efi"):
        return "Windows (EFI)"
    elif os.path.isfile(f"{path}/EFI"):
        return "EFI"
    return None

def search_operating_system():
    # check live
    with open("/proc/cmdline", "r") as f:
        if not "boot=live" in f.read():
            return []
    # list parts
    parts = []
    for block in os.listdir("/sys/block/"):
        if not block[-1].isnumeric():
            for part in os.listdir(f"/sys/block/{block}"):
                if part[-1].isnumeric():
                    parts.append(part)
            continue
        if block.startswith(('loop', 'sr', 'zram', 'fd')):
            continue
        parts.append(block)
    # scan
    ret = []
    for part in parts:
        tmpdir = "/tmp/{}".format(uuid.uuid4())
        os.mkdir(tmpdir)
        subprocess.run(
            ["mount", "-t", "auto", "-o", "defaults,ro", f"/dev/{part}", tmpdir],
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL
        )
        found_label = get_part_label(f"/dev/{part}")
        found_os = detect_os(tmpdir)
        info = {"os":found_os, "label":found_label, "part": f"/dev/{part}"}
        ret.append(info)
        subprocess.run(
            ["umount", "-lf", tmpdir],
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL
        )
        os.rmdir(tmpdir)
    return ret

if __name__ == "__main__":
    oses = search_operating_system()
    for info in oses:
        if info["os"]:
            print("{}: {}".format(info["os"], info["part"]))
        elif info["label"]:
            print("{}: {}".format(info["label"], info["part"]))
        else:
            print("Unknown: {}".format(info["part"]))
