#!/usr/bin/python
# Move smart-cache setting for LUs from the FS coalescer setting for the LU
# to the iSCSI pool config file

import errno
import os
import os.path
import sys
import logging
import syslog

import isi.iscsi.config as iscsi

from isi.app.lib import safelockfile
from isi.error import  IsiSystemError

SMARTCACHE_FIX_INIT_LOCK = "/ifs/.ifsvar/iscsi/smartcache_fix.lock"

SMARTCACHE_FIX_INIT_FLAG = "/ifs/.ifsvar/iscsi/smartcache_fix.flag"

def print_error(msg, exitCode = 1):
    print >> sys.stderr, msg
    sys.exit(exitCode)

def synced_touch(path):
    f = open(path, "w")
    f.flush()
    os.fsync(f.fileno())
    f.close()

def main():
    # We need to block all other nodes from continue until we've finished
    # the initialization
    try:
        sentry = safelockfile(SMARTCACHE_FIX_INIT_LOCK, 'w')
    except EnvironmentError, e:
        syslog.syslog(syslog.LOG_ERR, "error acquiring lock: %s" % str(e))
        return os.EX_OSFILE

    if not os.path.exists(SMARTCACHE_FIX_INIT_FLAG):
        try:
            iscsi.turn_coal_on_fix_config()
        except IsiSystemError, e:
            print_error( str(e[1]), e[0] )

        synced_touch(SMARTCACHE_FIX_INIT_FLAG)
        os.chmod(SMARTCACHE_FIX_INIT_FLAG, 0600)

    sentry.close()

if __name__ == "__main__":
    syslog.openlog("iscsi_fix_smartcache")
    rc = main()
    syslog.closelog()
    sys.exit(rc)
