<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def eclean_dist(destructive=False, package_names=False, size_limit=0,
                time_limit=0, fetch_restricted=False,
                exclude_file='/etc/eclean/distfiles.exclude'):
    '''
    Clean obsolete portage sources

    destructive
        Only keep minimum for reinstallation

    package_names
        Protect all versions of installed packages. Only meaningful if used
        with destructive=True

    size_limit <size>
        Don't delete distfiles bigger than <size>.
        <size> is a size specification: "10M" is "ten megabytes",
        "200K" is "two hundreds kilobytes", etc. Units are: G, M, K and B.

    time_limit <time>
        Don't delete distfiles files modified since <time>
        <time> is an amount of time: "1y" is "one year", "2w" is
        "two weeks", etc. Units are: y (years), m (months), w (weeks),
        d (days) and h (hours).

    fetch_restricted
        Protect fetch-restricted files. Only meaningful if used with
        destructive=True

    exclude_file
        Path to exclusion file. Default is /etc/eclean/distfiles.exclude
        This is the same default eclean-dist uses. Use None if this file
        exists and you want to ignore.

    Returns a dict containing the cleaned, saved, and deprecated dists:

    .. code-block:: python

        {'cleaned': {<dist file>: <size>},
         'deprecated': {<package>: <dist file>},
         'saved': {<package>: <dist file>},
         'total_cleaned': <size>}

    CLI Example:

    .. code-block:: bash

        salt '*' gentoolkit.eclean_dist destructive=True
    '''
    if exclude_file is None:
        exclude = None
    else:
        try:
            exclude = _parse_exclude(exclude_file)
        except excludemod.ParseExcludeFileException as e:
            ret = {e: 'Invalid exclusion file: {0}'.format(exclude_file)}
            return ret

    if time_limit != 0:
        time_limit = cli.parseTime(time_limit)
    if size_limit != 0:
        size_limit = cli.parseSize(size_limit)

    clean_size = 0
    engine = search.DistfilesSearch(lambda x: None)
    clean_me, saved, deprecated = engine.findDistfiles(
        destructive=destructive, package_names=package_names,
        size_limit=size_limit, time_limit=time_limit,
        fetch_restricted=fetch_restricted, exclude=exclude)

    cleaned = dict()

    def _eclean_progress_controller(size, key, *args):
        cleaned[key] = _pretty_size(size)
        return True

    if clean_me:
        cleaner = clean.CleanUp(_eclean_progress_controller)
        clean_size = cleaner.clean_dist(clean_me)

    ret = {'cleaned': cleaned, 'saved': saved, 'deprecated': deprecated,
           'total_cleaned': _pretty_size(clean_size)}
    return ret