{"id":25999549,"url":"https://github.com/muckamuck/stackility","last_synced_at":"2025-10-07T00:33:08.247Z","repository":{"id":57470996,"uuid":"96112356","full_name":"muckamuck/stackility","owner":"muckamuck","description":"Simple tool to create CloudFormation stacks","archived":false,"fork":false,"pushed_at":"2022-07-16T19:57:59.000Z","size":110,"stargazers_count":8,"open_issues_count":3,"forks_count":3,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-09-25T15:54:42.188Z","etag":null,"topics":["aws-cloudformation","boto3","cloudformation-stacks","python","python27","python3","vpc"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/muckamuck.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}},"created_at":"2017-07-03T13:12:28.000Z","updated_at":"2022-01-25T01:27:45.000Z","dependencies_parsed_at":"2022-09-10T02:02:27.509Z","dependency_job_id":null,"html_url":"https://github.com/muckamuck/stackility","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/muckamuck/stackility","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckamuck%2Fstackility","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckamuck%2Fstackility/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckamuck%2Fstackility/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckamuck%2Fstackility/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/muckamuck","download_url":"https://codeload.github.com/muckamuck/stackility/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muckamuck%2Fstackility/sbom","scorecard":{"id":667112,"data":{"date":"2025-08-11","repo":{"name":"github.com/muckamuck/stackility","commit":"99c88a314bffdd226b8216204d6d00492ca672fb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"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":"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":"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":"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","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":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: 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":"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'"],"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":"Vulnerabilities","score":7,"reason":"3 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-m87m-mmvp-v9qm","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: PYSEC-2018-49 / GHSA-rprw-h62v-c2w7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T18:27:08.513Z","repository_id":57470996,"created_at":"2025-08-21T18:27:08.513Z","updated_at":"2025-08-21T18:27:08.513Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278703580,"owners_count":26031204,"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-06T02:00:05.630Z","response_time":65,"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":["aws-cloudformation","boto3","cloudformation-stacks","python","python27","python3","vpc"],"created_at":"2025-03-05T18:29:13.354Z","updated_at":"2025-10-07T00:33:08.218Z","avatar_url":"https://github.com/muckamuck.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Stackility\nDescription: a utility for creating, updating, listing and deleting AWS\nCloudFormation stacks. Also, the utility can be used for determining the\ndrift status of CloudFormation stacks.\n\n#### Usage:\n```\nstackility upsert [OPTIONS]\n\n  The main reason we have arrived here. This is the entry-point for the\n  utility to create/update a CloudFormation stack.\n\nOptions:\n  -v, --version TEXT         code version\n  -s, --stack TEXT           stack name\n  -i, --ini TEXT             INI file with needed information  [required]\n  -d, --dryrun               dry run, generate a change set report\n  -y, --yaml                 YAML template (deprecated - YAMLness is now\n                             detected at run-time)\n  --no-poll                  Start the stack work but do not poll\n  -w, --work-directory TEXT  Start in the given working directory\n  --help                     Show this message and exit.\n\nSee the *Properties* section below for a description of the INI file format.\n```\n\n```\nstackility delete [OPTIONS]\n\n  Delete the given CloudFormation stack.\n\nOptions:\n  -s, --stack TEXT    [required]\n  -r, --region TEXT\n  -f, --profile TEXT\n  --help              Show this message and exit.\n```\n\n```\n stackility list [OPTIONS]\n\n  List all the CloudFormation stacks in the given region.\n\nOptions:\n  -r, --region TEXT\n  -f, --profile TEXT\n  --help              Show this message and exit.\n```\n\n```\nstackility drift [OPTIONS]\n\n  Produce a CloudFormation drift report for the given stack.\n\nOptions:\n  -s, --stack TEXT    stack name  [required]\n  -r, --region TEXT   region where the stack lives\n  -f, --profile TEXT  AWS profile to access resources\n  --help              Show this message and exit.\n```\n\n#### Properties:\nThe INI file fed to the ```upsert``` command has the followning sections:\n\n**[environment]:**\nThe environment for the creation/update of a CloudFormation stack. These are the following \nelements of this section:\n\n* bucket - an S3 bucket where the template can be uploaded *[required]*\n* template - the name of the CloudFormation to be used in the operation *[required]*\n* stack_name - the name of the stack. If this element is not present then the\n```--stack``` argument must be given *[optional]*\n* region - specify the target region for this stack *[optional]*\n* profile - the credentials profile to be used *[optional]*\n\n**[tags]:** - key/value pairs that will be created as tags on the stack and\nsupported resources.\n\n**[parameters]:** - key/value pairs that will be injected as parameter(s) for the\nstack. You can, of course, enter the values as text. However, there are two\nspecial ways to specify the value in this section:\n\n* [ask] - this will ask for (and not echo) the values when a stack upsert is\ndone (example below). \n* [ssm:\u003cSSM-PARAMETER\u003e] - specify a parameter key that will be used to retrieve\nthe value from [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html)\n\n**[meta-parameters]:** - (optional) if this section exists in the INI file it is assumed\nthat the template file given in the ```[environment]``` section is a [Jinja2](http://jinja.pocoo.org/docs/)\ntemplate file. The given template is rendered with the key/value pairs injected before the upload to the S3\nbucket.\n\n**[analysis]:** - (experimental) if this section exists in the INI file then\n[CloudFormation Validator](https://github.com/rubelw/cloudformation-validator) is used to \nperform static analysis on the given template. Items in this section:\n\n* enforced - true | false, if *true* then stack create/update is aborted when errors are found\n  else if *false* the analysis is only advisory.\n\n#### Example parameters file:\n```\n[environment]\ntemplate=template.json\nbucket=account-cf-artifacts-bucket\nstack_name=example-stack\nregion=us-west-2\n\n[tags]\nOWNER=nobody@gmail.com\nPROJECT=Stackility Examples\nTHE_DATA=important\nName=example-stack\n\n[parameters]\ntheCIDR=10.22.0.0/16\nsubnetCIDROne=10.22.10.0/24\nbar=some value\ndb_password=[ask]\napi_key=[ssm:api_key]\n\n[meta-parameters]\nfood=pizza\ndrink=beer\n\n[analysis]\nenforced=false\n```\n\n#### Example invocations:\n```stackility upsert --ini vpc_stack.ini --region us-east-2```\n\n* use the template in vpc_stack.ini to create a VPC in the us-east-2 region.\n\n```stackility delete --stack example-stack --region us-east-2```\n\n* tear down the example-stack stack from us-east-2\n\n```stackility list --region us-east-2```\n\n* list the CloudFormation stacks in us-east-2\n\n```stackility drift --stack example-stack --region us-east-2```\n\n* Generate a CloudFormation drift report in us-east-2\n\n#### Environment notes:\nBy default the utility polls the status of stack operation every 30 seconds. If\nneeded ```CSU_POLL_INTERVAL``` can be set to a number of seconds to override the \npoll interval\n\n---\n\n#### Development notes:\n\nDo some work on the thing:\n```bash\nvirtualenv stkvenv\n. stkenv/bin/activate\npip install --editable .\n```\n\nPublish the thing:\n```bash\npython setup.py sdist bdist_wheel\ntwine upload dist/*\n```\n\n#### TODO:\n\n* print CloudFormation Outputs at the end of the upsert command\n* investigate giving an IAM role, something like the profile  selection\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuckamuck%2Fstackility","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuckamuck%2Fstackility","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuckamuck%2Fstackility/lists"}