{"id":21657503,"url":"https://github.com/voipgrid/cacofonisk","last_synced_at":"2025-10-12T09:14:34.791Z","repository":{"id":57416824,"uuid":"50498001","full_name":"VoIPGRID/cacofonisk","owner":"VoIPGRID","description":"Who's calling?","archived":false,"fork":false,"pushed_at":"2025-05-21T09:16:23.000Z","size":641,"stargazers_count":22,"open_issues_count":2,"forks_count":6,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-06-13T17:48:00.346Z","etag":null,"topics":["asterisk","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","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/VoIPGRID.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-01-27T09:54:33.000Z","updated_at":"2025-05-21T09:16:27.000Z","dependencies_parsed_at":"2025-06-13T17:34:45.309Z","dependency_job_id":"99ffbf58-083f-4345-a321-165fa32f8b42","html_url":"https://github.com/VoIPGRID/cacofonisk","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/VoIPGRID/cacofonisk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoIPGRID%2Fcacofonisk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoIPGRID%2Fcacofonisk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoIPGRID%2Fcacofonisk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoIPGRID%2Fcacofonisk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VoIPGRID","download_url":"https://codeload.github.com/VoIPGRID/cacofonisk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoIPGRID%2Fcacofonisk/sbom","scorecard":{"id":148795,"data":{"date":"2025-08-11","repo":{"name":"github.com/VoIPGRID/cacofonisk","commit":"6fa7d1e8102379ac27a48c148f141446823cab8e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":1,"reason":"Found 4/23 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":2,"reason":"3 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'","Warn: branch protection not enabled for branch 'release-0.7'","Warn: branch protection not enabled for branch 'release-0.6'","Warn: branch protection not enabled for branch 'release-0.5'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T10:03:03.252Z","repository_id":57416824,"created_at":"2025-08-16T10:03:03.252Z","updated_at":"2025-08-16T10:03:03.252Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279010964,"owners_count":26084837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["asterisk","python"],"created_at":"2024-11-25T09:26:41.381Z","updated_at":"2025-10-12T09:14:34.765Z","avatar_url":"https://github.com/VoIPGRID.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cacofonisk\n\nCacofonisk is a framework that connects to the Asterisk PBX, listens to events\non the Asterisk Management Interface (AMI) and tracks the status of calls\ncurrently in progress in Asterisk.\n\nCacofonisk takes a stream of AMI events as input and uses these to keep track\nof the channels currently active in Asterisk and how they are related. When\nsomething interesting happens to one of the channels, it will call a method on\na call state Reporter with interesting information about the call, like who is\nin the call, and a unique identifier.\n\nThis data can then be used to send webhooks regarding a call, to notify a\nperson who is being called, or to log calls being performed.\n\n## Status\n\nThis product is actively being developed and used at VoIPGRID.\n\n## Usage\n\n### Requirements\n\n- Python \u003e= 3.9\n- Panoramisk 1.x\n- Asterisk \u003e= 12\n\n### Installation\n\nCacofonisk is available on Pypi so you can easily install it with pip:\n\n```bash\n$ pip install cacofonisk\n```\n\nTo install the dependencies from source:\n\n```bash\n$ pip3 install -e .\n```\n\n### Running\n\nTo run Cacofonisk, you will need two things: a Runner and a Reporter.\n\nA Runner is a class which is responsible for passing AMI events to the\nCacofonisk. Two runners are included: an AmiRunner (which connects to the\nAsterisk Management Interface) and a FileRunner (which imports AMI events from\na JSON file).\n\nA Reporter is a class which takes the interesting data from Cacofonisk and does\nawesome things with it. You can find various Reporters in the `examples`\nfolder.\n\nTo create your own reporter, you can extend the BaseReporter class and\nimplement your own event handlers, like so:\n\n```python\nfrom cacofonisk import AmiRunner, BaseReporter\n\n\nclass ReportAllTheThings(BaseReporter):\n\n    def on_b_dial(self, caller, targets):\n        target_channels = [target.name for target in targets]\n        caller_number = caller.caller_id.num\n        print(\"{} is now calling {}\".format(\n            caller_number, ', '.join(target_channels),\n        ))\n\n    def on_up(self, caller, target):\n        target_number = target.caller_id.num\n        caller_number = caller.caller_id.num\n        print(\"{} is now in conversation with {}\".format(caller_number, target_number))\n\n    def on_hangup(self, caller, reason):\n        caller_number = caller.caller_id.num\n        print(\"{} is no longer calling (reason: {})\".format(caller_number, reason))\n\n\nreporter = ReportAllTheThings()\nrunner = AmiRunner(['tcp://username:password@127.0.0.1:5038'], reporter)\nrunner.run()\n```\n\nThis reporter can then be passed to a Runner of your choice to process AMI\nevents.\n\nFor more information about the parameters of the reporter, please see the docs\nin BaseReporter.\n\nYou can also listen for\n[UserEvents](https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+Application_UserEvent)\nusing the `on_user_event` function. This can be used to pass additional data\nfrom Asterisk to your Cacofonisk application.\n\n#### Running the tests\n\nTo run the test suite:\n\n```bash\n$ python3 -m unittest\n```\n\n## Contributing\n\nSee the [CONTRIBUTING.md](CONTRIBUTING.md) file on how to contribute to this project.\n\n## Contributors\n\nSee the [CONTRIBUTORS.md](CONTRIBUTORS.md) file for a list of contributors to the project.\n\n## Roadmap\n\n### Changelog\n\nThe changelog can be found in the [CHANGELOG.md](CHANGELOG.md) file.\n\n### In progress\n\nNo features are currently in progress.\n\n### Future\n\nNo features are currently scheduled. Have great ideas? Please don't hesitate to share them!\n\n## Get in touch with a developer\n\nIf you want to report an issue see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more info.\n\nWe will be happy to answer your other questions at opensource@wearespindle.com.\n\n## License\n\nCacofonisk is made available under the MIT license. See the [LICENSE file](LICENSE) for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoipgrid%2Fcacofonisk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoipgrid%2Fcacofonisk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoipgrid%2Fcacofonisk/lists"}