#!/usr/bin/python

import sys, subprocess, os, signal, re

LVE_FILE = '/proc/lve/list'

# GET VERSION from /proc/lve/list
def get_lve_version():
    try:
        f = open(LVE_FILE,'r')
        lines = f.readlines()
        try:
            LVE_VERSION = [int(lines[0][0]),'OK']
        except IndexError:
            LVE_VERSION = [None,'clcommon: get_lve_version: Can`t get data from ' + LVE_FILE] 
        if LVE_VERSION[0] > 6:
                LVE_VERISON = [6,'OK']
    except IOError:
        LVE_VERSION = [None,'clcommon: get_lve_version: Can`t open file ' + LVE_FILE]

    return LVE_VERSION


BYTES_CONVERSION_TABLE = {
    'K': 1,
    'M': 1024,
    'G': 1024 * 1024,
    'T': 1024 * 1024 * 1024
}


def validate_cpu(val):
   ''' check that val is a valid CPU limit (0-100 int or speed (% or MHZ\GHZ))
   return val if ok a
   '''
   data = str(val)
   regexp_int = re.compile(r'\d{1,2}0?$') # old cpu limit
   regexp_speedp = re.compile(r'\d+(?:\.\d+)?%$') # speed %
   regexp_speedf = re.compile(r'\d+(?:\.\d+)?(mhz|ghz)+$', re.IGNORECASE) # speed  freq
   p1 = regexp_int.match(data)
   p2 = regexp_speedp.match(data)
   p3 = regexp_speedf.match(data)
   if p1 != None or p2 != None or p3 != None:
      return val
   return None


def validate_int(val, min_val = 0, max_val = sys.maxint):
    '''
    Check that val - is a string number 
    
    return val as a string
    '''

    try:
        dig_val = int(val)
    except ValueError:
        return None
    if max_val >= dig_val >= min_val:
        return val

def memory_to_page(val,  min_val=0, max_val=sys.maxint):
    try:
        suffix = val[-1]
        if suffix.isdigit():
            suffix = 'K'
            val = val+suffix
        result = int(float(val[:-1]) * BYTES_CONVERSION_TABLE[suffix.upper()] / 4)
        if max_val >= result >= min_val:
            return result
    except (IndexError, ValueError, KeyError):
        pass
    return None

def page_to_memory(pages):
    if pages < 256: # KB
        return str(pages*4)+'K'
    if pages < 262144: #MB
        return str(round(float(pages)*4/1024,2))+'M'
    return str(round(float(pages)*4/(1024*1024),2))+'G' #GB

def reload_processes( item, username ):
    ps = subprocess.Popen(['/bin/ps','-U',username,'-u',username],stdout=subprocess.PIPE)
    lines = ps.communicate()[0].split("\n")
    for row in lines:
        parts = row.rstrip().split()
        try:
            parts[-1].index(item)
            os.kill( int(parts[0]), signal.SIGHUP )
        except (IndexError, ValueError, OSError):
            continue

