def get_argparser(): parser = argparse.ArgumentParser( description="ARTIQ schedule InfluxDB logger bridge", epilog="Listens to schedule updates on the master experiment schedule " "and submits schedule additions and removals to the InfluxDB " "database. Other schedule changes, such as transitions between " "pipeline states (prepare, prepare_done, running, etc.) are " "ignored. Typical high cardinality metadata is logged as " "fields while low cardinality data is logged as tags. " "The initially obtained complete state is logged as a 'clear' " "entry followed by the addition of all entries.") group = parser.add_argument_group("master") group.add_argument("--server-master", default="::1", help="hostname or IP of the master to connect to") group.add_argument("--port-master", default=3250, type=int, help="TCP port to use to connect to the master") group.add_argument("--retry-master", default=5.0, type=float, help="retry timer for reconnecting to master") group = parser.add_argument_group("database") group.add_argument( "--baseurl-db", default="http://localhost:8086", help="base URL to access InfluxDB (default: %(default)s)") group.add_argument("--user-db", default="", help="InfluxDB username") group.add_argument("--password-db", default="", help="InfluxDB password") group.add_argument("--database", default="db", help="database name to use") group.add_argument("--table", default="schedule", help="table name to use") simple_network_args(parser, [("control", "control", 3275)]) add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ Dashboard") parser.add_argument("-s", "--server", default="::1", help="hostname or IP of the master to connect to") parser.add_argument("--port-notify", default=3250, type=int, help="TCP port to connect to for notifications") parser.add_argument("--port-control", default=3251, type=int, help="TCP port to connect to for control") parser.add_argument("--port-broadcast", default=1067, type=int, help="TCP port to connect to for broadcasts") parser.add_argument( "--db-file", default=None, help="database file for local GUI settings, " "by default in {} and dependant on master hostname".format( get_user_config_dir())) add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ Browser") parser.add_argument("--version", action="version", version="ARTIQ v{}".format(artiq_version), help="print the ARTIQ version number") parser.add_argument("--db-file", default=None, help="database file for local browser settings " "(default: %(default)s)") parser.add_argument("--browse-root", default="", help="root path for directory tree " "(default %(default)s)") parser.add_argument("-s", "--server", default="::1", help="hostname or IP of the master to connect to " "when uploading datasets") parser.add_argument("--port", default=3251, type=int, help="TCP port to use to connect to the master") parser.add_argument("select", metavar="SELECT", nargs="?", help="directory to browse or file to load") add_common_args(parser) return parser
def get_argparser(): default_db_file = os.path.join(get_user_config_dir(), "artiq_browser.pyon") parser = argparse.ArgumentParser(description="ARTIQ Browser") parser.add_argument("--db-file", default=default_db_file, help="database file for local browser settings " "(default: %(default)s)") parser.add_argument("--browse-root", default="", help="root path for directory tree " "(default %(default)s)") parser.add_argument("-s", "--server", default="::1", help="hostname or IP of the master to connect to " "when uploading datasets") parser.add_argument("--port", default=3251, type=int, help="TCP port to use to connect to the master") parser.add_argument("select", metavar="SELECT", nargs="?", help="directory to browse or file to load") add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser( description="ARTIQ data to InfluxDB bridge", epilog="Pattern matching works as follows. " "The default action on a key (dataset name) is to log it. " "Then the patterns are traversed in order and glob-matched " "with the key. " "Optional + and - pattern prefixes specify to either ignore or " "log keys matching the rest of the pattern. " "Default (in the absence of prefix) is to ignore. Last matched " "pattern takes precedence. \n \n" "For a dataset to be logged, it must be marked as persistent " "on initialization. This is done by setting the persist argument " "in set_dataset() to True.") master_group = parser.add_argument_group("master") master_group.add_argument( "--server-master", default="::1", help="hostname or IP of the master to connect to") master_group.add_argument( "--port-master", default=3250, type=int, help="TCP port to use to connect to the master (default: %(default)s") master_group.add_argument("--retry-master", default=5.0, type=float, help="retry timer for reconnecting to master") database_group = parser.add_argument_group("database") database_group.add_argument( "--baseurl-db", default="http://localhost:8086", help="base URL to access InfluxDB (default: %(default)s)") database_group.add_argument("--user-db", default="", help="InfluxDB username") database_group.add_argument("--password-db", default="", help="InfluxDB password") database_group.add_argument("--database", default="db", help="database name to use") database_group.add_argument("--table", default="lab", help="table name to use") filter_group = parser.add_argument_group("filter") filter_group.add_argument( "--pattern-file", default="influxdb_patterns.cfg", help="file to load the patterns from (default: %(default)s). " "If the file is not found, no patterns are loaded " "(everything is logged).") simple_network_args(parser, [("control", "control", 3248)]) add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser( description="ARTIQ controller for core device logs") tools.add_common_args(parser) tools.simple_network_args(parser, 1068) parser.add_argument("--simulation", action="store_true", help="Simulation - does not connect to device") parser.add_argument("core_addr", metavar="CORE_ADDR", help="hostname or IP address of the core device") return parser
def get_argparser(): parser = argparse.ArgumentParser( formatter_class=argparse.RawDescriptionHelpFormatter, description="ARTIQ flashing/deployment tool", epilog="""\ Valid actions: * gateware: write gateware bitstream to flash * bootloader: write bootloader to flash * storage: write storage image to flash * firmware: write firmware to flash * load: load gateware bitstream into device (volatile but fast) * erase: erase flash memory * start: trigger the target to (re)load its gateware bitstream from flash Prerequisites: * Connect the board through its/a JTAG adapter. * Have OpenOCD installed and in your $PATH. * Have access to the JTAG adapter's devices. Udev rules from OpenOCD: 'sudo cp openocd/contrib/99-openocd.rules /etc/udev/rules.d' and replug the device. Ensure you are member of the plugdev group: 'sudo adduser $USER plugdev' and re-login. """) add_common_args(parser) parser.add_argument("-n", "--dry-run", default=False, action="store_true", help="only show the openocd script that would be run") parser.add_argument("-H", "--host", metavar="HOSTNAME", type=str, default=None, help="SSH host where the board is located") parser.add_argument("-J", "--jump", type=str, default=None, help="SSH host to jump through") parser.add_argument("-t", "--target", default="kasli", help="target board, default: %(default)s, one of: " "kasli sayma metlino kc705") parser.add_argument("-V", "--variant", default=None, help="board variant. Autodetected if only one is installed.") parser.add_argument("-I", "--preinit-command", default=[], action="append", help="add a pre-initialization OpenOCD command. " "Useful for selecting a board when several are connected.") parser.add_argument("-f", "--storage", help="write file to storage area") parser.add_argument("-d", "--dir", help="look for board binaries in this directory") parser.add_argument("--srcbuild", help="board binaries directory is laid out as a source build tree", default=False, action="store_true") parser.add_argument("action", metavar="ACTION", nargs="*", default="gateware bootloader firmware start".split(), help="actions to perform, default: %(default)s") return parser
def get_argparser(): parser = argparse.ArgumentParser( description="ARTIQ core device development tool", formatter_class=argparse.ArgumentDefaultsHelpFormatter) add_common_args(parser) parser.add_argument("-t", "--target", metavar="TARGET", type=str, default="kasli", help="target to build, one of: " "kc705 kasli sayma") parser.add_argument("-V", "--variant", metavar="VARIANT", type=str, default=None, help="variant to build, dependent on the target") parser.add_argument("-g", "--gateware", default=False, action="store_true", help="build/flash gateware, not just software") parser.add_argument("--args", metavar="ARGS", type=shlex.split, default=[], help="extra arguments for gateware/firmware build") parser.add_argument("-H", "--host", type=str, default="lab.m-labs.hk", help="SSH host where the development board is located") parser.add_argument("-J", "--jump", type=str, default=None, help="SSH host to jump through") parser.add_argument("-b", "--board", type=str, default="{board_type}-1", help="board to connect to on the development SSH host") parser.add_argument("-B", "--board-file", type=str, default="/var/lib/artiq/boards/{board}", help="the board file containing the openocd initialization commands; " "it is also used as the lock file") parser.add_argument("-s", "--serial", type=str, default="/dev/ttyUSB_{board}", help="TTY device corresponding to the development board") parser.add_argument("-d", "--device", type=str, default="{board}", help="address or domain corresponding to the development board") parser.add_argument("-w", "--wait", action="store_true", help="wait for the board to unlock instead of aborting the actions") parser.add_argument("actions", metavar="ACTION", type=str, default=[], nargs="+", help="actions to perform, sequence of: " "build clean reset flash flash+log load connect hotswap") return parser
def get_argparser(): parser = argparse.ArgumentParser(description="WAnD laser locker") add_common_args(parser) parser.add_argument("-s", "--server", action="append", help="Add a WAnD server by IP address") parser.add_argument("-poll", "--poll-time", help="time between log updates (s) (default: " "'%(default)s')", type=int, default=300) parser.add_argument("-db", "--database", help="influxdb database to log to '%(default)s')", default="lasers") return parser
def get_argparser(): parser = argparse.ArgumentParser() simple_network_args(parser, 4000) add_common_args(parser) parser.add_argument( "--list", action="store_true", help="list connected cameras (ignores all other arguments)") parser.add_argument("--broadcast-images", action="store_true") parser.add_argument("--zmq-bind", default="*") parser.add_argument("--zmq-port", default=5555, type=int) parser.add_argument( "--device", "-d", type=int, default=None, help="camera serial number, uses first available if not supplied") return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ Browser") parser.add_argument("--db-file", default=None, help="database file for local browser settings " "(default: %(default)s)") parser.add_argument("--browse-root", default="", help="root path for directory tree " "(default %(default)s)") parser.add_argument( "-s", "--server", default="::1", help="hostname or IP of the master to connect to " "when uploading datasets") parser.add_argument( "--port", default=3251, type=int, help="TCP port to use to connect to the master") parser.add_argument("select", metavar="SELECT", nargs="?", help="directory to browse or file to load") add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ Dashboard") parser.add_argument( "-s", "--server", default="::1", help="hostname or IP of the master to connect to") parser.add_argument( "--port-notify", default=3250, type=int, help="TCP port to connect to for notifications") parser.add_argument( "--port-control", default=3251, type=int, help="TCP port to connect to for control") parser.add_argument( "--port-broadcast", default=1067, type=int, help="TCP port to connect to for broadcasts") parser.add_argument( "--db-file", default=None, help="database file for local GUI settings") add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser(description="WAnD GUI") parser.add_argument("-n", "--name", default="test", help="server name, used to locate configuration file") parser.add_argument("-f", "--log-to-file", action="store_true", help="Save log output to file") parser.add_argument("-b", "--backup-dir", default="", type=str, help="directory containing backup copies of " "configuration files") add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser( description="ARTIQ data to InfluxDB bridge", epilog="Pattern matching works as follows. " "The default action on a key (dataset name) is to log it. " "Then the patterns are traversed in order and glob-matched " "with the key. " "Optional + and - pattern prefixes specify to either ignore or " "log keys matching the rest of the pattern. " "Default (in the absence of prefix) is to ignore. Last matched " "pattern takes precedence.") master_group = parser.add_argument_group("master") master_group.add_argument( "--server-master", default="::1", help="hostname or IP of the master to connect to") master_group.add_argument( "--port-master", default=3250, type=int, help="TCP port to use to connect to the master (default: %(default)s") master_group.add_argument( "--retry-master", default=5.0, type=float, help="retry timer for reconnecting to master") database_group = parser.add_argument_group("database") database_group.add_argument( "--baseurl-db", default="http://localhost:8086", help="base URL to access InfluxDB (default: %(default)s)") database_group.add_argument( "--user-db", default="", help="InfluxDB username") database_group.add_argument( "--password-db", default="", help="InfluxDB password") database_group.add_argument( "--database", default="db", help="database name to use") database_group.add_argument( "--table", default="lab", help="table name to use") filter_group = parser.add_argument_group("filter") filter_group.add_argument( "--pattern-file", default="influxdb_patterns.cfg", help="file to load the patterns from (default: %(default)s). " "If the file is not found, no patterns are loaded " "(everything is logged).") simple_network_args(parser, [("control", "control", 3248)]) add_common_args(parser) return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ core device " "RTIO analysis tool") add_common_args(parser) parser.add_argument("--device-db", default="device_db.py", help="device database file (default: '%(default)s')") parser.add_argument("-r", "--read-dump", type=str, default=None, help="read raw dump file instead of accessing device") parser.add_argument("-p", "--print-decoded", default=False, action="store_true", help="print raw decoded messages") parser.add_argument("-w", "--write-vcd", type=str, default=None, help="format and write contents to VCD file") parser.add_argument("-d", "--write-dump", type=str, default=None, help="write raw dump file") parser.add_argument("-u", "--vcd-uniform-interval", action="store_true", help="emit uniform time intervals between timed VCD " "events and show RTIO event interval (in SI " "seconds) and timestamp (in machine units) as " "separate VCD channels") return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ controller manager") add_common_args(parser) parser.add_argument("-s", "--server", default="::1", help="hostname or IP of the master to connect to") parser.add_argument("--port-notify", default=3250, type=int, help="TCP port to connect to for notifications") parser.add_argument("--port-logging", default=1066, type=int, help="TCP port to connect to for logging") parser.add_argument("--retry-master", default=5.0, type=float, help="retry timer for reconnecting to master") simple_network_args(parser, [("control", "control", 3249)]) return parser
def get_argparser(): parser = argparse.ArgumentParser(description="WAnD server") simple_network_args(parser, [ ("notify", "notifications", 3250), ("control", "control", 3251), ]) add_common_args(parser) parser.add_argument("-n", "--name", default="test", help="server name, used to locate configuration file") parser.add_argument("--simulation", action='store_true', help="run in simulation mode") parser.add_argument("--fast-mode-timeout", default=1800, type=int, help="fast mode timeout (s) (default: '%(default)s')") parser.add_argument("-b", "--backup-dir", default="", type=str, help="directory containing backup copies of " "configuration files") return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ core device " "management tool") add_common_args(parser) parser.add_argument("--device-db", default="device_db.py", help="device database file (default: '%(default)s')") parser.add_argument("-D", "--device", default=None, help="use specified core device address instead of " "reading device database") tools = parser.add_subparsers(dest="tool") tools.required = True # logging t_log = tools.add_parser("log", help="read logs and change log levels") subparsers = t_log.add_subparsers(dest="action") p_clear = subparsers.add_parser("clear", help="clear log buffer") p_set_level = subparsers.add_parser("set_level", help="set minimum level for messages to be logged") p_set_level.add_argument("level", metavar="LEVEL", type=str, help="log level (one of: OFF ERROR WARN INFO DEBUG TRACE)") p_set_uart_level = subparsers.add_parser("set_uart_level", help="set minimum level for messages to be logged " "to UART") p_set_uart_level.add_argument("level", metavar="LEVEL", type=str, help="log level (one of: OFF ERROR WARN INFO DEBUG TRACE)") # configuration t_config = tools.add_parser("config", help="read and change core device configuration") subparsers = t_config.add_subparsers(dest="action") subparsers.required = True p_read = subparsers.add_parser("read", help="read key from core device config") p_read.add_argument("key", metavar="KEY", type=str, help="key to be read from core device config") p_write = subparsers.add_parser("write", help="write key-value records to core " "device config") p_write.add_argument("-s", "--string", nargs=2, action="append", default=[], metavar=("KEY", "STRING"), type=str, help="key-value records to be written to core device " "config") p_write.add_argument("-f", "--file", nargs=2, action="append", type=str, default=[], metavar=("KEY", "FILENAME"), help="key and file whose content to be written to " "core device config") p_remove = subparsers.add_parser("remove", help="remove key from core device config") p_remove.add_argument("key", metavar="KEY", nargs=argparse.REMAINDER, default=[], type=str, help="key to be removed from core device config") subparsers.add_parser("erase", help="fully erase core device config") # booting t_boot = tools.add_parser("reboot", help="reboot the currently running firmware") t_hotswap = tools.add_parser("hotswap", help="load the specified firmware in RAM") t_hotswap.add_argument("image", metavar="IMAGE", type=argparse.FileType("rb"), help="runtime image to be executed") # profiling t_profile = tools.add_parser("profile", help="account for communications CPU time") subparsers = t_profile.add_subparsers(dest="action") subparsers.required = True p_start = subparsers.add_parser("start", help="start profiling") p_start.add_argument("--interval", metavar="MICROS", type=int, default=2000, help="sampling interval, in microseconds") p_start.add_argument("--hits-size", metavar="ENTRIES", type=int, default=8192, help="hit buffer size") p_start.add_argument("--edges-size", metavar="ENTRIES", type=int, default=8192, help="edge buffer size") p_stop = subparsers.add_parser("stop", help="stop profiling") p_save = subparsers.add_parser("save", help="save profile") p_save.add_argument("output", metavar="OUTPUT", type=argparse.FileType("w"), help="file to save profile to, in Callgrind format") p_save.add_argument("firmware", metavar="FIRMWARE", type=str, help="path to firmware ELF file") p_save.add_argument("--no-compression", dest="compression", default=True, action="store_false", help="disable profile compression") p_save.add_argument("--no-demangle", dest="demangle", default=True, action="store_false", help="disable symbol demangling") # misc debug t_debug = tools.add_parser("debug", help="specialized debug functions") subparsers = t_debug.add_subparsers(dest="action") subparsers.required = True p_allocator = subparsers.add_parser("allocator", help="show heap layout") return parser
def get_argparser(): parser = argparse.ArgumentParser( description="ARTIQ core device development tool", formatter_class=argparse.ArgumentDefaultsHelpFormatter) add_common_args(parser) parser.add_argument("-t", "--target", metavar="TARGET", type=str, default="kasli", help="target to build, one of: " "kc705 kasli sayma") parser.add_argument("-V", "--variant", metavar="VARIANT", type=str, default=None, help="variant to build, dependent on the target") parser.add_argument("-g", "--gateware", default=False, action="store_true", help="build/flash gateware, not just software") parser.add_argument("--args", metavar="ARGS", type=shlex.split, default=[], help="extra arguments for gateware/firmware build") parser.add_argument("-H", "--host", type=str, default="lab.m-labs.hk", help="SSH host where the development board is located") parser.add_argument("-J", "--jump", type=str, default=None, help="SSH host to jump through") parser.add_argument("-b", "--board", type=str, default="{board_type}-1", help="board to connect to on the development SSH host") parser.add_argument( "-B", "--board-file", type=str, default="/var/lib/artiq/boards/{board}", help="the board file containing the openocd initialization commands; " "it is also used as the lock file") parser.add_argument( "-s", "--serial", type=str, default="/dev/ttyUSB_{board}", help="TTY device corresponding to the development board") parser.add_argument( "-d", "--device", type=str, default="{board}", help="address or domain corresponding to the development board") parser.add_argument( "-w", "--wait", action="store_true", help="wait for the board to unlock instead of aborting the actions") parser.add_argument( "actions", metavar="ACTION", type=str, default=[], nargs="+", help="actions to perform, sequence of: " "build clean reset flash flash+log load connect hotswap") return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ core device " "management tool") add_common_args(parser) parser.add_argument("--device-db", default="device_db.py", help="device database file (default: '%(default)s')") parser.add_argument("-D", "--device", default=None, help="use specified core device address instead of " "reading device database") tools = parser.add_subparsers(dest="tool") tools.required = True # logging t_log = tools.add_parser("log", help="read logs and change log levels") subparsers = t_log.add_subparsers(dest="action") p_clear = subparsers.add_parser("clear", help="clear log buffer") p_set_level = subparsers.add_parser( "set_level", help="set minimum level for messages to be logged") p_set_level.add_argument( "level", metavar="LEVEL", type=str, help="log level (one of: OFF ERROR WARN INFO DEBUG TRACE)") p_set_uart_level = subparsers.add_parser( "set_uart_level", help="set minimum level for messages to be logged " "to UART") p_set_uart_level.add_argument( "level", metavar="LEVEL", type=str, help="log level (one of: OFF ERROR WARN INFO DEBUG TRACE)") # configuration t_config = tools.add_parser( "config", help="read and change core device configuration") subparsers = t_config.add_subparsers(dest="action") subparsers.required = True p_read = subparsers.add_parser("read", help="read key from core device config") p_read.add_argument("key", metavar="KEY", type=str, help="key to be read from core device config") p_write = subparsers.add_parser("write", help="write key-value records to core " "device config") p_write.add_argument("-s", "--string", nargs=2, action="append", default=[], metavar=("KEY", "STRING"), type=str, help="key-value records to be written to core device " "config") p_write.add_argument("-f", "--file", nargs=2, action="append", type=str, default=[], metavar=("KEY", "FILENAME"), help="key and file whose content to be written to " "core device config") p_remove = subparsers.add_parser("remove", help="remove key from core device config") p_remove.add_argument("key", metavar="KEY", nargs=argparse.REMAINDER, default=[], type=str, help="key to be removed from core device config") subparsers.add_parser("erase", help="fully erase core device config") # booting t_boot = tools.add_parser("reboot", help="reboot the currently running firmware") t_hotswap = tools.add_parser("hotswap", help="load the specified firmware in RAM") t_hotswap.add_argument("image", metavar="IMAGE", type=argparse.FileType("rb"), help="runtime image to be executed") # profiling t_profile = tools.add_parser("profile", help="account for communications CPU time") subparsers = t_profile.add_subparsers(dest="action") subparsers.required = True p_start = subparsers.add_parser("start", help="start profiling") p_start.add_argument("--interval", metavar="MICROS", type=int, default=2000, help="sampling interval, in microseconds") p_start.add_argument("--hits-size", metavar="ENTRIES", type=int, default=8192, help="hit buffer size") p_start.add_argument("--edges-size", metavar="ENTRIES", type=int, default=8192, help="edge buffer size") p_stop = subparsers.add_parser("stop", help="stop profiling") p_save = subparsers.add_parser("save", help="save profile") p_save.add_argument("output", metavar="OUTPUT", type=argparse.FileType("w"), help="file to save profile to, in Callgrind format") p_save.add_argument("firmware", metavar="FIRMWARE", type=str, help="path to firmware ELF file") p_save.add_argument("--no-compression", dest="compression", default=True, action="store_false", help="disable profile compression") p_save.add_argument("--no-demangle", dest="demangle", default=True, action="store_false", help="disable symbol demangling") # misc debug t_debug = tools.add_parser("debug", help="specialized debug functions") subparsers = t_debug.add_subparsers(dest="action") subparsers.required = True p_allocator = subparsers.add_parser("allocator", help="show heap layout") return parser
def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ CLI client") parser.add_argument("-s", "--server", default="::1", help="hostname or IP of the master to connect to") parser.add_argument("--port", default=None, type=int, help="TCP port to use to connect to the master") subparsers = parser.add_subparsers(dest="action") subparsers.required = True parser_add = subparsers.add_parser("submit", help="submit an experiment") parser_add.add_argument("-p", "--pipeline", default="main", type=str, help="pipeline to run the experiment in " "(default: %(default)s)") parser_add.add_argument("-P", "--priority", default=0, type=int, help="priority (higher value means sooner " "scheduling, default: %(default)s)") parser_add.add_argument("-t", "--timed", default=None, type=str, help="set a due date for the experiment") parser_add.add_argument("-f", "--flush", default=False, action="store_true", help="flush the pipeline before preparing " "the experiment") parser_add.add_argument("-R", "--repository", default=False, action="store_true", help="use the experiment repository") parser_add.add_argument("-r", "--revision", default=None, help="use a specific repository revision " "(defaults to head, ignored without -R)") parser_add.add_argument("-c", "--class-name", default=None, help="name of the class to run") add_common_args(parser) parser_add.add_argument("file", metavar="FILE", help="file containing the experiment to run") parser_add.add_argument("arguments", metavar="ARGUMENTS", nargs="*", help="run arguments") parser_delete = subparsers.add_parser("delete", help="delete an experiment " "from the schedule") parser_delete.add_argument("-g", action="store_true", help="request graceful termination") parser_delete.add_argument("rid", metavar="RID", type=int, help="run identifier (RID)") parser_set_dataset = subparsers.add_parser("set-dataset", help="add or modify a dataset") parser_set_dataset.add_argument("name", metavar="NAME", help="name of the dataset") parser_set_dataset.add_argument("value", metavar="VALUE", help="value in PYON format") persist_group = parser_set_dataset.add_mutually_exclusive_group() persist_group.add_argument("-p", "--persist", action="store_true", help="make the dataset persistent") persist_group.add_argument("-n", "--no-persist", action="store_true", help="make the dataset non-persistent") parser_del_dataset = subparsers.add_parser("del-dataset", help="delete a dataset") parser_del_dataset.add_argument("name", help="name of the dataset") parser_show = subparsers.add_parser( "show", help="show schedule, log, devices or datasets") parser_show.add_argument( "what", metavar="WHAT", choices=["schedule", "log", "ccb", "devices", "datasets"], help="select object to show: %(choices)s") subparsers.add_parser("scan-devices", help="trigger a device database (re)scan") parser_scan_repos = subparsers.add_parser( "scan-repository", help="trigger a repository (re)scan") parser_scan_repos.add_argument("--async", action="store_true", help="trigger scan and return immediately") parser_scan_repos.add_argument("revision", metavar="REVISION", default=None, nargs="?", help="use a specific repository revision " "(defaults to head)") parser_ls = subparsers.add_parser("ls", help="list a directory on the master") parser_ls.add_argument("directory", default="", nargs="?") return parser