#!/usr/bin/env python """Configuration parameters for the admin UI.""" from grr.lib import config_lib # The Admin UI web application. config_lib.DEFINE_integer("AdminUI.port", 8000, "port to listen on") config_lib.DEFINE_integer( "AdminUI.port_max", None, "If set and AdminUI.port is in use, attempt to " "use ports between AdminUI.port and " "AdminUI.port_max.") # Override this if you want to access admin ui extenally. Make sure it is # secured (i.e. AdminUI.webauth_manager is not NullWebAuthManager)! config_lib.DEFINE_string("AdminUI.bind", "127.0.0.1", "interface to bind to.") config_lib.DEFINE_string("AdminUI.document_root", "%(grr/gui/static|resource)", "The main path to the static HTML pages.") config_lib.DEFINE_string("AdminUI.local_document_root", "%(grr/gui/local/static|resource)", "The main path to the localized static HTML pages.") config_lib.DEFINE_string("AdminUI.help_root", "%(docs|resource)", "The main path to the locally cached documentation.") config_lib.DEFINE_string( "AdminUI.webauth_manager", "NullWebAuthManager", "The web auth manager for controlling access to the UI.")
#!/usr/bin/env python """Configuration parameters for the data stores.""" from grr.lib import config_lib config_lib.DEFINE_integer("Datastore.maximum_blob_size", 15*1024*1024, "Maximum blob size we may store in the datastore.") config_lib.DEFINE_string("Datastore.security_manager", "NullAccessControlManager", "The ACL manager for controlling access to data.") config_lib.DEFINE_string("Datastore.implementation", "FakeDataStore", "Storage subsystem to use.") config_lib.DEFINE_integer("Datastore.transaction_timeout", default=600, help="How long do we wait for a transaction lock.") DATASTORE_PATHING = [r"%{(?P<path>files/hash/generic/sha256/...).*}", r"%{(?P<path>files/hash/generic/sha1/...).*}", r"%{(?P<path>files/hash/generic/md5/...).*}", r"%{(?P<path>files/hash/pecoff/md5/...).*}", r"%{(?P<path>files/hash/pecoff/sha1/...).*}", r"%{(?P<path>files/nsrl/...).*}", r"%{(?P<path>W/[^/]+).*}", r"%{(?P<path>CA/[^/]+).*}", r"%{(?P<path>C\..\{1,16\}?)($|/.*)}", r"%{(?P<path>hunts/[^/]+).*}", r"%{(?P<path>blobs/[^/]+).*}", r"%{(?P<path>[^/]+).*}"]
default="%(Test.srcdir)/grr/config/grr-server.yaml", help="The path where the test configuration file exists.") config_lib.DEFINE_constant_string( "Test.additional_test_config", default="%(Test.data_dir)/localtest.yaml", help="The path to a test config with local customizations.") config_lib.DEFINE_string("Test.tmpdir", "/tmp/", help="Somewhere to write temporary files.") config_lib.DEFINE_string("Test.data_store", "FakeDataStore", "The data store to run the tests against.") config_lib.DEFINE_integer("Test.remote_pdb_port", 2525, "Remote debugger port.") config_lib.DEFINE_list( "Test.end_to_end_client_ids", [], "List of client ids to perform regular end_to_end tests" " on. These clients should be always on and connected" " to the network.") config_lib.DEFINE_list( "Test.end_to_end_client_hostnames", [], "List of hostnames to perform regular end_to_end tests" " on. These clients should be always on and connected" " to the network.") config_lib.DEFINE_string( "Test.end_to_end_result_check_wait", "50m",
#!/usr/bin/env python """Configuration parameters for the server side subsystems.""" from grr.lib import config_lib from grr.lib import rdfvalue # Note: Each thread adds about 8mb for stack space. config_lib.DEFINE_integer("Threadpool.size", 50, "Number of threads in the shared thread pool.") config_lib.DEFINE_integer( "Worker.task_limit", 2000, "Limits the number of tasks a worker retrieves " "every poll") config_lib.DEFINE_integer("Worker.flow_lease_time", 600, "Duration of flow lease time in seconds.") config_lib.DEFINE_integer( "Frontend.throttle_average_interval", 60, "Time interval over which average request rate is " "calculated when throttling is enabled.") config_lib.DEFINE_list( "Frontend.well_known_flows", ["aff4:/flows/W:TransferStore", "aff4:/flows/W:Stats"], "Allow these well known flows to run directly on the " "frontend. Other flows are scheduled as normal.") # Smtp settings. config_lib.DEFINE_string("Worker.smtp_server", "localhost", "The smpt server for sending email alerts.")
#!/usr/bin/env python """Configuration parameters for the server side subsystems.""" from grr.lib import config_lib from grr.lib import rdfvalue # Note: Each thread adds about 8mb for stack space. config_lib.DEFINE_integer("Threadpool.size", 50, "Number of threads in the shared thread pool.") config_lib.DEFINE_integer("Worker.flow_lease_time", 600, "Duration of a flow lease time in seconds.") config_lib.DEFINE_integer("Worker.well_known_flow_lease_time", 600, "Duration of a well known flow lease time in " "seconds.") config_lib.DEFINE_integer("Worker.compaction_lease_time", 3600, "Duration of collections lease time for compaction " "in seconds.") config_lib.DEFINE_bool("Worker.enable_packed_versioned_collection_journaling", False, "If True, all Add*() operations and all " "compactions of PackedVersionedCollections will be " "journaled so that these collections can be later " "checked for integrity.") config_lib.DEFINE_integer("Worker.queue_shards", 5, "Queue notifications will be sharded across " "this number of datastore subjects.")
#!/usr/bin/env python """Configuration parameters for the server side subsystems.""" import grr from grr.lib import config_lib from grr.lib import rdfvalue from grr.lib.rdfvalues import crypto as rdf_crypto VERSION = grr.version() config_lib.DEFINE_integer("Source.version_major", VERSION["major"], "Major version number of client binary.") config_lib.DEFINE_integer("Source.version_minor", VERSION["minor"], "Minor version number of client binary.") config_lib.DEFINE_integer("Source.version_revision", VERSION["revision"], "Revision number of client binary.") config_lib.DEFINE_integer("Source.version_release", VERSION["release"], "Release number of client binary.") config_lib.DEFINE_string( "Source.version_string", "%(version_major).%(version_minor)." "%(version_revision).%(version_release)", "Version string of the client.") config_lib.DEFINE_integer( "Source.version_numeric", "%(version_major)%(version_minor)" "%(version_revision)%(version_release)", "Version string of the client as an integer.")
#!/usr/bin/env python """Configuration parameters for the data stores.""" from grr.lib import config_lib from grr.lib import rdfvalue config_lib.DEFINE_integer("Datastore.maximum_blob_size", 15 * 1024 * 1024, "Maximum blob size we may store in the datastore.") config_lib.DEFINE_string("Datastore.security_manager", "NullAccessControlManager", "The ACL manager for controlling access to data.") config_lib.DEFINE_string("Datastore.implementation", "FakeDataStore", "Storage subsystem to use.") config_lib.DEFINE_string("Blobstore.implementation", "MemoryStreamBlobstore", "Blob storage subsystem to use.") config_lib.DEFINE_integer("Datastore.transaction_timeout", default=600, help="How long do we wait for a transaction lock.") DATASTORE_PATHING = [ r"%{(?P<path>files/hash/generic/sha256/...).*}", r"%{(?P<path>files/hash/generic/sha1/...).*}", r"%{(?P<path>files/hash/generic/md5/...).*}", r"%{(?P<path>files/hash/pecoff/md5/...).*}", r"%{(?P<path>files/hash/pecoff/sha1/...).*}", r"%{(?P<path>files/nsrl/...).*}", r"%{(?P<path>W/[^/]+).*}", r"%{(?P<path>CA/[^/]+).*}", r"%{(?P<path>C\..\{1,16\}?)($|/.*)}",
#!/usr/bin/env python """Configuration parameters for the data stores.""" from grr.lib import config_lib from grr.lib import rdfvalue config_lib.DEFINE_integer("Datastore.maximum_blob_size", 512 * 1024, "Maximum blob size we may store in the datastore.") config_lib.DEFINE_string("Datastore.implementation", "FakeDataStore", "Storage subsystem to use.") config_lib.DEFINE_string("Blobstore.implementation", "MemoryStreamBlobstore", "Blob storage subsystem to use.") config_lib.DEFINE_string("Database.implementation", "", "Relational database system to use.") config_lib.DEFINE_bool( "Database.useForReads", False, "Use relational database for reading as well as for writing.") DATASTORE_PATHING = [ r"%{(?P<path>files/hash/generic/sha256/...).*}", r"%{(?P<path>files/hash/generic/sha1/...).*}", r"%{(?P<path>files/hash/generic/md5/...).*}", r"%{(?P<path>files/hash/pecoff/md5/...).*}", r"%{(?P<path>files/hash/pecoff/sha1/...).*}", r"%{(?P<path>files/nsrl/...).*}", r"%{(?P<path>W/[^/]+).*}", r"%{(?P<path>CA/[^/]+).*}", r"%{(?P<path>C\..\{1,16\}?)($|/.*)}", r"%{(?P<path>hunts/[^/]+).*}", r"%{(?P<path>blobs/[^/]+).*}",
#!/usr/bin/env python """Configuration parameters for the admin UI.""" from grr.lib import config_lib # The Admin UI web application. config_lib.DEFINE_integer("AdminUI.port", 8081, "port to listen on") # Override this if you want to access admin ui extenally. Make sure it is # secured (i.e. AdminUI.webauth_manager is not NullWebAuthManager)! config_lib.DEFINE_string("AdminUI.bind", "127.0.0.1", "interface to bind to.") config_lib.DEFINE_string("AdminUI.document_root", "%(grr/gui/static|resource)", "The main path to the static HTML pages.") config_lib.DEFINE_string("AdminUI.local_document_root", "%(grr/gui/local/static|resource)", "The main path to the localized static HTML pages.") config_lib.DEFINE_string("AdminUI.help_root", "%(docs|resource)", "The main path to the static HTML pages.") config_lib.DEFINE_string( "AdminUI.webauth_manager", "NullWebAuthManager", "The web auth manager for controlling access to the UI.") config_lib.DEFINE_bool("AdminUI.django_debug", True, "Turn on to add django debugging") config_lib.DEFINE_string( "AdminUI.django_secret_key", "CHANGE_ME",
"Logging.format", # Use a literal block here to prevent config system expansion as this should # be a python format string. "%{%(levelname)s:%(asctime)s %(module)s:%(lineno)s] %(message)s}", help="Log line format (using python's standard logging expansions).") config_lib.DEFINE_string("Logging.service_name", "GRR", help="The service name that will be logged with the " "event log engine.") config_lib.DEFINE_option( type_info.RDFValueType(rdfclass=standard.DomainEmailAddress, name="Monitoring.alert_email", help="The email address to send events to.", default="grr-monitoring@localhost")) config_lib.DEFINE_option( type_info.RDFValueType(rdfclass=standard.DomainEmailAddress, name="Monitoring.emergency_access_email", help="The email address to notify in an emergency.", default="grr-emergency@localhost")) config_lib.DEFINE_integer("Monitoring.http_port", 0, "Port for stats monitoring server.") config_lib.DEFINE_integer( "Logging.aff4_audit_log_rollover", 60 * 60 * 24 * 14, "Audit log rollover interval in seconds. " "Default is 2 weeks")
from grr.lib import config_lib from grr.lib import data_store from grr.lib import rdfvalue from grr.lib import registry from grr.lib import stats config_lib.DEFINE_string("StatsStore.process_id", default="", help="Id used to identify stats data of the current " "process. This should be different for different GRR " "processes. I.e. if you have 4 workers, for every " "worker the subject should be different. For example: " "worker_1, worker_2, worker_3, worker_4.") config_lib.DEFINE_integer("StatsStore.write_interval", default=60, help="Time in seconds between the dumps of stats " "data into the stats store.") config_lib.DEFINE_integer("StatsStore.ttl", default=60 * 60 * 24 * 7, help="Maximum lifetime (in seconds) of data in the " "stats store. Default is one week.") class StatsStore(object): """Implementation of the long-term storage of collected stats data. This class allows to write current stats data to the data store, read and delete them. StatsStore uses data_store to store the data. All historical stats data are stored in a single data store subject per process. By process we mean, for example: "admin UI", "worker #1", "worker #3", etc. Stats data are stored as subject's attributes.
#!/usr/bin/env python """Settings for ACLs/approvals system.""" from grr.lib import config_lib config_lib.DEFINE_string( "ACL.approvers_config_file", "%(Config.directory)/approvers.yaml", "File that defines who can approve access to " "clients with certain labels.") config_lib.DEFINE_integer("ACL.approvers_required", 2, "The number of approvers required for access.") config_lib.DEFINE_string( "ACL.group_access_manager_class", "NoGroupAccess", "This class handles interfacing with corporate group" "directories for granting access. Override with a " "class that understands your LDAP/AD/whatever setup.") config_lib.DEFINE_integer( "ACL.token_expiry", 7 * 24 * 60 * 60, "The duration in seconds of a valid approval token. " "Default of one week.")
"""Configuration parameters for server output plugins.""" from grr.lib import config_lib from grr.lib import rdfvalue config_lib.DEFINE_string("BigQuery.service_acct_json", None, "The json contents of the service account file.") config_lib.DEFINE_string("BigQuery.project_id", None, "The BigQuery project_id.") config_lib.DEFINE_string("BigQuery.dataset_id", "grr", "The BigQuery project_id.") config_lib.DEFINE_integer( "BigQuery.max_file_post_size", 5 * 1000 * 1000, "Max size of file to put in each POST " "to bigquery. Note enforcement is not exact.") config_lib.DEFINE_integer("BigQuery.retry_max_attempts", 2, "Total number of times to retry an upload.") config_lib.DEFINE_integer( "BigQuery.max_upload_failures", 100, "Total number of times to try uploading to BigQuery" " for a given hunt or flow.") config_lib.DEFINE_semantic(rdfvalue.Duration, "BigQuery.retry_interval", "2s", "Time to wait before first retry.") config_lib.DEFINE_integer( "BigQuery.retry_multiplier", 2,
config_lib.DEFINE_string("Client.arch", "amd64", "The architecture we are running on.") config_lib.DEFINE_string("Client.build_time", "Unknown", "The time the client was built.") config_lib.DEFINE_string("Client.deploy_time", "Unknown", "The time the client was deployed.") config_lib.DEFINE_string( "Client.build_environment", None, "The output of Uname.FromCurrentSystem.signature() " "on the system the client was built on.") config_lib.DEFINE_integer("Client.rsa_key_length", 2048, "The key length of the client keys in bits.") config_lib.DEFINE_string( name="Client.install_path", default=r"%(SystemRoot|env)\\System32\\%(name)\\%(Template.version_string)", help="Where the client binaries are installed.") config_lib.DEFINE_string( name="Client.rekall_profile_cache_path", default=r"%(Client.install_path)\\rekall_profiles", help="Where GRR stores cached Rekall profiles needed for memory analysis") config_lib.DEFINE_list(name="Client.server_urls", default=[], help="Base URL for client control.")
#!/usr/bin/env python """Configuration parameters for the data servers.""" from grr.lib import config_lib # The Data Store server. config_lib.DEFINE_integer("Dataserver.stats_frequency", 60, ("Time interval in seconds for data server " "statistics updates")) config_lib.DEFINE_list("Dataserver.server_list", ["http://127.0.0.1:7000", "http://127.0.0.1:7001"], "List of allowed data servers (first is the master).") config_lib.DEFINE_integer("Dataserver.max_connections", 5, ("Maximum number of connections to the data server " "per process.")) config_lib.DEFINE_integer("Dataserver.port", 7000, "Port for a specific data server.") # Login information for clients of the data servers. config_lib.DEFINE_list( "Dataserver.client_credentials", ["user:pass:rw"], "List of data server client credentials, given as " "<username>:<password>:<mode> where mode is r or rw.") # Login information used by data servers when registering with the master. config_lib.DEFINE_string("Dataserver.server_username", "server", "Username for servers.")
config_lib.DEFINE_float("Client.poll_min", 0.2, "Minimum time between polls in seconds.") config_lib.DEFINE_float("Client.poll_max", 600, "Maximum time between polls in seconds.") config_lib.DEFINE_float( "Client.error_poll_min", 15, "Minimum time between polls in seconds if the server " "reported an error.") config_lib.DEFINE_float("Client.poll_slew", 1.15, "Slew of poll time.") config_lib.DEFINE_integer( "Client.connection_error_limit", 60 * 24, "If the client encounters this many connection " "errors, it exits and restarts. Retries are one " "minute apart.") config_lib.DEFINE_list( name="Client.proxy_servers", help="List of valid proxy servers the client should try.", default=[]) config_lib.DEFINE_integer("Client.max_post_size", 8000000, "Maximum size of the post.") config_lib.DEFINE_integer("Client.max_out_queue", 10240000, "Maximum size of the output queue.") config_lib.DEFINE_integer(
#!/usr/bin/env python """Configuration parameters for the server side subsystems.""" import grr from grr.lib import config_lib from grr.lib import rdfvalue from grr.lib.rdfvalues import crypto as rdf_crypto VERSION = grr.version() config_lib.DEFINE_integer("Source.version_major", VERSION["major"], "Major version number of client binary.") config_lib.DEFINE_integer("Source.version_minor", VERSION["minor"], "Minor version number of client binary.") config_lib.DEFINE_integer("Source.version_revision", VERSION["revision"], "Revision number of client binary.") config_lib.DEFINE_integer("Source.version_release", VERSION["release"], "Release number of client binary.") config_lib.DEFINE_string( "Source.version_string", "%(version_major).%(version_minor)." "%(version_revision).%(version_release)", "Version string of the client.") config_lib.DEFINE_integer( "Source.version_numeric", "%(version_major)%(version_minor)" "%(version_revision)%(version_release)", "Version string of the client as an integer.")
#!/usr/bin/env python """Configuration parameters for the data stores.""" from grr.lib import config_lib config_lib.DEFINE_integer("Datastore.maximum_blob_size", 15 * 1024 * 1024, "Maximum blob size we may store in the datastore.") config_lib.DEFINE_string("Datastore.security_manager", "NullAccessControlManager", "The ACL manager for controlling access to data.") config_lib.DEFINE_string("Datastore.implementation", "FakeDataStore", "Storage subsystem to use.") config_lib.DEFINE_integer("Datastore.transaction_timeout", default=600, help="How long do we wait for a transaction lock.") DATASTORE_PATHING = [ r"%{(?P<path>files/hash/generic/sha256/...).*}", r"%{(?P<path>files/hash/generic/sha1/...).*}", r"%{(?P<path>files/hash/generic/md5/...).*}", r"%{(?P<path>files/hash/pecoff/md5/...).*}", r"%{(?P<path>files/hash/pecoff/sha1/...).*}", r"%{(?P<path>files/nsrl/...).*}", r"%{(?P<path>W/[^/]+).*}", r"%{(?P<path>CA/[^/]+).*}", r"%{(?P<path>C\..\{1,16\}?)($|/.*)}", r"%{(?P<path>hunts/[^/]+).*}", r"%{(?P<path>blobs/[^/]+).*}", r"%{(?P<path>[^/]+).*}" ]
"domain socket or in a UDP host:port notation.") config_lib.DEFINE_string("Logging.filename", "%(Logging.path)/GRRlog.txt", help="Filename of the grr log file.") config_lib.DEFINE_string( "Logging.format", # Use a literal block here to prevent config system expansion as this should # be a python format string. "%{%(levelname)s:%(asctime)s %(module)s:%(lineno)s] %(message)s}", help="Log line format (using python's standard logging expansions).") config_lib.DEFINE_string("Logging.service_name", "GRR", help="The service name that will be logged with the " "event log engine.") config_lib.DEFINE_option(type_info.RDFValueType( rdfclass=rdfvalue.DomainEmailAddress, name="Monitoring.alert_email", help="The email address to send events to.", default="monitoring@localhost")) config_lib.DEFINE_option(type_info.RDFValueType( rdfclass=rdfvalue.DomainEmailAddress, name="Monitoring.emergency_access_email", help="The email address to notify in an emergency.", default="monitoring@localhost")) config_lib.DEFINE_integer("Monitoring.http_port", 0, "Port for stats monitoring server.")
config_lib.DEFINE_string("Client.arch", "amd64", "The architecture we are running on.") config_lib.DEFINE_string("Client.build_time", "Unknown", "The time the client was built.") config_lib.DEFINE_string("Client.deploy_time", "Unknown", "The time the client was deployed.") config_lib.DEFINE_string( "Client.build_environment", None, "The output of Uname.FromCurrentSystem.signature() " "on the system the client was built on.") config_lib.DEFINE_integer("Client.rsa_key_length", 2048, "The key length of the client keys in bits.") config_lib.DEFINE_string( name="Client.install_path", default=r"%(SystemRoot|env)\\System32\\%(name)\\%(Template.version_string)", help="Where the client binaries are installed.") config_lib.DEFINE_string( name="Client.component_path", default=r"%(Client.install_path)/components", help="Where the client components are installed on the client.") config_lib.DEFINE_string( name="Client.component_url_stem", default="%(Frontend.static_url_path_prefix)components/", help="A URL path where components will be served from.")
#!/usr/bin/env python """Settings for ACLs/approvals system.""" from grr.lib import config_lib config_lib.DEFINE_string( "ACL.approvers_config_file", "", "File that defines who can approve access to " "clients with certain labels. See " "config/approvers.yaml for an example.") config_lib.DEFINE_integer("ACL.approvers_required", 2, "The number of approvers required for access.") config_lib.DEFINE_integer( "ACL.cache_age", 600, "The number of seconds " "approval objects live in the cache.") config_lib.DEFINE_string( "ACL.group_access_manager_class", "NoGroupAccess", "This class handles interfacing with corporate group" "directories for granting access. Override with a " "class that understands your LDAP/AD/whatever setup.") config_lib.DEFINE_integer( "ACL.token_expiry", 7 * 24 * 60 * 60, "The duration in seconds of a valid approval token. " "Default of one week.")
#!/usr/bin/env python """Configuration parameters for the check subsystem.""" from grr.lib import config_lib config_lib.DEFINE_list("Checks.config_dir", ["%(grr/checks|resource)", "%(grr/checks/local|resource)"], "A list of directories to load checks from.") config_lib.DEFINE_list("Checks.config_files", [], "Paths of check configurations to load at start up.") config_lib.DEFINE_integer("Checks.max_results", 50, "Maximum items to include as check results.")
#!/usr/bin/env python """API config options.""" from grr.lib import config_lib from grr.lib import rdfvalue config_lib.DEFINE_integer( "API.DailyFlowRequestLimit", "10", "Number of flows a user can run on a single client " "per day before being blocked by throttling. Set to " "0 to disable checking.") config_lib.DEFINE_semantic( rdfvalue.Duration, "API.FlowDuplicateInterval", default="1200s", description="Amount of time " "that needs to pass before the throttler will allow " "an identical flow to run on the same client. Set " "to 0s to disable checking.") config_lib.DEFINE_string( "API.RouterACLConfigFile", "", "The file containing API acls, see " "grr/config/api_acls.yaml for an example.") config_lib.DEFINE_string( "API.DefaultRouter", "DisabledApiCallRouter", "The default router used by the API if there are no " "rules defined in API.RouterACLConfigFile or if none " "of these rules matches.")
default=("%(ClientBuilder.executables_dir)" "/installers/%(ClientRepacker.output_filename)"), help="The full path to the generated installer file.")) # These values are determined from the template at repack time. config_lib.DEFINE_choice(name="Template.build_type", default="Release", choices=["Release", "Debug"], help="Type of build (Debug, Release)") config_lib.DEFINE_list( name="Template.build_context", default=[], help="List of build contexts that should be reapplied at repack.") config_lib.DEFINE_integer("Template.version_major", None, "Major version number of client template.") config_lib.DEFINE_integer("Template.version_minor", None, "Minor version number of client template.") config_lib.DEFINE_integer("Template.version_revision", None, "Revision number of client template.") config_lib.DEFINE_integer("Template.version_release", None, "Release number of client template.") config_lib.DEFINE_string( "Template.version_string", "%(version_major).%(version_minor)." "%(version_revision).%(version_release)", "Version string of the client template.")
#!/usr/bin/env python """Configuration parameters for the aff4 subsystem.""" from grr.lib import config_lib config_lib.DEFINE_integer( "AFF4.cache_age", 5, "The number of seconds AFF4 objects live in the cache.") config_lib.DEFINE_integer("AFF4.cache_max_size", 10000, "Maximum size of the AFF4 objects cache.") config_lib.DEFINE_integer( "AFF4.intermediate_cache_age", 600, "The number of seconds AFF4 urns live in index cache.") config_lib.DEFINE_integer("AFF4.intermediate_cache_max_size", 2000, "Maximum size of the AFF4 index cache.") config_lib.DEFINE_integer( "AFF4.notification_rules_cache_age", 60, "The number of seconds AFF4 notification rules are cached.") config_lib.DEFINE_string( "AFF4.change_email", None, "Email used by AFF4NotificationEmailListener to notify " "about AFF4 changes.")