<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def flagmanager_cli(argv, alter_logger=True):
 """Command-line access to ``flagmanager`` functionality. The ``flagmanager`` task manages tables of flags associated with measurement sets. Its features are easy to implement that a standalone library function is essentially unnecessary. See the source code to this function for the tool calls that implement different parts of the ``flagmanager`` functionality. """

    check_usage(flagmanager_doc, argv, usageifnoargs=True)

    if len(argv) < 3:
        wrong_usage(flagmanager_doc, 'expect at least a mode and an MS name')

    mode = argv[1]
    ms = argv[2]

    if alter_logger:
        if mode == 'list':
            util.logger('info')
        elif mode == 'delete':
            # it WARNs 'deleting version xxx' ... yargh
            util.logger('severe')
        else:
            util.logger()

    try:
        factory = util.tools.agentflagger
    except AttributeError:
        factory = util.tools.testflagger

    af = factory()
    af.open(b(ms))

    if mode == 'list':
        if len(argv) != 3:
            wrong_usage(flagmanager_doc, 'expect exactly one argument in list mode')
        af.getflagversionlist()
    elif mode == 'save':
        if len(argv) != 4:
            wrong_usage(flagmanager_doc, 'expect exactly two arguments in save mode')
        from time import strftime
        name = argv[3]
        af.saveflagversion(versionname=b(name), merge=b'replace',
                            comment=b('created %s(casatask flagmanager)'
                                      % strftime('%Y-%m-%dT%H:%M:%SZ')))
    elif mode == 'restore':
        if len(argv) != 4:
            wrong_usage(flagmanager_doc, 'expect exactly two arguments in restore mode')
        name = argv[3]
        af.restoreflagversion(versionname=b(name), merge=b'replace')
    elif mode == 'delete':
        if len(argv) != 4:
            wrong_usage(flagmanager_doc, 'expect exactly two arguments in delete mode')
        name = argv[3]

        if not os.path.isdir(os.path.join(ms + '.flagversions', 'flags.' + name)):
            # This condition only results in a WARN from deleteflagversion()!
            raise RuntimeError('version "%s" doesn\'t exist in "%s.flagversions"'
                                % (name, ms))

        af.deleteflagversion(versionname=b(name))
    else:
        wrong_usage(flagmanager_doc, 'unknown flagmanager mode "%s"' % mode)

    af.done()