Source code for owtf.utils.timer

"""
owtf.utils.timer
~~~~~~~~~~~~~~~~

The time module allows the rest of the framework to time how long it takes for
certain actions to execute and present this information in both seconds and
human-readable form.
"""
import datetime
import math

from owtf.settings import DATE_TIME_FORMAT

__all__ = ["Timer", "timer"]


[docs]class Timer(object): # Dictionary of timers, Several timers can be set at any given point in time. timers = {} def __init__(self, datetime_format="%d/%m/%Y-%H:%M"): self.date_time_format = datetime_format
[docs] def start_timer(self, offset="0"): """ Adds a start time to the timer :param offset: Timer index :type offset: `str` :return: The start time for the timer :rtype: `datetime` """ self.timers[offset] = {} self.timers[offset]["start"] = self.get_current_date_time() return self.timers[offset]["start"]
[docs] def get_current_date_time_as_str(self): """Returns a datetime object as a string in a particular format :return: Datetime object in string form :rtype: `str` """ return self.get_current_date_time().strftime(self.date_time_format)
[docs] @staticmethod def get_current_date_time(): """ Current timestamp :return: The current time as a timestamp :rtype: `datetime` """ return datetime.datetime.now()
[docs] def get_elapsed_time(self, offset="0"): """Gets the time elapsed between now and start of the timer in Unix epoch :param offset: Timer index :type offset: `str` :return: Time difference :rtype: `datetime` """ return datetime.datetime.now() - self.timers[offset]["start"]
[docs] def get_time_as_str(self, timedelta): """Get the time difference as a human readable string :param timedelta: Time difference :type timedelta: `datetime.timedelta` :return: Human readable form for the timedelta :rtype: `str` """ microseconds, seconds = math.modf(timedelta.total_seconds()) seconds = int(seconds) milliseconds = int(microseconds * 1000) hours = seconds / 3600 seconds -= 3600 * hours minutes = seconds / 60 seconds -= 60 * minutes timer_str = "" if hours > 0: timer_str += "%2dh, " % hours if minutes > 0: timer_str += "%2dm, " % minutes timer_str += "%2ds, %3dms" % (seconds, milliseconds) # Strip necessary to get rid of leading spaces sometimes. return timer_str.strip()
[docs] def get_time_human(self, seconds_str): """Generates the human readable string for the timestamp :param seconds_str: Unix style timestamp :type seconds_str: `str` :return: Timestamp in a human readable string :rtype: `str` """ seconds, milliseconds = str(seconds_str).split(".") seconds = int(seconds) milliseconds = int(milliseconds[0:3]) hours = seconds / 3600 seconds -= 3600 * hours minutes = seconds / 60 seconds -= 60 * minutes timer_str = "" if hours > 0: timer_str += "%2dh, " % hours if minutes > 0: timer_str += "%2dm, " % minutes timer_str += "%2ds, %3dms" % (seconds, milliseconds) # Strip necessary to get rid of leading spaces sometimes. return timer_str.strip()
[docs] def end_timer(self, offset="0"): """Sets the end of the timer :param offset: Timer index :type offset: `str` :return: :rtype: None """ self.timers[offset]["end"] = self.get_current_date_time()
[docs] def get_elapsed_time_as_str(self, offset="0"): """Returns the time elapsed a nice readable string :param offset: Timer index :type offset: `str` :return: Time elapsed as a string :rtype: `str` """ elapsed = self.get_elapsed_time(offset) self.end_timer(offset) return self.get_time_as_str(elapsed)
[docs] def get_start_date_time(self, offset="0"): """Get the start time for the timer :param offset: Timer index :type offset: `str` :return: Start time for the timer as a timestamp :rtype: `datetime` """ return self.timers[offset]["start"]
[docs] def get_end_date_time(self, offset="0"): """Get the end time for the timer :param offset: Timer index :type offset: `str` :return: End time for the timer as a timestamp :rtype: `datetime` """ if "end" not in self.timers[offset].keys(): self.end_timer(offset) return self.timers[offset]["end"]
[docs] def get_start_date_time_as_str(self, offset="0"): """Get the start time for the timer as a string :param offset: Timer index :type offset: `str` :return: Start time for the timer as a string :rtype: `str` """ return self.get_start_date_time(offset).strftime(self.date_time_format)
[docs] def get_end_date_time_as_str(self, offset="0"): """Get the end time for the timer as a string :param offset: Timer index :type offset: `str` :return: End time for the timer as a string :rtype: `str` """ return self.get_end_date_time(offset).strftime(self.date_time_format)
timer = Timer(datetime_format=DATE_TIME_FORMAT)