#!/usr/bin/python3

logfile="/tmp/btrfscheck.log"
with open(logfile,"a") as f:
    f.write("Ahoj1-----------------------------------\n")

import os
import socket
import requests
import subprocess as sp


from notifator import telegram
from fire import Fire


def btrfssh():
    """
    Show details about btrfs mounts and / and /home smartctl
    """
    output=[]
    output.append("##### BTRFS ####")
    # #======== extract UUIDS, remember datafree
    # CMD='sudo btrfs fi show'
    # r=sp.check_output(CMD.split()).decode("utf8")
    # #print(r)
    # r=r.split("\n")
    # r=[ x for x in r if x.find("uuid:")>0 ]
    # uuids=[ x.split()[-1] for x in r ]
    # #print(uuids)

    #==========mounted?
    CMD='mount'
    r=sp.check_output(CMD.split()).decode("utf8")
    #print(r)
    r=r.split("\n")
    r=[ x for x in r if x.find("type btrfs")>0 ]
    #print(r)
    devs=[ x.split()[0] for x in r ]
    mpoints=[ x.split()[2] for x in r ]
    for i in range(len(devs)):
        output.append( "{:14s} : {}".format(devs[i],mpoints[i])  )
        #print()

    #print()
    # #=========== datafree: data for each mount
    # for i in range(len(mpoints)):
    #     print("===={}====".format(devs[i]))
    #     CMD='sudo btrfs fi df '+mpoints[i]
    #     r=sp.check_output(CMD.split()).decode("utf8")
    #     #r=r.split("\n")
    #     print(r)

    #========== USAGE
    CMD="sudo btrfs fi show"
    r=sp.check_output(CMD.split()).decode("utf8").split("\n")
    activeuuid=""
    for i in r:
        if i.find("uuid:")>0:
            activeuuid=i.split()[-1]
        if activeuuid=="":
            continue
        else:
            if i.find("size")>0 and i.find("used")>0:
                size=i.strip().split()[3]
                used=i.strip().split()[5]
                path=i.strip().split()[-1]
                #print()
                output.append("{:14s} {} / {}".format(path,used,size))
    #print(r)
    #print()
    output.append("")

    #=========== ERRORCHECK
    for i in range(len(mpoints)):
        #print()
        output.append("===={}====".format(devs[i]) )
        CMD='sudo btrfs device stats '+mpoints[i]
        r=sp.check_output(CMD.split()).decode("utf8")
        #r=r.split("\n")
        #print(r)
        for i in r.split("\n"):
            output.append(i)

    #print()
    output.append("######## SMARTCTL ######")
    #=========smartctl - look at df first
    CMD="df"
    r=sp.check_output(CMD).decode("utf8").rstrip().split("\n")
    root=[x for x in r if x.split()[-1]=="/"]
    home=[x for x in r if x.split()[-1]=="/home"]
    roothome=[root[0].split()[0],home[0].split()[0]]
    #print()
    output.append("root/home: {}".format(roothome))

    #============ smartctl: i had -l error -H .... not enough i think
    #
    for i in roothome:
        #print()
        output.append("====={}======".format(i) )
        CMD="sudo smartctl -l error -H "+i
        r=sp.check_output(CMD.split()).decode("utf8").strip().split("\n")
        r=[x for x in r if x.find("smartctl ")<0]
        r=[x for x in r if x.find("Copyright")<0]
        r=[x for x in r if x.find("START OF READ")<0]
        r=[x for x in r if x.find("SMART Error Log Version")<0]
        r=[x.replace("overall-health self-assessment","") for x in r if len(x)>0]
        r=[x.replace("Error Information","") for x in r ]
        for j in r:
            output.append(j)

        CMD="sudo smartctl -t long "+i
        try:
            r=sp.check_output(CMD.split()).decode("utf8").strip().split("\n")
        except:
            print("X.. long test may be running")
        CMD="sudo smartctl -l error -l selftest "+i
        try:
            r=sp.check_output(CMD.split()).decode("utf8").strip().split("\n")
        except sp.CalledProcessError as grepexc:
            print("X... ERROR DETECTED in  l error l selftest")
            r = grepexc.output.decode("utf8").strip().split("\n")
        r = [x for x in r if x.find("#")==0 ]
        r = [x for x in r if x.find("Completed without error")<0 ]

        for j in r:
            output.append(j)
        #print("\n".join(r) )

    print()

    return output




def normal_run(tele=False):
    host=socket.gethostname()
    rhost="?"
    user="?"

    #r=sp.check_output( "/usr/local/bin/btrfs.sh" ).decode("utf8")
    #r=r.split("\n")
    #print(r)
    #out="\n".join(r)
    out=btrfssh()
    out="\n".join(out)
    print(out)

    # out=out.replace("\t"," ")
    # out=out.replace("_","\_")
    # out=out.replace("total=","T=")
    # out=out.replace("used=","U=")
    # out=out.replace(".00GiB","G")
    # out=out.replace(".00MiB","M")
    # out=out.replace("GiB","G")
    # out=out.replace("MiB","M")

    # out=out.replace("Total devices","DEV:")

    # out=out.replace("System","Syst")
    # out=out.replace("Metadata","Meta")
    # out=out.replace("GlobalReserve","Reserv")


    # out=out.replace("devid","#")
    # out=out.replace("path","")
    # out=out.replace("size","")
    # out=out.replace("used","u:")


    #bot_send( "@"+host+": "+out)
    if tele:
        print("D... SENDING TELEGRAM BOT")
        telegram.bot_send("Btrfs", "@"+host+": "+out)

    with open(logfile,"a") as f:
        f.write(user+host+rhost+"FINALE===============\n")





if __name__=="__main__":
    #Fire()
    Fire( normal_run )
