Source code for insights.parsers.zdump_v

"""
ZdumpV - command ``/usr/sbin/zdump -v /etc/localtime -c 2019,2039``
===================================================================

The ``/usr/sbin/zdump -v /etc/localtime -c 2019,2039`` command provides information about
'Daylight Saving Time' in file /etc/localtime from 2019 to 2039.

Sample content from command ``zdump -v /etc/localtime -c 2019,2039`` is::

    /etc/localtime  Sun Mar 10 06:59:59 2019 UTC = Sun Mar 10 01:59:59 2019 EST isdst=0 gmtoff=-18000
    /etc/localtime  Sun Mar 10 07:00:00 2019 UTC = Sun Mar 10 03:00:00 2019 EDT isdst=1 gmtoff=-14400
    /etc/localtime  Sun Nov  7 05:59:59 2038 UTC = Sun Nov  7 01:59:59 2038 EDT isdst=1 gmtoff=-14400
    /etc/localtime  Sun Nov  7 06:00:00 2038 UTC = Sun Nov  7 01:00:00 2038 EST isdst=0 gmtoff=-18000

Examples:
    >>> dst = zdump[0]
    >>> dst.get('utc_time')
    datetime.datetime(2019, 3, 10, 6, 59, 59)
    >>> dst.get('utc_time_raw')
    'Sun Mar 10 06:59:59 2019 UTC'
    >>> dst.get('local_time')
    datetime.datetime(2019, 3, 10, 1, 59, 59)
    >>> dst.get('local_time_raw')
    'Sun Mar 10 01:59:59 2019 EST'
    >>> dst.get('isdst')
    0
    >>> dst.get('gmtoff')
    -18000
"""
from datetime import datetime

from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs


[docs] def str2datetime(timestamp, tz=False): """ This function translates the time stamp into a datetime object. Args: timestamp (str): the time stamp from command `zdump -v` tz (bool): True if it's UTC TimeZone. Returns: time (datetime): the datetime object about the time stamp time_string (str): the formatted time stamp """ time, time_string = None, timestamp.strip() # Fixed the problem that the program running this python code doesn't # has the corresponding TimeZone where strptime will raise ValueError. # So, we skip the `TimeZone` time_s = time_string.rsplit(None, 1)[0] time_f = "%a %b %d %H:%M:%S %Y" if tz: # In some version, `zdump` prints 'UT' instead of 'UTC' # 'UC' is an invalid TimeZone for function `strptime` time_s = time_s + " UTC" time_f = "%a %b %d %H:%M:%S %Y %Z" try: time = datetime.strptime(time_s, time_f) except ValueError: pass return time, time_string
[docs] @parser(Specs.zdump_v) class ZdumpV(CommandParser, list): """ Parse the output from the ``/usr/sbin/zdump -v /etc/localtime -c 2019,2039`` command and store the 'Daylight Saving Time' information into a list. Raises: SkipComponent: When nothing is parsed. .. warning:: The value in key `local_time` doesn't include the TimeZone information """
[docs] def parse_content(self, content): if not content: raise SkipComponent("No Data from command: /usr/sbin/zdump -v /etc/localtime -c 2019,2039") for line in content: dst = {} if 'isdst' not in line: # skip the line that does not include a time stamp continue utc_time, remains = line.strip('/etc/localtime').split(' = ') dst['utc_time'], dst['utc_time_raw'] = str2datetime(utc_time, True) if dst['utc_time'] is None: continue local_time, _ = remains.split("isdst") dst['local_time'], dst['local_time_raw'] = str2datetime(local_time) if dst['local_time'] is None: continue isdst = [s.split('=')[1] for s in remains.split() if 'isdst' in s and '=' in s] if isdst: dst['isdst'] = int(isdst[0]) gmtoff = [s.split('=')[1] for s in remains.split() if 'gmtoff' in s and '=' in s] if gmtoff: dst['gmtoff'] = int(gmtoff[0]) self.append(dst)