# Command Line Client for Tinode This is a scriptable command line chat client. It's written in Python and can be used to extend Tinode using [gRPC](https://grpc.io) [API](../pbx/). Python 2.7 or 3.4+ is required. PIP 9.0.1 or newer is required. Install dependencies: ``` $ python -m pip install -r requirements.txt ``` Run the client from the command line: ``` python tn-cli.py --login-basic=alice:alice123 ``` If you are updating an existent installation, make sure the `tinode_grpc` version matches the [server](../server/) version. Upgrade `tinode_grpc` if needed: ``` python -m pip install --upgrade tinode_grpc==X.XX.XX ``` where `X.XX.XX` is the version number which must match the server version number. The client takes optional parameters: * `--host` is the address of the gRPC server to connect to; default `localhost:16060`. * `--web-host` is the address of Tinode web server, used for file uploads only; default `localhost:6060`. * `--ssl` the server requires a secure connection (SSL) * `--ssl-host` the domain name to use for SNI if different from the `--host` domain name. * `--login-basic` is the `login:password` to be authenticated with. * `--login-token` is the token to be authenticated with. * `--login-cookie` direct the client to read the token from the cookie file `.tn-cli-cookie` generated during an earlier login. * `--no-login` do not login even if cookie file is present; this is the default in non-interactive (scripted) mode. * `--no-cookie` do not save cookie on successful login; this is the default in non-interactive (scripted) mode. * `--api-key` web API key for file uploads; default `AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K` * `--load-macros` path to a macro file. * `--verbose` log incoming and outgoing messages as JSON. * `--background` start interactive session in background; non-interactive sessions are always started in background. If multiple `login-XYZ` are provided, `login-cookie` is considered first, then `login-token` then `login-basic`. Authentication with token (and cookie) is much faster than with the username-password pair. ## Commands Type ` -h` for help See some of these commands in use in the [sample-script.txt](sample-script.txt). Try it as ``` python tn-cli.py < sample-script.txt ``` ### Local (non-networking) * `.await` - issue a gRPC call and wait for completion, optionally assign result to a variable. * `.delmark` - use custom delete marker instead of default `DEL!`; needed when some value is to be removed rather than set to blank. * `.exit` - terminate execution and exit the CLI; also `.quit`. * `.log` - write a value of a variable to `stdout`. * `.must` - issue a gRPC call and wait for completion, optionally assign result to a variable; raise an exception if result is not a success. * `.quit` - terminate execution and exit the CLI; also `.exit`. * `.sleep` - suspend the process for a number of milliseconds. * `.use` - set default user (on_behalf_of user) or topic. * `.verbose` - toggle logging verbosity. ### gRPC calls * `acc` - create or modify an account * `login` - authenticate current session * `sub` - subscribe to topic * `leave` - detach or unsubscribe from topic * `pub` - post message to topic * `get` - query topic for metadata or messages * `set` - update topic metadata * `del` - delete message(s), topic, subscription, or user * `note` - send notification * `file` - upload or download large file out of band ### HTTP requests * `upload` - (deprecated, use `file`) upload file out of band ### Macros Macros are high-level wrappers for series of gRPC calls. Currently, the following macros are [available](macros.py): * `chacs` - change default permissions/acs for a user (requires root privileges) * `chcred` - add or delete a credential for a user (requires root privileges) * `passwd` - set user's password (requires root privileges) * `resolve` - resolve login and print the corresponding user id * `useradd` - create a new user account * `userdel` - delete user account (requires root privileges) * `usermod` - modify user account (requires root privileges) * `thecard` - print user's public and private info (requires root privileges) You can define your own macros in [macros.py](macros.py) or create a separate python module (you can load it via `--load-macros`). Refer to [macros.py](macros.py) for examples. ## Connecting to secure (HTTPS) server If the server is configured to use TLS, i.e. running as `httpS://my-server.example.com/`, the gRPC endpoint also uses the same SSL certificate. In that case add the `--ssl` option. If you want to connect to the secure gRPC endpoint over a local network or under a different name i.e. as `localhost` instead of `my-server.example.com` in this example, you must specify the SSL domain name to use, otherwise the server will not be able to find the right SSL certificate: ``` python tn-cli.py --host=localhost:6001 --ssl --ssl-host=my-server.example.com ``` The `--ssl-host` option makes the connection susceptible to the [Man-in-the-middle attack](https://en.wikipedia.org/wiki/Man-in-the-middle_attack), so don't do it over public networks. ## Crash on shutdown Python 3.6 sometimes crashes on shutdown with a message `Fatal Python error: PyImport_GetModuleDict: no module dictionary!`. That happens because Python is buggy: https://bugs.python.org/issue26153