Handlers
Handlers in MatrixCtl are used to handle the communication between the server and the Addons or to load config files.
YAML
Read and parse the configuration file with this module.
- class matrixctl.handlers.yaml.JinjaUndefined(hint=None, obj=missing, name=None, exc=<class 'jinja2.exceptions.UndefinedError'>)[source]
Bases:
UndefinedUse this class as undefined argument in a Jinja2 Template.
The class replaces every undefined template with an enpty string.
- class matrixctl.handlers.yaml.YAML(paths=None, server=None)[source]
Bases:
objectUse the YAML class to read and parse the configuration file(s).
-
DEFAULT_PATHS:
ClassVar[list[Path]] = [PosixPath('/etc/matrixctl/config'), PosixPath('/home/docs/.config/matrixctl/config')]
-
JINJA_PREDEFINED:
ClassVar[dict[str,str|int]] = {'default_api_concurrent_limit': 4, 'default_ssh_port': 22, 'home': '/home/docs', 'user': 'docs'}
- static apply_defaults(server)[source]
Apply defaults to the configuration.
- Return type:
- Parameters:
- server
matrixctl.structures.ConfigServer The configuration of a (home)server.
- server
- Returns:
- server
matrixctl.structures.ConfigServer The configuration of a (home)server with applied defaults.
- server
- get(*keys)[source]
Get a value from a config entry safely.
Usage
Pass strings, describing the path in the
self.__yamldictionary. Let’s say, you are looking for the synapse path:- Return type:
- Parameters:
- *keys
str A tuple of strings describing the values you are looking for.
- *keys
- Returns:
- answer
any The value of the entry you described.
- answer
Examples
from matrixctl.handlers.yaml import YAML yaml: YAML = YAML() port: int = yaml.get("server", "ssh", "port") print(port) # Output: 22
- static get_paths_to_config()[source]
Generate a tuple of path which may contain a configuration file. :rtype:
tuple[Path,...]Note
This function preserves the order. The priority of the user configuration in
XDG_CONFIG_HOMEis higher than the global configuration in/etc/matrixctl/. The priority of the file extensionyamlis greater than the priority of the file extensionyml.Warning
The paths returned by this function might not exist.
- Returns:
- config_paths
tupleofpathlib.Path A tuple of paths, which might contain a config file.
- config_paths
- get_server_config(paths, server)[source]
Read and concentrate the config in one dict.
The
servers: ...will be removed form the dict. A new entryserverwill be created, which represents the selected server.- Return type:
- Parameters:
- paths
Iterableofpathlib.Path The paths to the configfiles.
- server
str The selected server. (Default: “default”)
- paths
- Returns:
- server_config
matrixctl.typehints.Config The config for the selected server.
- server_config
Notes
When all files were empty or don’t exist, an empty dict will be returned.
- static read_from_file(yaml, path)[source]
Read the config from a YAML file and render the Jinja2 tmplates. :rtype:
ConfigNote
The Renderer does one pass. This means, you can only render templated strings but not the templated string of another templated string.
If the file was empty or does not exist, an empty dict will be returned.
- Parameters:
- yaml
ruamel.yaml.Yaml The yaml object.
- path
Path The path where the config file is located.
- yaml
- Returns:
- full_config
matrixctl.typehints.Config The full (with server name) config file as dict.
- full_config
-
DEFAULT_PATHS:
API
Get access to the API of your homeserver.
- class matrixctl.handlers.api.RequestBuilder(token, domain, path, scheme='https', subdomain='matrix', api_path='_synapse/admin', api_version='v2', data=None, json=None, content=None, method='GET', params={}, headers={}, concurrent_limit=4, timeout=5.0, success_codes=(200, 201, 202, 203, 204, 205, 206, 207, 226))[source]
Bases:
objectBuild the URL for an API request.
- class matrixctl.handlers.api.RequestStrategy(limit: int, step_size: int, concurrent_limit: int, offset: int, iterations: int)[source]
Bases:
NamedTupleUse this NamedTuple as request strategy data.
This NamedTuple is only used in this module.
- async matrixctl.handlers.api.async_worker(input_queue, output_queue)[source]
Use this coro as worker to make (a)synchronous request.
See also
RequestBuildermatrixctl.handlers.api.RequestBuilder
- Attributes:
- input_queue
asyncio.Queue The input queue, which provides the
RequestBuilder.- output_queue
asyncio.Queue The output queue, which gets the responses of there requests.
- input_queue
- async matrixctl.handlers.api.exec_async_request(request_config)[source]
Use this coro to generate and run workers and group the responses.
- Return type:
Response|list[Response]- Returns:
- responses
listofhttpx.Responseorhttpx.Response Depending on
concurrent_limitanrequest_config.
- responses
See also
RequestBuildermatrixctl.handlers.api.RequestBuilder
- Attributes:
- request_config
RequestBuilderorGenerator[RequestBuilder,None,None] An instance of an
RequestBuilderor a list ofRequestBuilder. If the function gets aRequestBuilder, the request will be synchronous. If it gets a Generator, the request will be asynchronous.- concurrent_limit
int The maximum of concurrent workers. (This information must be pulled from the config.)
- request_config
- matrixctl.handlers.api.generate_worker_configs(request_config, next_token, limit)[source]
Create workers for async requests (minus the already done sync request).
- Return type:
- Yields:
- request_config
matrixctl.handlers.api.RequestBuilder Yields a fully configured
RequestsBuilderfor every request that has to be done to get all entries.
- request_config
Notes
Warning
Call-By-Referencelike behavior! The paramlimitand theconcurrent_limitinrequest_configwill get changed in this function. Make sure to only use them after using this function!- Attributes:
- request_config
matrixctl.handlers.api.RequestBuilder An instance of an RequestBuilder from which was used for an initial synchronous request to get the first part of the data and the other two arguments from the response.
- next_token
int The value, which defines from where to start in the next request. You get this value from the response of an initial synchronous request.
- total
int The value which defines how many entries there are. You get this value from the response of an initial synchronous request.
- request_config
- async matrixctl.handlers.api.group_async_results(input_size, output_queue)[source]
Use this coro to group the requests afterwards in a single list.
- Return type:
- Returns:
- responses
listofhttpx.Responseorhttpx.Response Depending on
concurrent, it is ahttpx.Responseifconcurrentis true, otherwise it is alistofhttpx.Response.
- responses
- Attributes:
- input_size
int The number of items in the queue.
- output_queue
asyncio.Queue The output queue, which holds the responses of there requests.
- concurrentbool
When
True, make requests concurrently. WhenFalse, make requests synchronously.
- input_size
- matrixctl.handlers.api.preplan_request_strategy(limit, concurrent_limit, max_step_size=100)[source]
Use this functiona as helper for optimizing asynchronous requests.
- Return type:
- Returns:
- RequestStrategy
matrixctl.handlers.api.RequestStrategy A Named tuple with the RequestStrategy values.
- RequestStrategy
- Attributes:
- matrixctl.handlers.api.request(request_config)[source]
Make a (a)synchronous request to the synapse API and receive a response.
- Return type:
list[Response] |Response- Returns:
- response
httpx.Response Returns the response
- response
See also
RequestBuildermatrixctl.handlers.api.RequestBuilder
- Attributes:
- request_config
RequestBuilderorGenerator[RequestBuilder,None,None] An instance of an
RequestBuilderor a list ofRequestBuilder. If the function gets aRequestBuilder, the request will be synchronous. If it gets a Generator, the request will be asynchronous.- concurrent_limit
int The maximum of concurrent workers. (This information must be pulled from the config.)
- request_config
Ansible
Run a ansible playbook with this module.
Git (VCS)
Update and manage the synapse playbook repository with this module.
- class matrixctl.handlers.vcs.VCS(path)[source]
Bases:
objectUpdate and manage a repository.
- property datetime_last_pulled_commit: datetime
Get the datetime the commit was pulled last from git.
This is used to determine which messages will be produced in the table.
- Parameters:
- None
- Returns:
- datetime
datetime.datetime The datetime object.
- datetime
- log(since=None)[source]
Print a table of date, user and commit message since the last pull.
- Return type:
- Parameters:
- since
datetime.datetime,optional, default=None The datetime the last commit was puled.
- since
- Returns:
SSH
Run and evaluate commands on the host machine of your synapse server.
- class matrixctl.handlers.ssh.SSH(address, user=None, port=22)[source]
Bases:
objectRun and evaluate commands on the host machine of your synapse server.
- run_cmd(cmd)[source]
Run a command on the host machine and receive a response.
- Return type:
- Parameters:
- Returns:
- response
matrixctl.handlers.ssh.SSHResponse Receive
stdin,stdoutandstderras response.
- response
Table
Use this handler to generate and print tables.
- matrixctl.handlers.table.cells_to_str(part, none)[source]
Convert all cells to strings and format
Nonevalues.- Return type:
- Parameters:
- part
collections.abc.Sequenceofcollections.abc.Sequenceofstr Data or header, in which every cell will be to casted to to strings.
- none
str A string, which is used to replace
Nonewith the specific string.
- part
- Returns:
- matrixctl.handlers.table.find_newlines(data)[source]
Find newlines and return a dict with positions (key) and occurrences.
- Return type:
- Parameters:
- Returns:
Notes
The function only adds an entry to the dict, if there is at least one newline in a row.
- matrixctl.handlers.table.format_table_row(line, max_column_len)[source]
Format a table row into a
str.
- matrixctl.handlers.table.get_colum_length(data, headers)[source]
Transpose rows and find longest line.
- matrixctl.handlers.table.handle_newlines(part, newlines)[source]
Update and insert new lines.
- Return type:
- Parameters:
- Returns:
- matrixctl.handlers.table.newlines_in_row(row)[source]
Get the highest number of newlines per row.
The highest number of newlines for a row is used to determine in how many rows the row gets expanded, to get one row per newline - 1.
- matrixctl.handlers.table.table(table_data, table_headers=None, none='-', *, sep=True)[source]
Create a table from data and a optional headers.
- Return type:
- Parameters:
- table_data
collections.abc.Sequenceofcollections.abc.Sequenceofstr Data.
- table_headers
collections.abc.Sequenceofstr,Optional Headers.
- sepbool,
default=True True, when there should be a separator between every row of data.- none
str,default= “-” A string, which is used to replace
Nonewith the specific string.
- table_data
- Yields:
- table
str The table (row for row).
- table
Database
Talk to the the database.
- class matrixctl.handlers.db.DBConnectionBuilder(host: str, database: str, username: str, password: str, port: int = 5432, timeout: int = 10, scheme: str = 'postgresql')[source]
Bases:
NamedTupleBuild the URL for an API request.
- matrixctl.handlers.db.db_connect(yaml)[source]
Connect to a PostgreSQL database.
- Return type:
Iterator[Connection]- Parameters:
- yaml
matrixctl.handlers.yaml.YAML The configuration file handler.
- yaml
- Yields:
- conn
psycopg.Connection A new
Connectioninstance.
- conn
- matrixctl.handlers.db.ssh_tunnel(host, username, remote_port, port=22, *, enabled=True)[source]
Create an SSH tunnel.
- Return type:
- Parameters:
- host
str The remote host e.g.
127.0.0.1orhost.domain.tld.- username
str The username of the user.
- remote_port
int The port of the application, which should be tunneled.
- enabledbool, default:
True Trueif the tunnel should be enabled orFalseif not.- port
int, default: 22 The ssh port
- private_key
Pathorstr,optioal The path to the private key (Currently Disabled)
- host
- Yields:
Notes
The tunnel will only be created, when it is enabled. If the tunnel is disabled (
enabled = False), the function will yieldNoneinstead of the local bind port.Examples
with ssh_tunnel("127.0.0.1", myuser, 5432) as remote_port: print(f"The local bind port is: {local_bind_port}") # The local bind port is: 8765