#!/usr/bin/python3

import argparse
import struct
import subprocess
import json
import sys

from os import environ,path
from impacket.krb5.ccache import CCache
from base64 import b64encode

home = ""
nethome = ""
vminfo = {}

def get_printers():
    printers = []
    try:
        result = subprocess.run(['lpstat', '-v'], capture_output=True, text=True, check=True)
        for line in result.stdout.splitlines():
            # Extrahiere den Druckernamen
            printer_name = line.split()[2].rstrip(':')
            ipp_url = f"ipp://192.168.122.1/printers/{printer_name}"
            printer = { 'Name': printer_name, 'IppURL': ipp_url }
            printers.append(printer)
        return printers
    except subprocess.CalledProcessError as e:
        sys.stderr.write(f"Fehler beim Abrufen der Drucker: {e}")
        return []

def get_groups(username):
    try:
        result = subprocess.run(['id', '-Gnz',  username], capture_output=True, text=True, check=True)
        groups = result.stdout.strip().split('\0')
        return groups
    except subprocess.CalledProcessError as e:
        sys.stderr.write(f"Fehler beim Abrufen der Gruppen: {e}")
        return []

def get_krb5 ():
    krb5 = {}
    ccachefilename = environ.get('KRB5CCNAME').replace('FILE:', '')
    if ccachefilename:
        try:
            ccache = CCache.loadFile(ccachefilename)
            cred = ccache.toKRBCRED()
            cred_enc = b64encode(cred)
            krb5['cred'] = cred_enc.decode('utf-8')
            krb5['starttime'] = ccache.credentials[0]['time']['starttime']
            krb5['endtime'] = ccache.credentials[0]['time']['endtime']
            krb5['renew_till'] = ccache.credentials[0]['time']['renew_till']
        except:
            sys.stderr.write("Fehler beim Ticket laden")
    return krb5

def get_mounts():
    mounts = []
    mounts.append({ 'Drive': 'H', 'RemotePath': '\\\\server.pn.steinbeis.schule' + nethome.replace('/srv/samba/schools','').replace('/','\\'), 'Name': 'Home_Server' })
    mounts.append({ 'Drive': 'T', 'RemotePath': '\\\\server.pn.steinbeis.schule\\default-school\\share', 'Name': 'Tausch' })
    if "role-teacher" in vminfo['Groups']:
        mounts.append({ 'Drive': 'S', 'RemotePath': '\\\\server.pn.steinbeis.schule\\default-school\\students', 'Name': 'SuS' })
    return mounts

def get_user_folders():
    HOME="H:"
    if environ.get('HOME') != nethome:
        HOME="Y:"
    folders = []
    folders.append( {'Name': 'Personal', 'Path': f"{HOME}\Dokumente"} )
    folders.append( {'Name': 'My Pictures', 'Path': f"{HOME}\Bilder"} )
    folders.append( {'Name': 'My Music', 'Path': f"{HOME}\Musik"} )
    folders.append( {'Name': 'My Video', 'Path': f"{HOME}\Videos"} )
    return folders

def get_quickaccess():
    quickaccess = []
    quickaccess.append( 'H:\\transfer' )
    return quickaccess

def parse_args():
    parser = argparse.ArgumentParser()
    #parser.add_argument('input_file', help="File in kirbi (KRB-CRED) or ccache format")
    #parser.add_argument('output_file', help="Output file")
    return parser.parse_args()


def main():
    global home, nethome

    args = parse_args()

    home = environ.get('HOME')

    vminfo['User'] = environ.get('USER')
    vminfo['Groups'] = get_groups(environ.get('USER'))

    for dir in ['teachers','examusers','staff','parents']:
        potential_path = f"/srv/samba/schools/default-school/{dir}/{vminfo['User']}"
        if path.isdir(potential_path):
            nethome = potential_path
            break
    if not nethome:
        result = subprocess.run(['find', '/srv/samba/schools/default-school/students/', '-name', vminfo['User'], '-maxdepth', '2', '-type', 'd'], capture_output=True, text=True, check=False)
        nethome = result.stdout.splitlines()[0]

    vminfo['Printers'] = get_printers()
    vminfo['krb5'] = get_krb5()
    vminfo['Mounts'] = get_mounts()
    vminfo['UserShellFolders'] = get_user_folders()
    vminfo['QuickAccess'] = get_quickaccess()

    vminfo_json = json.dumps(vminfo, ensure_ascii=False, indent=4)
    print(vminfo_json)

if __name__ == '__main__':
    main()


