# Copyright 2018 VyOS maintainers and contributors <maintainers@vyos.io>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library.  If not, see <http://www.gnu.org/licenses/>.

import re
import psutil


def colon_separated_to_dict(data_string, uniquekeys=False):
    """ Converts a string containing newline-separated entries
        of colon-separated key-value pairs into a dict.

        Such files are common in Linux /proc filesystem

    Args:
        data_string (str): data string
        uniquekeys (bool): whether to insist that keys are unique or not

    Returns: dict

    Raises:
        ValueError: if uniquekeys=True and the data string has
            duplicate keys.

    Note:
        If uniquekeys=True, then dict entries are always strings,
        otherwise they are always lists of strings.
    """
    key_value_re = re.compile('([^:]+)\s*\:\s*(.*)')

    data_raw = re.split('\n', data_string)

    data = {}

    for l in data_raw:
        l = l.strip()
        if l:
            match = re.match(key_value_re, l)
            if match:
                key = match.groups()[0].strip()
                value = match.groups()[1].strip()
            if key in data.keys():
                if uniquekeys:
                    raise ValueError("Data string has duplicate keys: {0}".format(key))
                else:
                    data[key].append(value)
            else:
                if uniquekeys:
                    data[key] = value
                else:
                    data[key] = [value]
        else:
            pass

    return data

def process_running(pid_file):
    """ Checks if a process with PID in pid_file is running """
    with open(pid_file, 'r') as f:
        pid = f.read().strip()
    return psutil.pid_exists(int(pid))

@@ -2327,8 +2327,880 @@
 t(pid))%0A
+%0Adef seconds_to_human(s, separator=%22%22):%0A    %22%22%22 Converts number of seconds passed to a human-readable%0A    interval such as 1w4d18h35m59s%0A    %22%22%22%0A    s = int(s)%0A%0A    week = 60 * 60 * 24 * 7%0A    day = 60 * 60 * 24%0A    hour = 60 * 60%0A%0A    remainder = 0%0A    result = %22%22%0A%0A    weeks = s // week%0A    if weeks %3E 0:%0A        result = %22%7B0%7Dw%22.format(weeks)%0A        s = s %25 week%0A%0A    days = s // day%0A    if days %3E 0:%0A        result = %22%7B0%7D%7B1%7D%7B2%7Dd%22.format(result, separator, days)%0A        s = s %25 day%0A%0A    hours = s // hour%0A    if hours %3E 0:%0A        result = %22%7B0%7D%7B1%7D%7B2%7Dh%22.format(result, separator, hours)%0A        s = s %25 hour%0A%0A    minutes = s // 60%0A    if minutes %3E 0:%0A        result = %22%7B0%7D%7B1%7D%7B2%7Dm%22.format(result, separator, minutes)%0A        s = s %25 60%0A    print(s)%0A%0A    seconds = s%0A    if seconds %3E 0:%0A        result = %22%7B0%7D%7B1%7D%7B2%7Ds%22.format(result, separator, seconds)%0A%0A    return result%0A

Add a function for converting seconds to a human readable elapsed time descriptions such as 1w3d18h42m12s.