{"id":39282803,"url":"https://github.com/subatiq/kittypaws","last_synced_at":"2026-01-18T01:04:07.478Z","repository":{"id":64997785,"uuid":"574156417","full_name":"subatiq/kittypaws","owner":"subatiq","description":"A tool for simulating destructive behavior of production infrastructure","archived":false,"fork":false,"pushed_at":"2024-07-23T16:46:59.000Z","size":298,"stargazers_count":3,"open_issues_count":6,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-07-24T12:28:24.139Z","etag":null,"topics":["destruction","plugin-system","quality-assurance","reliability","tool"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/subatiq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-04T15:49:38.000Z","updated_at":"2024-07-23T16:47:03.000Z","dependencies_parsed_at":"2024-04-18T08:29:52.704Z","dependency_job_id":"d14f0f14-87be-4aa6-9565-cb833713528c","html_url":"https://github.com/subatiq/kittypaws","commit_stats":{"total_commits":43,"total_committers":2,"mean_commits":21.5,"dds":"0.37209302325581395","last_synced_commit":"acc6bfe6ec079f70bda2826a84e062a4362703d5"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/subatiq/kittypaws","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subatiq%2Fkittypaws","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subatiq%2Fkittypaws/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subatiq%2Fkittypaws/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subatiq%2Fkittypaws/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/subatiq","download_url":"https://codeload.github.com/subatiq/kittypaws/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subatiq%2Fkittypaws/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28525472,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"ssl_error","status_checked_at":"2026-01-18T00:39:39.467Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["destruction","plugin-system","quality-assurance","reliability","tool"],"created_at":"2026-01-18T01:04:07.374Z","updated_at":"2026-01-18T01:04:07.458Z","avatar_url":"https://github.com/subatiq.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](docs/promo/logo_full_bg.svg)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"GitHub release (latest by date)\" src=\"https://img.shields.io/github/v/release/subatiq/kittypaws?color=yellow\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/subatiq/kittypaws?color=yellow\u0026style=for-the-badge\"\u003e\n  \u003cimg alt=\"Gitlab code coverage\" src=\"https://img.shields.io/gitlab/coverage/subatiq/kittypaws/master?style=for-the-badge\"\u003e\n\u003c/p\u003e\n\nA tool for simulating destructive behavior of production infrastructure\n\nWIP mode. Yet works for a few months in our company (doesn't mean it's stable).\n\n## Usage\n\nPaws looks for config at `${PAWS_HOME}/paws.yml` path by default, but path to config can be specified after run command.\n\nBy default `PAWS_HOME=~/.kittypaws`.\n\nUsing cargo:\n```bash\ncargo run -- run config.yml\n```\n\nUsing distributive:\n```bash\npaws run config.yml\n```\n\n## Plugins\n\n### Plugin management\n\nPlugins are stored at `${PAWS_HOME}/plugins/`, which is `~/.kittypaws/plugins/` by default.\n\n#### Install plugin\n\nInstall `subatiq/kittypaws-deathloop` plugin from github using `master` branch and save it by the name of `deathloop`:\n\n```bash\npaws install subatiq/kittypaws-deathloop master deathloop\n```\n\nInstall `subatiq/kittypaws-deathloop` plugin from github using `master` branch and save it by the default name of `kittypaws-deathloop`:\n\n```bash\npaws install subatiq/kittypaws-deathloop master\n```\n\n#### Uninstall plugin\n\n```bash\npaws uninstall plugin-name\n```\n\nUse plugin name by which it was saved.\n\n#### List installed plugins\n\n```bash\npaws list\n```\n\n### How to write a new plugin\n\nPlugins are stored in `~/.kittypaws/plugins/` each in a folder named after plugin.\n\n#### Python\n\nInside the folder there should be `main.py` with the `run` function:\n\n```python\ndef run(config: Dict[str, str]) -\u003e None:\n   pass\n```\n\n#### Bash\n\nInside the folder there should be `run.sh`:\n\n```bash\nconfig_field1=${config_field1:-default_value}\n\necho config_field1\n```\n\nKittypaws will load it if plugin name is in the config and run with specified frequency.\n\n### Known plugins\n\n#### Dropper\nDrops connection to a certain IP address. Works with Ubuntu-based docker containers\\\nhttps://github.com/subatiq/kittypaws-dropper\n\n#### Deathloop\nSimply restarts target container\\\nhttps://github.com/subatiq/kittypaws-deathloop\n\n#### Time burglar\nBreaks time sync on the host\\\nhttps://github.com/subatiq/kittypaws-timeburglar\n\n#### Shelly Plug\nRemotely turn off and on power on [Shelly Plug](https://www.shelly.com/de/products/shelly-plug-s-gen3) (Tested on S model only) to simulate a power outage\nhttps://github.com/invian/kittypaws-shelly-plug\n\n\n### Configuration structure\n\n```yaml\nplugins:\n- name: plugin01\n  options:\n    config01: yes\n    config02: 42\n  ...\n\n- name: plugin01:\n  options:\n    config03: yes\n    config02: 44\n  ...\n```\n\n### Run duration\n\nYou can specify if the test run should stop after some time. To configure it, add\n\n```yaml\nduration: \u003cDuration in ISO 8601 format\u003e\n```\n\nto the root of the config.\n\nExample:\n\n```yaml\nduration: P1D\nplugins:\n- name: example\n  ...\n```\n\n### Startup configuration\n\nPlugins can start executing their tasks immediately, or after some time. You can configure them to wait for their interval first or wait for a specific delay and then continue to work normally.\n\n#### Instant (hot) start\n\nConfig example:\n```yaml\n- name: \u003cplugin_name\u003e:\n  ...\n  startup: hot\n```\n\n#### Wait for the interval first (cold start)\n\nIntervals configuration is described below.\n\nConfig example:\n```yaml\n- name: \u003cplugin_name\u003e:\n  ...\n  startup: cold  # works by default\n  frequency:\n    max: PT1M\n    min: PT30S\n```\n\nHere first plugin run will be executed after random interval.\n\n\n#### Delayed start\n\nConfig example:\n```yaml\n- name: \u003cplugin_name\u003e:\n  ...\n  startup: PT5S\n```\n\nWith this config plugin will start after waiting 5 seconds, then it will only wait for random intervals between runs.\n\n### Interval configuration\n\nTime durations in config comply with ISO 8601.\nPlugins can run in different intervals or once. To let kitty know how often you want them to run add this to plugin config:\n\n#### Random intervals\n\nConfig example:\n```yaml\n- name: \u003cplugin_name\u003e:\n  ...\n  frequency:\n    min: PT30S\n    max: PT1M\n```\n\n#### Fixed intervals\n\nConfig example:\n```yaml\n- name: \u003cplugin_name\u003e:\n  ...\n  frequency: PT1M\n```\n\n#### Run once\n\nUsed as default\n\nConfig example:\n```yaml\n- name: \u003cplugin_name\u003e:\n  ...\n  frequency: once # or do not put it in config at all, it's default\n```\n\n---\n\nGo get these bugs, Tiger!\n\n![](https://cdn.discordapp.com/attachments/694259726619246674/1065994810210652180/image.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsubatiq%2Fkittypaws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsubatiq%2Fkittypaws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsubatiq%2Fkittypaws/lists"}