#!/usr/bin/python

# Copyright (c) 2000-2018 Synology Inc. All rights reserved.

import sys
import json
import glob
import subprocess
import os.path

VIRT_WEBAPI_PREFIX = 'SYNO.Virtualization'

class bcolors:
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'

def prt_info(msg):
    print('[' + bcolors.OKGREEN + 'INFO' + bcolors.ENDC + '] ' + msg)

def prt_warn(msg):
    print('[' + bcolors.WARNING + 'WARN' + bcolors.ENDC + '] ' + msg)

def prt_err(msg):
    print('[' + bcolors.FAIL + 'ERROR' + bcolors.ENDC + '] ' + msg)

def check_json_key(data, key):
    return data is not None and key in data

def find_disk_location(volume_path, guest_id):
    devnull = open(os.devnull, 'wb')
    iscsi_folder = volume_path + '/@iSCSI/LUN'
    argument = ['find', iscsi_folder, '-type', 'f', '-name', '*' + guest_id + '*']
    resp = subprocess.Popen(argument, stdout=subprocess.PIPE, stderr=devnull).communicate()[0]

    return resp

def send_webapi(api, method, ver, params=[]):
    devnull = open(os.devnull, 'wb')
    argument = ['/usr/syno/bin/synowebapi', '--exec', 'api=' + api, 'method=' + method, 'version=' + ver]
    for param in params:
        argument.append(param)
    resp = json.loads(subprocess.Popen(argument, stdout=subprocess.PIPE, stderr=devnull).communicate()[0])
    if not check_json_key(resp, 'success'):
        return False, None
    elif resp['success'] == False:
        return False, resp['error']
    else:
        return True, resp['data'] if check_json_key(resp, 'data') else None

def get_guest_id_and_repo_id(name):
    ret, resp = send_webapi(VIRT_WEBAPI_PREFIX + '.Guest', 'list_basic', str(1))
    if not ret:
        return None

    for guest in resp['guests']:
        if guest['name'] == name:
            return guest["guest_id"], guest["repo_id"]
    return None, None

def get_repo_volume_path(repo_id):
    ret, resp = send_webapi(VIRT_WEBAPI_PREFIX + '.Repo', 'get', str(1),
            ["repo_id=\""+repo_id+"\""])
    if not ret:
        return None

    return resp["volume_path"]

def main():
    prt_info('Copyright (c) 2000-2018 Synology Inc. All rights reserved.\n')

    if 2 != len(sys.argv):
        prt_err('Usage: ./disklocation GUEST_NAME')
        return

    guest_name = sys.argv[1]
    guest_id, repo_id = get_guest_id_and_repo_id(guest_name)
    if guest_id is None or repo_id is None:
        prt_err('failed to find guest id or repo id')
        return

    volume_path = get_repo_volume_path(repo_id)
    if volume_path is None:
        prt_err('failed to find repo volume path')
        return

    locations = find_disk_location(volume_path, guest_id)
    prt_info('location:\n' + locations)

if __name__ == '__main__':
    main()
