summaryrefslogtreecommitdiff
path: root/azurelinuxagent/pa/provision/default.py
diff options
context:
space:
mode:
Diffstat (limited to 'azurelinuxagent/pa/provision/default.py')
-rw-r--r--azurelinuxagent/pa/provision/default.py106
1 files changed, 50 insertions, 56 deletions
diff --git a/azurelinuxagent/pa/provision/default.py b/azurelinuxagent/pa/provision/default.py
index b07c147..e851036 100644
--- a/azurelinuxagent/pa/provision/default.py
+++ b/azurelinuxagent/pa/provision/default.py
@@ -25,69 +25,71 @@ from azurelinuxagent.common.future import ustr
import azurelinuxagent.common.conf as conf
from azurelinuxagent.common.event import add_event, WALAEventOperation
from azurelinuxagent.common.exception import ProvisionError, ProtocolError, \
- OSUtilError
+ OSUtilError
from azurelinuxagent.common.protocol.restapi import ProvisionStatus
import azurelinuxagent.common.utils.shellutil as shellutil
import azurelinuxagent.common.utils.fileutil as fileutil
from azurelinuxagent.common.osutil import get_osutil
from azurelinuxagent.common.protocol import get_protocol_util
-CUSTOM_DATA_FILE="CustomData"
+CUSTOM_DATA_FILE = "CustomData"
-class ProvisionHandler(object):
+class ProvisionHandler(object):
def __init__(self):
self.osutil = get_osutil()
self.protocol_util = get_protocol_util()
def run(self):
- #If provision is not enabled, return
- if not conf.get_provision_enabled():
- logger.info("Provisioning is disabled. Skip.")
- return
-
+ # if provisioning is already done, return
provisioned = os.path.join(conf.get_lib_dir(), "provisioned")
if os.path.isfile(provisioned):
+ logger.info("Provisioning already completed, skipping.")
return
- logger.info("Run provision handler.")
- logger.info("Copy ovf-env.xml.")
- try:
- ovfenv = self.protocol_util.copy_ovf_env()
- except ProtocolError as e:
- self.report_event("Failed to copy ovf-env.xml: {0}".format(e))
- return
-
- self.protocol_util.get_protocol_by_file()
-
- self.report_not_ready("Provisioning", "Starting")
-
- try:
- logger.info("Start provisioning")
- self.provision(ovfenv)
- fileutil.write_file(provisioned, "")
- thumbprint = self.reg_ssh_host_key()
- logger.info("Finished provisioning")
- except ProvisionError as e:
- logger.error("Provision failed: {0}", e)
- self.report_not_ready("ProvisioningFailed", ustr(e))
- self.report_event(ustr(e))
- return
-
+ thumbprint = None
+ # If provision is not enabled, report ready and then return
+ if not conf.get_provision_enabled():
+ logger.info("Provisioning is disabled, skipping.")
+ else:
+ logger.info("Running provisioning handler")
+ try:
+ logger.info("Copying ovf-env.xml")
+ ovf_env = self.protocol_util.copy_ovf_env()
+ self.protocol_util.get_protocol_by_file()
+ self.report_not_ready("Provisioning", "Starting")
+ logger.info("Starting provisioning")
+ self.provision(ovf_env)
+ thumbprint = self.reg_ssh_host_key()
+ self.osutil.restart_ssh_service()
+ self.report_event("Provision succeed", is_success=True)
+ except ProtocolError as e:
+ logger.error("[ProtocolError] Provisioning failed: {0}", e)
+ self.report_not_ready("ProvisioningFailed", ustr(e))
+ self.report_event("Failed to copy ovf-env.xml: {0}".format(e))
+ return
+ except ProvisionError as e:
+ logger.error("[ProvisionError] Provisioning failed: {0}", e)
+ self.report_not_ready("ProvisioningFailed", ustr(e))
+ self.report_event(ustr(e))
+ return
+ # write out provisioned file and report Ready
+ fileutil.write_file(provisioned, "")
self.report_ready(thumbprint)
- self.report_event("Provision succeed", is_success=True)
-
+ logger.info("Provisioning complete")
+
def reg_ssh_host_key(self):
keypair_type = conf.get_ssh_host_keypair_type()
if conf.get_regenerate_ssh_host_key():
- shellutil.run("rm -f /etc/ssh/ssh_host_*key*")
- shellutil.run(("ssh-keygen -N '' -t {0} -f /etc/ssh/ssh_host_{1}_key"
- "").format(keypair_type, keypair_type))
+ fileutil.rm_files("/etc/ssh/ssh_host_*key*")
+ keygen_cmd = "ssh-keygen -N '' -t {0} -f /etc/ssh/ssh_host_{1}_key"
+ shellutil.run(keygen_cmd.format(keypair_type, keypair_type))
thumbprint = self.get_ssh_host_key_thumbprint(keypair_type)
return thumbprint
def get_ssh_host_key_thumbprint(self, keypair_type):
- cmd = "ssh-keygen -lf /etc/ssh/ssh_host_{0}_key.pub".format(keypair_type)
+ cmd = "ssh-keygen -lf /etc/ssh/ssh_host_{0}_key.pub".format(
+ keypair_type)
ret = shellutil.run_get_output(cmd)
if ret[0] == 0:
return ret[1].rstrip().split()[1].replace(':', '')
@@ -107,13 +109,13 @@ class ProvisionHandler(object):
self.config_user_account(ovfenv)
self.save_customdata(ovfenv)
-
+
if conf.get_delete_root_password():
self.osutil.del_root_password()
except OSUtilError as e:
raise ProvisionError("Failed to handle ovf-env.xml: {0}".format(e))
-
+
def config_user_account(self, ovfenv):
logger.info("Create user account if not exists")
self.osutil.useradd(ovfenv.username)
@@ -123,27 +125,18 @@ class ProvisionHandler(object):
crypt_id = conf.get_password_cryptid()
salt_len = conf.get_password_crypt_salt_len()
self.osutil.chpasswd(ovfenv.username, ovfenv.user_password,
- crypt_id=crypt_id, salt_len=salt_len)
-
+ crypt_id=crypt_id, salt_len=salt_len)
+
logger.info("Configure sudoer")
- self.osutil.conf_sudoer(ovfenv.username, nopasswd=ovfenv.user_password is None)
+ self.osutil.conf_sudoer(ovfenv.username,
+ nopasswd=ovfenv.user_password is None)
logger.info("Configure sshd")
self.osutil.conf_sshd(ovfenv.disable_ssh_password_auth)
- #Disable selinux temporary
- sel = self.osutil.is_selinux_enforcing()
- if sel:
- self.osutil.set_selinux_enforce(0)
-
self.deploy_ssh_pubkeys(ovfenv)
self.deploy_ssh_keypairs(ovfenv)
- if sel:
- self.osutil.set_selinux_enforce(1)
-
- self.osutil.restart_ssh_service()
-
def save_customdata(self, ovfenv):
customdata = ovfenv.customdata
if customdata is None:
@@ -152,11 +145,11 @@ class ProvisionHandler(object):
logger.info("Save custom data")
lib_dir = conf.get_lib_dir()
if conf.get_decode_customdata():
- customdata= self.osutil.decode_customdata(customdata)
+ customdata = self.osutil.decode_customdata(customdata)
customdata_file = os.path.join(lib_dir, CUSTOM_DATA_FILE)
fileutil.write_file(customdata_file, customdata)
-
+
if conf.get_execute_customdata():
logger.info("Execute custom data")
os.chmod(customdata_file, 0o700)
@@ -183,6 +176,7 @@ class ProvisionHandler(object):
protocol = self.protocol_util.get_protocol()
protocol.report_provision_status(status)
except ProtocolError as e:
+ logger.error("Reporting NotReady failed: {0}", e)
self.report_event(ustr(e))
def report_ready(self, thumbprint=None):
@@ -192,5 +186,5 @@ class ProvisionHandler(object):
protocol = self.protocol_util.get_protocol()
protocol.report_provision_status(status)
except ProtocolError as e:
+ logger.error("Reporting Ready failed: {0}", e)
self.report_event(ustr(e))
-