#!/usr/bin/python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
import os
import logging
import sys
import socket
import subprocess
import time

from cloudutils.cloudException import CloudRuntimeException, CloudInternalException
from cloudutils.utilities import initLoging, bash
from cloudutils.configFileOps import  configFileOps
from cloudutils.globalEnv import globalEnv
from cloudutils.networkConfig import networkConfig
from cloudutils.syscfg import sysConfigFactory

from optparse import OptionParser
    
url="http://rightscale-cloudstack.s3.amazonaws.com/kvm/centos/5.4/RightImage_CentOS_5.4_x64_v5.6.34.qcow2.bz2"
destFolder="/mnt/template/tmpl/1/4/"
metaFile="template.properties"

def getUserInputs():
    print "Welcome to myCloud Setup:"

    mgtSvr = "myagent.cloud.com"

    cfo = configFileOps("/etc/cloud/agent/agent.properties")
    oldToken = cfo.getEntry("zone")
    if oldToken == "default":
        oldToken = ""
    zoneToken = raw_input("Please input the Zone Token:[%s]"%oldToken)
    
    if zoneToken == "":
        if oldToken == "":
            print "Please input a valid zone token"
            exit(1)
        zoneToken = oldToken

    try:
        defaultNic = networkConfig.getDefaultNetwork()
    except:
        print "Failed to get default route. Please configure your network to add a default route"
        exit(1)
        
    network = defaultNic.name

    return [mgtSvr, zoneToken, network]

def downloadTemplate():
    if not os.path.exists(destFolder):
        os.makedirs(destFolder)
    oldName =url.split("/")[-1]
    templateFile=url.split("/")[-1].replace(".bz2","")

    templateFullPath = destFolder + templateFile
    metaFullPath = destFolder + metaFile
    if os.path.exists(templateFullPath):
        if os.path.exists(metaFullPath):
            return True
        os.remove(templateFullPath) 

    print "Need to download myCloud template into your local disk, from " + url + " to " + destFolder + " :"
    try:
        proc = subprocess.Popen(["/bin/bash", "-c", "wget -O - " + url + " | bunzip2 > " + destFolder + templateFile])
        proc.communicate()
        ret = proc.poll()
        if ret is None or ret < 0:
            raise CloudRuntimeException("Failed to download template")
    except KeyboardInterrupt:
        if os.path.exists(templateFullPath):
            os.remove(templateFullPath) 
        raise CloudRuntimeException("Downloading process is interrupted")
    
    file = open(metaFullPath, "w")
    physicalSize = os.stat(templateFullPath).st_size
    virtualSize = bash("qemu-img info " + templateFullPath + " |grep virtual").getStdout().split("(")[1].split(" ")[0]
    cfo = configFileOps(metaFullPath)
    cfo.addEntry("filename", templateFile)
    cfo.addEntry("id", "4")
    cfo.addEntry("qcow2.size", str(physicalSize))
    cfo.addEntry("public", "true")
    cfo.addEntry("uniquename", "Rightscale CentOS 5.4")
    cfo.addEntry("qcow2.virtualsize", virtualSize)
    cfo.addEntry("virtualsize", virtualSize)
    cfo.addEntry("hvm", "true")
    cfo.addEntry("description", "Rightscale CentOS 5.4")
    cfo.addEntry("qcow2", "true")
    cfo.addEntry("qcow2.filename", templateFile)
    cfo.addEntry("size", str(physicalSize))
    cfo.save()


if __name__ == '__main__':
    initLoging("/var/log/cloud/setupAgent.log")
    
    glbEnv = globalEnv()

    glbEnv.mode = "Agent"
    glbEnv.agentMode = "myCloud"
    parser = OptionParser()
    parser.add_option("-z", "--zone-token", dest="zone", help="zone token")

    (options, args) = parser.parse_args()
    if options.zone is None:
        userInputs = getUserInputs()
        glbEnv.mgtSvr = userInputs[0]
        glbEnv.zone = userInputs[1]
        glbEnv.defaultNic = userInputs[2]
    else:
        glbEnv.zone = options.zone
        try:
            defaultNic = networkConfig.getDefaultNetwork()
            glbEnv.defaultNic = defaultNic.name
        except:
            print "Failed to get default route. Please configure your network to have a default route"
            sys.exit(2)

    #generate UUID
    glbEnv.uuid = configFileOps("/etc/cloud/agent/agent.properties").getEntry("guid")
    if glbEnv.uuid == "":
            glbEnv.uuid = bash("uuidgen").getStdout()
        
    print "Starting to configure your system:"
    syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
    try:
        syscfg.config()
        downloadTemplate()
        syscfg.svo.stopService("cloud-agent")
        syscfg.svo.enableService("cloud-agent")
        print "myCloud setup is Done!"
    except (CloudRuntimeException,CloudInternalException), e:
        print e
        print "Try to restore your system:"
        try:
            syscfg.restore()
        except:
            pass
