Beispiel #1
0
    def run(self):
        #If provision is enabled, run default provision handler
        if conf.get_provision_enabled():
            super(UbuntuProvisionHandler, self).run()
            return

        logger.info("run Ubuntu provision handler")
        provisioned = os.path.join(conf.get_lib_dir(), "provisioned")
        if os.path.isfile(provisioned):
            return

        logger.info("Waiting cloud-init to copy ovf-env.xml.")
        self.wait_for_ovfenv()

        protocol = self.distro.protocol_util.detect_protocol()
        self.report_not_ready("Provisioning", "Starting")
        logger.info("Sleep 15 seconds to prevent throttling")
        time.sleep(15) #Sleep to prevent throttling
        try:
            logger.info("Wait for ssh host key to be generated.")
            thumbprint = self.wait_for_ssh_host_key()
            fileutil.write_file(provisioned, "")
            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
            
        self.report_ready(thumbprint)
        self.report_event("Provision succeed", is_success=True)
    def copy_ovf_env(self):
        """
        Copy ovf env file from dvd to hard disk.
        Remove password before save it to the disk
        """
        dvd_mount_point = conf.get_dvd_mount_point()
        ovf_file_path_on_dvd = os.path.join(dvd_mount_point, OVF_FILE_NAME)
        tag_file_path_on_dvd = os.path.join(dvd_mount_point, TAG_FILE_NAME)
        try:
            self.distro.osutil.mount_dvd()
            ovfxml = fileutil.read_file(ovf_file_path_on_dvd, remove_bom=True)
            ovfenv = OvfEnv(ovfxml)
            ovfxml = re.sub("<UserPassword>.*?<", "<UserPassword>*<", ovfxml)
            ovf_file_path = os.path.join(conf.get_lib_dir(), OVF_FILE_NAME)
            fileutil.write_file(ovf_file_path, ovfxml)
            
            if os.path.isfile(tag_file_path_on_dvd):
                logger.info("Found {0} in provisioning ISO", TAG_FILE_NAME)
                tag_file_path = os.path.join(conf.get_lib_dir(), TAG_FILE_NAME)
                shutil.copyfile(tag_file_path_on_dvd, tag_file_path) 

        except (OSUtilError, IOError) as e:
            raise ProtocolError(ustr(e))

        try:
            self.distro.osutil.umount_dvd()
            self.distro.osutil.eject_dvd()
        except OSUtilError as e:
            logger.warn(ustr(e))

        return ovfenv
    def copy_ovf_env(self):
        """
        Copy ovf env file from dvd to hard disk.
        Remove password before save it to the disk
        """
        dvd_mount_point = conf.get_dvd_mount_point()
        ovf_file_path_on_dvd = os.path.join(dvd_mount_point, OVF_FILE_NAME)
        tag_file_path_on_dvd = os.path.join(dvd_mount_point, TAG_FILE_NAME)
        try:
            self.distro.osutil.mount_dvd()
            ovfxml = fileutil.read_file(ovf_file_path_on_dvd, remove_bom=True)
            ovfenv = OvfEnv(ovfxml)
            ovfxml = re.sub("<UserPassword>.*?<", "<UserPassword>*<", ovfxml)
            ovf_file_path = os.path.join(conf.get_lib_dir(), OVF_FILE_NAME)
            fileutil.write_file(ovf_file_path, ovfxml)

            if os.path.isfile(tag_file_path_on_dvd):
                logger.info("Found {0} in provisioning ISO", TAG_FILE_NAME)
                tag_file_path = os.path.join(conf.get_lib_dir(), TAG_FILE_NAME)
                shutil.copyfile(tag_file_path_on_dvd, tag_file_path)

        except (OSUtilError, IOError) as e:
            raise ProtocolError(ustr(e))

        try:
            self.distro.osutil.umount_dvd()
            self.distro.osutil.eject_dvd()
        except OSUtilError as e:
            logger.warn(ustr(e))

        return ovfenv
Beispiel #4
0
def _build_health_report(incarnation, container_id, role_instance_id,
                         status, substatus, description):
    #Escape '&', '<' and '>'
    description = saxutils.escape(ustr(description))
    detail = u''
    if substatus is not None:
        substatus = saxutils.escape(ustr(substatus))
        detail = (u"<Details>"
                  u"<SubStatus>{0}</SubStatus>"
                  u"<Description>{1}</Description>"
                  u"</Details>").format(substatus, description)
    xml = (u"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
           u"<Health "
           u"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
           u" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"
           u"<GoalStateIncarnation>{0}</GoalStateIncarnation>"
           u"<Container>"
           u"<ContainerId>{1}</ContainerId>"
           u"<RoleInstanceList>"
           u"<Role>"
           u"<InstanceId>{2}</InstanceId>"
           u"<Health>"
           u"<State>{3}</State>"
           u"{4}"
           u"</Health>"
           u"</Role>"
           u"</RoleInstanceList>"
           u"</Container>"
           u"</Health>"
           u"").format(incarnation,
                       container_id,
                       role_instance_id,
                       status,
                       detail)
    return xml
Beispiel #5
0
    def put_page_blob(self, url, data):
        logger.verb("Replace old page blob")

        #Convert string into bytes
        data=bytearray(data, encoding='utf-8')
        timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())

        #Align to 512 bytes
        page_blob_size = int((len(data) + 511) / 512) * 512
        try:
            resp = self.client.call_storage_service(restutil.http_put, url, 
                                                    "", {
                "x-ms-date" :  timestamp,
                "x-ms-blob-type" : "PageBlob",
                "Content-Length": "0",
                "x-ms-blob-content-length" : ustr(page_blob_size),
                "x-ms-version" : self.__class__.__storage_version__
            })
        except HttpError as e:
            raise ProtocolError((u"Failed to clean up page blob: {0}"
                                 u"").format(e))
        if resp.status != httpclient.CREATED:
            raise ProtocolError(("Failed to clean up page blob: {0}"
                                 "").format(resp.status))

        if url.count("?") < 0:
            url = "{0}?comp=page".format(url)
        else:
            url = "{0}&comp=page".format(url)

        logger.verb("Upload page blob")
        page_max = 4 * 1024 * 1024 #Max page size: 4MB
        start = 0
        end = 0
        while end < len(data):
            end = min(len(data), start + page_max)
            content_size = end - start
            #Align to 512 bytes
            page_end = int((end + 511) / 512) * 512
            buf_size = page_end - start
            buf = bytearray(buf_size)
            buf[0: content_size] = data[start: end]
            try:
                resp = self.client.call_storage_service(restutil.http_put, url, 
                                                        bytebuffer(buf), {
                    "x-ms-date" :  timestamp,
                    "x-ms-range" : "bytes={0}-{1}".format(start, page_end - 1),
                    "x-ms-page-write" : "update",
                    "x-ms-version" : self.__class__.__storage_version__,
                    "Content-Length": ustr(page_end - start)
                })
            except HttpError as e:
                raise ProtocolError((u"Failed to upload page blob: {0}"
                                     u"").format(e))
            if resp is None or resp.status != httpclient.CREATED:
                raise ProtocolError(("Failed to upload page blob: {0}"
                                     "").format(resp.status))
            start = end
Beispiel #6
0
    def _get_data(self, url, headers=None):
        try:
            resp = restutil.http_get(url, headers=headers)
        except HttpError as e:
            raise ProtocolError(ustr(e))

        if resp.status != httpclient.OK:
            raise ProtocolError("{0} - GET: {1}".format(resp.status, url))

        data = resp.read()
        etag = resp.getheader('ETag')
        if data is None:
            return None
        data = json.loads(ustr(data, encoding="utf-8"))
        return data, etag
Beispiel #7
0
 def device_for_ide_port(self, port_id):
     """
     Return device name attached to ide port 'n'.
     """
     if port_id > 3:
         return None
     g0 = "00000000"
     if port_id > 1:
         g0 = "00000001"
         port_id = port_id - 2
     device = None
     path = "/sys/bus/vmbus/devices/"
     for vmbus in os.listdir(path):
         deviceid = fileutil.read_file(
             os.path.join(path, vmbus, "device_id"))
         guid = deviceid.lstrip('{').split('-')
         if guid[0] == g0 and guid[1] == "000" + ustr(port_id):
             for root, dirs, files in os.walk(path + vmbus):
                 if root.endswith("/block"):
                     device = dirs[0]
                     break
                 else:  #older distros
                     for d in dirs:
                         if ':' in d and "block" == d.split(':')[0]:
                             device = d.split(':')[1]
                             break
             break
     return device
Beispiel #8
0
 def device_for_ide_port(self, port_id):
     """
     Return device name attached to ide port 'n'.
     """
     if port_id > 3:
         return None
     g0 = "00000000"
     if port_id > 1:
         g0 = "00000001"
         port_id = port_id - 2
     device = None
     path = "/sys/bus/vmbus/devices/"
     for vmbus in os.listdir(path):
         deviceid = fileutil.read_file(os.path.join(path, vmbus, "device_id"))
         guid = deviceid.lstrip('{').split('-')
         if guid[0] == g0 and guid[1] == "000" + ustr(port_id):
             for root, dirs, files in os.walk(path + vmbus):
                 if root.endswith("/block"):
                     device = dirs[0]
                     break
                 else : #older distros
                     for d in dirs:
                         if ':' in d and "block" == d.split(':')[0]:
                             device = d.split(':')[1]
                             break
             break
     return device
Beispiel #9
0
def event_param_to_v1(param):
    param_format = '<Param Name="{0}" Value={1} T="{2}" />'
    param_type = type(param.value)
    attr_type = ""
    if param_type is int:
        attr_type = 'mt:uint64'
    elif param_type is str:
        attr_type = 'mt:wstr'
    elif ustr(param_type).count("'unicode'") > 0:
        attr_type = 'mt:wstr'
    elif param_type is bool:
        attr_type = 'mt:bool'
    elif param_type is float:
        attr_type = 'mt:float64'
    return param_format.format(param.name, saxutils.quoteattr(ustr(param.value)),
                               attr_type)
Beispiel #10
0
 def asn1_to_ssh(self, pubkey):
     lines = pubkey.split("\n")
     lines = [x for x in lines if not x.startswith("----")]
     base64_encoded = "".join(lines)
     try:
         #TODO remove pyasn1 dependency
         from pyasn1.codec.der import decoder as der_decoder
         der_encoded = base64.b64decode(base64_encoded)
         der_encoded = der_decoder.decode(der_encoded)[0][1]
         key = der_decoder.decode(self.bits_to_bytes(der_encoded))[0]
         n=key[0]
         e=key[1]
         keydata = bytearray()
         keydata.extend(struct.pack('>I', len("ssh-rsa")))
         keydata.extend(b"ssh-rsa")
         keydata.extend(struct.pack('>I', len(self.num_to_bytes(e))))
         keydata.extend(self.num_to_bytes(e))
         keydata.extend(struct.pack('>I', len(self.num_to_bytes(n)) + 1))
         keydata.extend(b"\0")
         keydata.extend(self.num_to_bytes(n))
         keydata_base64 = base64.b64encode(bytebuffer(keydata))
         return ustr(b"ssh-rsa " +  keydata_base64 + b"\n", 
                     encoding='utf-8')
     except ImportError as e:
         raise CryptError("Failed to load pyasn1.codec.der")
Beispiel #11
0
 def _post_data(self, url, data, headers=None):
     headers = _add_content_type(headers) 
     try:
         resp = restutil.http_post(url, json.dumps(data), headers=headers)
     except HttpError as e:
         raise ProtocolError(ustr(e))
     if resp.status != httpclient.CREATED:
         raise ProtocolError("{0} - POST: {1}".format(resp.status, url))
    def test_read_write_file(self):
        test_file=os.path.join(self.tmp_dir, 'test_file')
        content = ustr(uuid.uuid4())
        fileutil.write_file(test_file, content)

        content_read = fileutil.read_file(test_file)
        self.assertEquals(content, content_read)
        os.remove(test_file)
Beispiel #13
0
 def openssl_to_openssh(self, input_file, output_file):
     pubkey = fileutil.read_file(input_file)
     try:
         cryptutil = CryptUtil(conf.get_openssl_cmd())
         ssh_rsa_pubkey = cryptutil.asn1_to_ssh(pubkey)
     except CryptError as e:
         raise OSUtilError(ustr(e))
     fileutil.write_file(output_file, ssh_rsa_pubkey)
Beispiel #14
0
 def handle_ext_handler(self, ext_handler):
     ext_handler_i = ExtHandlerInstance(ext_handler, self.protocol)
     try:
         state = ext_handler.properties.state
         ext_handler_i.logger.info("Expected handler state: {0}", state)
         if state == "enabled":
             self.handle_enable(ext_handler_i)
         elif state == u"disabled":
             self.handle_disable(ext_handler_i)
         elif state == u"uninstall":
             self.handle_uninstall(ext_handler_i)
         else:
             message = u"Unknown ext handler state:{0}".format(state)
             raise ExtensionError(message)
     except ExtensionError as e:
         ext_handler_i.set_handler_status(message=ustr(e), code=-1)
         ext_handler_i.report_event(message=ustr(e), is_success=False)
Beispiel #15
0
 def openssl_to_openssh(self, input_file, output_file):
     pubkey = fileutil.read_file(input_file)
     try:
         cryptutil = CryptUtil(conf.get_openssl_cmd())
         ssh_rsa_pubkey = cryptutil.asn1_to_ssh(pubkey)
     except CryptError as e:
         raise OSUtilError(ustr(e))
     fileutil.write_file(output_file, ssh_rsa_pubkey)
Beispiel #16
0
 def report_ready(self, thumbprint=None):
     status = ProvisionStatus(status="Ready")
     status.properties.certificateThumbprint = thumbprint
     try:
         protocol = self.distro.protocol_util.get_protocol()
         protocol.report_provision_status(status)
     except ProtocolError as e:
         self.report_event(ustr(e))
Beispiel #17
0
 def handle_ext_handler(self, ext_handler):
     ext_handler_i = ExtHandlerInstance(ext_handler, self.protocol)
     try:
         state = ext_handler.properties.state
         ext_handler_i.logger.info("Expected handler state: {0}", state)
         if state == "enabled":
             self.handle_enable(ext_handler_i)
         elif state == u"disabled":
             self.handle_disable(ext_handler_i)
         elif state == u"uninstall":
             self.handle_uninstall(ext_handler_i)
         else:
             message = u"Unknown ext handler state:{0}".format(state)
             raise ExtensionError(message)
     except ExtensionError as e:
         ext_handler_i.set_handler_status(message=ustr(e), code=-1)
         ext_handler_i.report_event(message=ustr(e), is_success=False)
Beispiel #18
0
 def report_not_ready(self, sub_status, description):
     status = ProvisionStatus(status="NotReady", subStatus=sub_status,
                              description=description)
     try:
         protocol = self.distro.protocol_util.get_protocol()
         protocol.report_provision_status(status)
     except ProtocolError as e:
         self.report_event(ustr(e))
Beispiel #19
0
 def uninstall(self):
     self.logger.info("Uninstall extension.")
     self.set_operation(WALAEventOperation.UnInstall)
     
     try:
         man = self.load_manifest()
         self.launch_command(man.get_uninstall_command())
     except ExtensionError as e:
         self.report_event(message=ustr(e), is_success=False)
Beispiel #20
0
    def uninstall(self):
        self.logger.info("Uninstall extension.")
        self.set_operation(WALAEventOperation.UnInstall)

        try:
            man = self.load_manifest()
            self.launch_command(man.get_uninstall_command())
        except ExtensionError as e:
            self.report_event(message=ustr(e), is_success=False)
Beispiel #21
0
 def test_remove_bom(self):
     #Test bom could be removed
     data = ustr(b'\xef\xbb\xbfhehe', encoding='utf-8')
     data = textutil.remove_bom(data)
     self.assertNotEquals(0xbb, data[0])
     
     #Test string without BOM is not affected
     data = u"hehe"
     data = textutil.remove_bom(data)
     self.assertEquals(u"h", data[0])
Beispiel #22
0
    def fetch_config(self, uri, headers):
        try:
            resp = self.call_wireserver(restutil.http_get, uri, 
                                        headers=headers)
        except HttpError as e:
            raise ProtocolError(ustr(e))

        if(resp.status != httpclient.OK):
            raise ProtocolError("{0} - {1}".format(resp.status, uri))

        return self.decode_config(resp.read())
Beispiel #23
0
def run_get_output(cmd, chk_err=True, log_cmd=True):
    """
    Wrapper for subprocess.check_output.
    Execute 'cmd'.  Returns return code and STDOUT, trapping expected exceptions.
    Reports exceptions to Error if chk_err parameter is True
    """
    if log_cmd:
        logger.verb(u"run cmd '{0}'", cmd)
    try:
        output=subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True)
        output = ustr(output, encoding='utf-8', errors="backslashreplace")
    except subprocess.CalledProcessError as e :
        output = ustr(e.output, encoding='utf-8', errors="backslashreplace")
        if chk_err:
            if log_cmd:
                logger.error(u"run cmd '{0}' failed", e.cmd)
            logger.error(u"Error Code:{0}", e.returncode)
            logger.error(u"Result:{0}", output)
        return e.returncode, output 
    return 0, output
Beispiel #24
0
    def log(self, level, msg_format, *args):
        #if msg_format is not unicode convert it to unicode
        if type(msg_format) is not ustr:
            msg_format = ustr(msg_format, errors="backslashreplace")
        if len(args) > 0:
            msg = msg_format.format(*args)
        else:
            msg = msg_format
        time = datetime.now().strftime(u'%Y/%m/%d %H:%M:%S.%f')
        level_str = LogLevel.STRINGS[level]
        if self.prefix is not None:
            log_item = u"{0} {1} {2} {3}\n".format(time, level_str, self.prefix,
                                                   msg)
        else:
            log_item = u"{0} {1} {2}\n".format(time, level_str, msg)

        log_item = ustr(log_item.encode('ascii', "backslashreplace"), 
                        encoding="ascii")
        for appender in self.appenders:
            appender.write(level, log_item)
Beispiel #25
0
    def check_pid(self):
        """Check whether daemon is already running"""
        pid = None
        pid_file = conf.get_agent_pid_file_path()
        if os.path.isfile(pid_file):
            pid = fileutil.read_file(pid_file)

        if pid is not None and os.path.isdir(os.path.join("/proc", pid)):
            logger.info("Daemon is already running: {0}", pid)
            sys.exit(0)
            
        fileutil.write_file(pid_file, ustr(os.getpid()))
Beispiel #26
0
def parse_xml_event(data_str):
    try:
        xml_doc = parse_doc(data_str)
        event_id = getattrib(find(xml_doc, "Event"), 'id')
        provider_id = getattrib(find(xml_doc, "Provider"), 'id')
        event = TelemetryEvent(event_id, provider_id) 
        param_nodes = findall(xml_doc, 'Param')
        for param_node in param_nodes:
            event.parameters.append(parse_xml_param(param_node))
        return event
    except Exception as e:
        raise ValueError(ustr(e))
Beispiel #27
0
def parse_xml_event(data_str):
    try:
        xml_doc = parse_doc(data_str)
        event_id = getattrib(find(xml_doc, "Event"), 'id')
        provider_id = getattrib(find(xml_doc, "Provider"), 'id')
        event = TelemetryEvent(event_id, provider_id)
        param_nodes = findall(xml_doc, 'Param')
        for param_node in param_nodes:
            event.parameters.append(parse_xml_param(param_node))
        return event
    except Exception as e:
        raise ValueError(ustr(e))
def run_get_output(cmd, chk_err=True, log_cmd=True):
    """
    Wrapper for subprocess.check_output.
    Execute 'cmd'.  Returns return code and STDOUT, trapping expected exceptions.
    Reports exceptions to Error if chk_err parameter is True
    """
    if log_cmd:
        logger.verb(u"run cmd '{0}'", cmd)
    try:
        output = subprocess.check_output(cmd,
                                         stderr=subprocess.STDOUT,
                                         shell=True)
        output = ustr(output, encoding='utf-8', errors="backslashreplace")
    except subprocess.CalledProcessError as e:
        output = ustr(e.output, encoding='utf-8', errors="backslashreplace")
        if chk_err:
            if log_cmd:
                logger.error(u"run cmd '{0}' failed", e.cmd)
            logger.error(u"Error Code:{0}", e.returncode)
            logger.error(u"Result:{0}", output)
        return e.returncode, output
    return 0, output
Beispiel #29
0
    def report_ext_handler_status(self, vm_status, ext_handler):
        ext_handler_i = ExtHandlerInstance(ext_handler, self.protocol)
        
        handler_status = ext_handler_i.get_handler_status() 
        if handler_status is None:
            return

        handler_state = ext_handler_i.get_handler_state()
        if handler_state != ExtHandlerState.NotInstalled:
            try:
                active_exts = ext_handler_i.report_ext_status()
                handler_status.extensions.extend(active_exts)
            except ExtensionError as e:
                ext_handler_i.set_handler_status(message=ustr(e), code=-1)

            try:
                heartbeat = ext_handler_i.collect_heartbeat()
                if heartbeat is not None:
                    handler_status.status = heartbeat.get('status')
            except ExtensionError as e:
                ext_handler_i.set_handler_status(message=ustr(e), code=-1)

        vm_status.vmAgent.extensionHandlers.append(handler_status)
Beispiel #30
0
    def report_ext_handler_status(self, vm_status, ext_handler):
        ext_handler_i = ExtHandlerInstance(ext_handler, self.protocol)

        handler_status = ext_handler_i.get_handler_status()
        if handler_status is None:
            return

        handler_state = ext_handler_i.get_handler_state()
        if handler_state != ExtHandlerState.NotInstalled:
            try:
                active_exts = ext_handler_i.report_ext_status()
                handler_status.extensions.extend(active_exts)
            except ExtensionError as e:
                ext_handler_i.set_handler_status(message=ustr(e), code=-1)

            try:
                heartbeat = ext_handler_i.collect_heartbeat()
                if heartbeat is not None:
                    handler_status.status = heartbeat.get('status')
            except ExtensionError as e:
                ext_handler_i.set_handler_status(message=ustr(e), code=-1)

        vm_status.vmAgent.extensionHandlers.append(handler_status)
Beispiel #31
0
    def run(self):
        #If provision is not enabled, return
        if not conf.get_provision_enabled():
            logger.info("Provisioning is disabled. Skip.")
            return 

        provisioned = os.path.join(conf.get_lib_dir(), "provisioned")
        if os.path.isfile(provisioned):
            return

        logger.info("Run provision handler.")
        logger.info("Copy ovf-env.xml.")
        try:
            ovfenv = self.distro.protocol_util.copy_ovf_env()
        except ProtocolError as e:
            self.report_event("Failed to copy ovf-env.xml: {0}".format(e))
            return
    
        self.distro.protocol_util.detect_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

        self.report_ready(thumbprint)
        self.report_event("Provision succeed", is_success=True)
Beispiel #32
0
 def activate_resource_disk(self):
     logger.info("Activate resource disk")
     try:
         mount_point = conf.get_resourcedisk_mountpoint()
         fs = conf.get_resourcedisk_filesystem()
         mount_point = self.mount_resource_disk(mount_point, fs)
         warning_file = os.path.join(mount_point, DATALOSS_WARNING_FILE_NAME)
         try:
             fileutil.write_file(warning_file, DATA_LOSS_WARNING)
         except IOError as e:
             logger.warn("Failed to write data loss warnning:{0}", e)
         return mount_point
     except ResourceDiskError as e:
         logger.error("Failed to mount resource disk {0}", e)
         add_event(name="WALA", is_success=False, message=ustr(e),
                           op=WALAEventOperation.ActivateResourceDisk)
Beispiel #33
0
    def run(self):
        logger.info("{0} Version:{1}", AGENT_LONG_NAME, AGENT_VERSION)
        logger.info("OS: {0} {1}", DISTRO_NAME, DISTRO_VERSION)
        logger.info("Python: {0}.{1}.{2}", PY_VERSION_MAJOR, PY_VERSION_MINOR,
                    PY_VERSION_MICRO)

        self.check_pid()

        while self.running:
            try:
                self.daemon()
            except Exception as e:
                err_msg = traceback.format_exc()
                add_event("WALA", is_success=False, message=ustr(err_msg), 
                          op=WALAEventOperation.UnhandledError)
                logger.info("Sleep 15 seconds and restart daemon")
                time.sleep(15)
Beispiel #34
0
 def put_block_blob(self, url, data):
     logger.verb("Upload block blob")
     timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
     try:
         resp = self.client.call_storage_service(restutil.http_put, url, 
                                                 data, {
             "x-ms-date" :  timestamp,
             "x-ms-blob-type" : "BlockBlob",
             "Content-Length": ustr(len(data)),
             "x-ms-version" : self.__class__.__storage_version__
         })
     except HttpError as e:
         raise ProtocolError((u"Failed to upload block blob: {0}"
                              u"").format(e))
     if resp.status != httpclient.CREATED:
         raise ProtocolError(("Failed to upload block blob: {0}"
                              "").format(resp.status))
Beispiel #35
0
def read_file(filepath, asbin=False, remove_bom=False, encoding='utf-8'):
    """
    Read and return contents of 'filepath'.
    """
    mode = 'rb'
    with open(filepath, mode) as in_file:
        data = in_file.read()
        if data is None:
            return None

        if asbin:
            return data

        if remove_bom:
            #Remove bom on bytes data before it is converted into string.
            data = textutil.remove_bom(data)
        data = ustr(data, encoding=encoding)
        return data
Beispiel #36
0
    def save_event(self, data):
        if self.event_dir is None:
            logger.warn("Event reporter is not initialized.")
            return

        if not os.path.exists(self.event_dir):
            os.mkdir(self.event_dir)
            os.chmod(self.event_dir, 0o700)
        if len(os.listdir(self.event_dir)) > 1000:
            raise EventError("Too many files under: {0}".format(self.event_dir))

        filename = os.path.join(self.event_dir, ustr(int(time.time()*1000000)))
        try:
            with open(filename+".tmp",'wb+') as hfile:
                hfile.write(data.encode("utf-8"))
            os.rename(filename+".tmp", filename+".tld")
        except IOError as e:
            raise EventError("Failed to write events to file:{0}", e)
Beispiel #37
0
def read_file(filepath, asbin=False, remove_bom=False, encoding='utf-8'):
    """
    Read and return contents of 'filepath'.
    """
    mode = 'rb'
    with open(filepath, mode) as in_file:
        data = in_file.read()
        if data is None:
            return None

        if asbin:
            return data

        if remove_bom:
            #Remove bom on bytes data before it is converted into string.
            data = textutil.remove_bom(data)
        data = ustr(data, encoding=encoding)
        return data
Beispiel #38
0
    def run(self):
        ext_handlers, etag = None, None
        try:
            self.protocol = self.distro.protocol_util.get_protocol()
            ext_handlers, etag = self.protocol.get_ext_handlers()
        except ProtocolError as e:
            add_event(name="WALA", is_success=False, message=ustr(e))
            return

        if self.last_etag is not None and self.last_etag == etag:
            logger.verb("No change to ext handler config:{0}, skip", etag)
            self.log_report = False
        else:
            logger.info("Handle new ext handler config")
            self.log_report = True #Log status report success on new config
            self.handle_ext_handlers(ext_handlers)
            self.last_etag = etag

        self.report_ext_handlers_status(ext_handlers)
    def _detect_wire_protocol(self):
        endpoint = self.distro.dhcp_handler.endpoint
        if endpoint is None:
            logger.info("WireServer endpoint is not found. Rerun dhcp handler")
            try:
                self.distro.dhcp_handler.run()
            except DhcpError as e:
                raise ProtocolError(ustr(e))
            endpoint = self.distro.dhcp_handler.endpoint

        try:
            protocol = WireProtocol(endpoint)
            protocol.detect()
            self._set_wireserver_endpoint(endpoint)
            return protocol
        except ProtocolError as e:
            logger.info("WireServer is not responding. Reset endpoint")
            self.distro.dhcp_handler.endpoint = None
            raise e
 def activate_resource_disk(self):
     logger.info("Activate resource disk")
     try:
         mount_point = conf.get_resourcedisk_mountpoint()
         fs = conf.get_resourcedisk_filesystem()
         mount_point = self.mount_resource_disk(mount_point, fs)
         warning_file = os.path.join(mount_point,
                                     DATALOSS_WARNING_FILE_NAME)
         try:
             fileutil.write_file(warning_file, DATA_LOSS_WARNING)
         except IOError as e:
             logger.warn("Failed to write data loss warnning:{0}", e)
         return mount_point
     except ResourceDiskError as e:
         logger.error("Failed to mount resource disk {0}", e)
         add_event(name="WALA",
                   is_success=False,
                   message=ustr(e),
                   op=WALAEventOperation.ActivateResourceDisk)
Beispiel #41
0
    def fetch_manifest(self, version_uris):
        for version_uri in version_uris:
            logger.verb("Fetch ext handler manifest: {0}", version_uri.uri)
            try:
                resp = self.call_storage_service(restutil.http_get, 
                                                 version_uri.uri, None, 
                                                 chk_proxy=True)
            except HttpError as e:
                raise ProtocolError(ustr(e))

            if resp.status == httpclient.OK:
                return self.decode_config(resp.read())
            logger.warn("Failed to fetch ExtensionManifest: {0}, {1}", 
                        resp.status, version_uri.uri)
            logger.info("Will retry later, in {0} seconds", 
                        LONG_WAITING_INTERVAL)
            time.sleep(LONG_WAITING_INTERVAL)
        raise ProtocolError(("Failed to fetch ExtensionManifest from "
                             "all sources"))
Beispiel #42
0
    def run(self):
        ext_handlers, etag = None, None
        try:
            self.protocol = self.distro.protocol_util.get_protocol()
            ext_handlers, etag = self.protocol.get_ext_handlers()
        except ProtocolError as e:
            add_event(name="WALA", is_success=False, message=ustr(e))
            return

        if self.last_etag is not None and self.last_etag == etag:
            logger.verb("No change to ext handler config:{0}, skip", etag)
            self.log_report = False
        else:
            logger.info("Handle new ext handler config")
            self.log_report = True  #Log status report success on new config
            self.handle_ext_handlers(ext_handlers)
            self.last_etag = etag

        self.report_ext_handlers_status(ext_handlers)
Beispiel #43
0
def get_distro():
    if 'FreeBSD' in platform.system():
        release = re.sub('\-.*\Z', '', ustr(platform.release()))
        osinfo = ['freebsd', release, '', 'freebsd']
    if 'linux_distribution' in dir(platform):
        osinfo = list(platform.linux_distribution(full_distribution_name=0))
        full_name = platform.linux_distribution()[0].strip()
        osinfo.append(full_name)
    else:
        osinfo = platform.dist()

    #The platform.py lib has issue with detecting oracle linux distribution.
    #Merge the following patch provided by oracle as a temparory fix.
    if os.path.exists("/etc/oracle-release"):
        osinfo[2] = "oracle"
        osinfo[3] = "Oracle Linux"

    #Remove trailing whitespace and quote in distro name
    osinfo[0] = osinfo[0].strip('"').strip(' ').lower()
    return osinfo
Beispiel #44
0
    def save_event(self, data):
        if self.event_dir is None:
            logger.warn("Event reporter is not initialized.")
            return

        if not os.path.exists(self.event_dir):
            os.mkdir(self.event_dir)
            os.chmod(self.event_dir, 0o700)
        if len(os.listdir(self.event_dir)) > 1000:
            raise EventError("Too many files under: {0}".format(
                self.event_dir))

        filename = os.path.join(self.event_dir,
                                ustr(int(time.time() * 1000000)))
        try:
            with open(filename + ".tmp", 'wb+') as hfile:
                hfile.write(data.encode("utf-8"))
            os.rename(filename + ".tmp", filename + ".tld")
        except IOError as e:
            raise EventError("Failed to write events to file:{0}", e)