# Commands You can provide your own CLI commands for guillotina through a simple interface. ## Available commands * `serve`: run the HTTP REST API server (this is the default command if none given) * `shell`: drop into a shell with root object to manually work with * `create`: use cookiecutter to generate guillotina applications * `initialize-db`: databases are automatically initialized; however, you can use this command to manually do it * `testdata`: populate the database with test data from wikipedia * `run`: run a python script. The file must have a function `async def run(container):` * `gen-key`: generate cryptographic key for jwt, jwk * `dbvacuum`: run optimized vacuuming process to clean up deleted objects ## Command Options - * - `--config`: path to configuration file. `defaults to config.(yaml|json)` - `--profile`: profile Guillotina while it's running - `--profile-output`: where to save profiling output - `--monitor`: run with aiomonitor `requires aiomonitor` - `--line-profiler`: use line_profiler `requires line_profiler` - `--line-profiler-matcher`: fnmatch of module/function to profile `requires line_profiler` - `--line-profiler-output`: to store output in a file `requires line_profiler` - `--override`: Override configuration values, Example: `--override="root_user.password=foobar"` - serve: - `--host`: host to bind to - `--port`: port to bind to - `--asgi-server`: choose which ASGI server to run (uvicorn by default) - shell - create - `--template`: name of template to use - `--overwrite`: overwrite existing file - `--output`: where to save the file - initialize-db - testdata - `--per-node`: How many items to import per node - `--depth`: How deep to make the nodes - run - `--script`: path to script to run with `run` async function ## Running commands Guillotina provides two binaries to run commands through, `bin/guillotina` and a shortcut, `bin/g`. To run a command, it's just a positional argument on the running command:: ``` bin/g shell ``` ## Creating commands guillotina provides a simple API to write your own CLI commands. Here is a minimalistic example: ```python from guillotina.commands import Command class MyCommand(Command): def get_parser(self): parser = super(MyCommand, self).get_parser() # add command arguments here... return parser def run(self, arguments, settings, app): pass ``` Then, just add your command to your application's `app_settings` in the `__init__.py`: ```python app_settings = { "commands": { "mycommand": "my.package.commands.MyCommand" } } ``` ## Overridding configuration First off, you can use the `--override` setting for all commands to provide setting overrides in files. For example, `--override="root_user.password=foobar"`. Additionally, you can override configuration with environment variables. To override the root password like above, you would do: `G_root_user__password=foobar`. You can also override json data structures as well: ```bash export G_cors__allow_origin='["http://localhost:8080"]' ``` Use the double underscore(`__`) to designate nested json structure to assign values.