#!/usr/bin/python
import os,sys

help="""
    Usage:
    sdled (without options) - display all sd* devices status
    sdled /dev/sd[letter] - display status of requested device
    sdled /dev/sd[letter] faul - set led indicator to 'faulty' 
                          this WILL NOT make device faulty, just set 
                          enclosure led to 'FAULTY' status.
    sdled /dev/sd[letter] locate - set led indicator to 'locate' status
    sdled /dev/sd[letter] off - turn of faulty/locate status

    sdled ALL off
    sdled ALL fault
    sdled ALL locate - turn all devices to that status (note CAPS ALL)

    sample usage : sdled /dev/sde (show status)
                   sdled /dev/sde locate (turn on 'locate' indicator)
"""

def sd_list():
    """
    return list of all sd devices in /sys/block
    """
    return filter(lambda x: "sd" in x, os.listdir("/sys/block"))

def go_to_enc(dev):
    enc="enclosure_device" #magik string to access enclosure data
    try:
        os.chdir("/sys/block/"+dev+"/device")
        l=filter(lambda x: enc in x, os.listdir("."))
        os.chdir(l[0])
        return True
    except:
        return False


def get_status(dev):
    """
       return status ("N/A", "Off", "Faul", "Locate") for given device
    """
    if not go_to_enc(dev):
        return "N/A" #No magic path, can't get status
    try:
        fault=int(file("fault",'r').readline())
        locate=int(file("locate",'r').readline())
        if(fault):
            return "fault"
        if(locate):
            return "locate"
        return "off"
    except:
        return "N/A" #any error means we can't get status

def set_status(device, status):
    if not go_to_enc(device):
        print "Device %s not supported"%(device)
        return False
    if status == "off":
       file("locate","w").write('0')
       return True
    if not status in ("fault", "locate"):
        print "bad status. Use: off, fault, locate"
        return False
    file(status, "w").write('1')
    return True #no try/exect - if something wrong, do not hide it

sys.stderr.write("sdled is deprecated. Use encled\n")

if len(sys.argv)<2:
    print "DEVICE NAME      STATUS"
    for d in sd_list():
        print ("/dev/"+d).ljust(17),  get_status(d)
    sys.exit(0)
if len(sys.argv)==3:
    if sys.argv[1]=="--help" or sys.argv[1]=="-h":
        print help
        sys.exit(0)

if sys.argv[1]=="ALL":
   for d in sd_list():
       try:
           set_status(d,sys.argv[2])
       except:
           pass
   sys.exit(0)
   
if ("/" in sys.argv[1]):
    device = sys.argv[1].split('/')[-1]
else:
    device = sys.argv[1]

if len(sys.argv)==2:
    print get_status(device)
    sys.exit(-1)

set_status(device,sys.argv[2])

