Set the firewall inbound/outbound settings for the specified profile and
    store

    Args:

        profile (str):
            The firewall profile to configure. Valid options are:

            - domain
            - public
            - private

        inbound (str):
            The inbound setting. If ``None`` is passed, the setting will remain
            unchanged. Valid values are:

            - blockinbound
            - blockinboundalways
            - allowinbound
            - notconfigured

            Default is ``None``

        outbound (str):
            The outbound setting. If ``None`` is passed, the setting will remain
            unchanged. Valid values are:

            - allowoutbound
            - blockoutbound
            - notconfigured

            Default is ``None``

        store (str):
            The store to use. This is either the local firewall policy or the
            policy defined by local group policy. Valid options are:

            - lgpo
            - local

            Default is ``local``

    Returns:
        bool: ``True`` if successful

    Raises:
        CommandExecutionError: If an error occurs
        ValueError: If the parameters are incorrect

def set_firewall_settings(profile,
                          inbound=None,
                          outbound=None,
                          store='local'):
    '''
    Set the firewall inbound/outbound settings for the specified profile and
    store

    Args:

        profile (str):
            The firewall profile to configure. Valid options are:

            - domain
            - public
            - private

        inbound (str):
            The inbound setting. If ``None`` is passed, the setting will remain
            unchanged. Valid values are:

            - blockinbound
            - blockinboundalways
            - allowinbound
            - notconfigured

            Default is ``None``

        outbound (str):
            The outbound setting. If ``None`` is passed, the setting will remain
            unchanged. Valid values are:

            - allowoutbound
            - blockoutbound
            - notconfigured

            Default is ``None``

        store (str):
            The store to use. This is either the local firewall policy or the
            policy defined by local group policy. Valid options are:

            - lgpo
            - local

            Default is ``local``

    Returns:
        bool: ``True`` if successful

    Raises:
        CommandExecutionError: If an error occurs
        ValueError: If the parameters are incorrect
    '''
    # Input validation
    if profile.lower() not in ('domain', 'public', 'private'):
        raise ValueError('Incorrect profile: {0}'.format(profile))
    if inbound and inbound.lower() not in ('blockinbound',
                                           'blockinboundalways',
                                           'allowinbound',
                                           'notconfigured'):
        raise ValueError('Incorrect inbound value: {0}'.format(inbound))
    if outbound and outbound.lower() not in ('allowoutbound',
                                             'blockoutbound',
                                             'notconfigured'):
        raise ValueError('Incorrect outbound value: {0}'.format(outbound))
    if not inbound and not outbound:
        raise ValueError('Must set inbound or outbound')

    # You have to specify inbound and outbound setting at the same time
    # If you're only specifying one, you have to get the current setting for the
    # other
    if not inbound or not outbound:
        ret = get_settings(profile=profile,
                           section='firewallpolicy',
                           store=store)
        if not inbound:
            inbound = ret['Inbound']
        if not outbound:
            outbound = ret['Outbound']

    command = 'set {0}profile firewallpolicy {1},{2}' \
              ''.format(profile, inbound, outbound)

    results = _netsh_command(command=command, store=store)

    if results:
        raise CommandExecutionError('An error occurred: {0}'.format(results))

    return True