{"id":26508581,"url":"https://github.com/eval-agency/scriptscollection","last_synced_at":"2026-04-16T05:02:24.160Z","repository":{"id":253195574,"uuid":"840567295","full_name":"eVAL-Agency/ScriptsCollection","owner":"eVAL-Agency","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-05T14:26:14.000Z","size":404,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-19T09:54:20.660Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eVAL-Agency.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":"2024-08-10T03:20:32.000Z","updated_at":"2025-02-05T14:26:18.000Z","dependencies_parsed_at":"2025-01-26T05:27:40.635Z","dependency_job_id":null,"html_url":"https://github.com/eVAL-Agency/ScriptsCollection","commit_stats":null,"previous_names":["cdp1337/scriptscollection","eval-agency/scriptscollection"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eVAL-Agency%2FScriptsCollection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eVAL-Agency%2FScriptsCollection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eVAL-Agency%2FScriptsCollection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eVAL-Agency%2FScriptsCollection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eVAL-Agency","download_url":"https://codeload.github.com/eVAL-Agency/ScriptsCollection/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244717386,"owners_count":20498284,"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","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":[],"created_at":"2025-03-21T00:34:52.108Z","updated_at":"2026-04-16T05:02:24.153Z","avatar_url":"https://github.com/eVAL-Agency.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Scripts Collection\n\nA collection of useful scripts for various Linux distributions\n\n## Scripts\n\n| Category / Script | Supports |\n|-------------------|----------|\n| ![Python](.supplemental/images/icons/python.svg \"Python\") [Asset Tracking / Collect Asset Inventory (Grist) [Linux]](dist/inventory/linux_inventory_device_to_grist.py) [![README](.supplemental/images/icons/readme.svg \"README\")](dist/inventory/README.md) | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Asset Tracking / Collect Asset Inventory (Grist) [Windows]](dist/inventory/windows_inventory_device_to_grist.ps1) [![README](.supplemental/images/icons/readme.svg \"README\")](dist/inventory/README.md) | ![windows](.supplemental/images/icons/windows.svg \"Windows 10, 11\") |\n| ![Python](.supplemental/images/icons/python.svg \"Python\") [Asset Tracking / Collect Asset Inventory (SuiteCRM) [Linux]](dist/inventory/linux_inventory_device_to_suitecrm.py) [![README](.supplemental/images/icons/readme.svg \"README\")](dist/inventory/README.md) | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Asset Tracking / Collect Asset Inventory (SuiteCRM) [Windows]](dist/inventory/windows_inventory_device_to_suitecrm.ps1) [![README](.supplemental/images/icons/readme.svg \"README\")](dist/inventory/README.md) | ![windows](.supplemental/images/icons/windows.svg \"Windows 10, 11\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Backup / Backup Nextcloud Server [Linux]](dist/nextcloud/linux_nextcloud_backup.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Disks / Check Disk Health [Linux]](dist/disk/linux_check_disk_health.sh)  | ![archlinux](.supplemental/images/icons/archlinux.svg \"Arch\") ![centos](.supplemental/images/icons/centos.svg \"RHEL-All\") ![debian](.supplemental/images/icons/debian.svg \"Debian-All\") ![fedora](.supplemental/images/icons/fedora.svg \"RHEL-All\") ![linuxmint](.supplemental/images/icons/linuxmint.svg \"Debian-All\") ![redhat](.supplemental/images/icons/redhat.svg \"RHEL-All\") ![rocky](.supplemental/images/icons/rocky.svg \"RHEL-All\") ![ubuntu](.supplemental/images/icons/ubuntu.svg \"Debian-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Disks / Check Disk Health [Windows]](dist/disk/windows_check_disk_health.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows\") |\n| ![Python](.supplemental/images/icons/python.svg \"Python\") [Disks / Check Disk Space [Linux]](dist/disk/linux_check_disk_space.py)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Disks / Check Disk Space [Windows]](dist/disk/windows_check_disk_space.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows (All)\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Firewall / Check Firewall Status [Linux]](dist/firewall/linux_check_firewall.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Firewall / Check Firewall Status [Windows]](dist/firewall/windows_check_firewall.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Firewall / Firewall - Allow IP/Port [Linux]](dist/firewall/linux_util_firewall_allow.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Firewall / Firewall - Whitelist IP](dist/firewall/linux_util_firewall_whitelist_ip.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Firewall / Install Firewall [Linux]](dist/firewall/linux_install_firewall.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Licensing / Get Windows License Information](dist/windows/windows_inventory_get_windows_license.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows 8, 10, 11, Server 2016, Server 2019\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Memory / Check Memory Usage [Linux]](dist/memory/linux_check_memory_usage.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Memory / Check Memory Usage [Windows]](dist/memory/windows_check_memory_usage.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Monitoring / Install Graylog Sidecar [Linux]](dist/graylog/linux_install_graylog_sidecar.sh)  | ![centos](.supplemental/images/icons/centos.svg \"CentOS 8, 9\") ![debian](.supplemental/images/icons/debian.svg \"Debian 12\") ![redhat](.supplemental/images/icons/redhat.svg \"RHEL 8, 9\") ![rocky](.supplemental/images/icons/rocky.svg \"Rocky 8, 9\") ![ubuntu](.supplemental/images/icons/ubuntu.svg \"Ubuntu 24.04\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Monitoring / Install Zabbix Agent2 [Linux]](dist/zabbix/linux_install_zabbix_agent2.sh)  | ![centos](.supplemental/images/icons/centos.svg \"CentOS 8, 9\") ![debian](.supplemental/images/icons/debian.svg \"Debian 12\") ![redhat](.supplemental/images/icons/redhat.svg \"RHEL 8, 9\") ![rocky](.supplemental/images/icons/rocky.svg \"Rocky 8, 9\") ![ubuntu](.supplemental/images/icons/ubuntu.svg \"Ubuntu 24.04\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Monitoring / Install Zabbix Proxy [Linux]](dist/zabbix/linux_install_zabbix_proxy.sh)  | ![centos](.supplemental/images/icons/centos.svg \"CentOS 8, 9\") ![debian](.supplemental/images/icons/debian.svg \"Debian 12\") ![redhat](.supplemental/images/icons/redhat.svg \"RHEL 8, 9\") ![rocky](.supplemental/images/icons/rocky.svg \"Rocky 8, 9\") ![ubuntu](.supplemental/images/icons/ubuntu.svg \"Ubuntu 24.04\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Network Utility / Install net-diag utilities [Linux]](dist/net-diag/linux_install_net_diag.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Networking / Set Hostname and Restart [Windows]](dist/hostname/windows_set_hostname.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Repo / Switch Repo to Community [Proxmox]](dist/proxmox/linux_manage_proxmox_repo_community.sh)  | ![proxmox](.supplemental/images/icons/proxmox.svg \"Proxmox\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Security / Check Defender Status [Windows]](dist/defender/windows_check_defender_status.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Security / Install Firewall (UFW) [Linux]](dist/ufw/linux_install_ufw.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Security / Virtualmin Renew All SSL [Linux]](dist/virtualmin/renew-all-letsencrypt-certs.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [System Cleanup / Remove Bloatware in Win10 [Windows]](dist/windows/windows_debloat_win10.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows 10\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [System / Install 7zip [Linux]](dist/7zip/linux_install_7zip.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [System / Install rar [Linux]](dist/rar/linux_install_rar.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [System / Install unrar [Linux]](dist/rar/linux_install_unrar.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [System / Install unzip [Linux]](dist/zip/linux_install_unzip.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [System / Install zip [Linux]](dist/zip/linux_install_zip.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Bash/Shell](.supplemental/images/icons/bash.svg \"Bash/Shell\") [Updates / Check if Reboot Required [Linux]](dist/updates/linux_check_reboot_required.sh)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![PowerShell](.supplemental/images/icons/powershell.svg \"PowerShell\") [Updates / Check if Reboot Required [Windows]](dist/updates/windows_check_reboot_required.ps1)  | ![windows](.supplemental/images/icons/windows.svg \"Windows 10, 11\") |\n| ![Python](.supplemental/images/icons/python.svg \"Python\") [User Management / Authorize SSH Key [Linux]](dist/ssh/linux_util_ssh_authorize.py)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n| ![Python](.supplemental/images/icons/python.svg \"Python\") [User Management / Get SSH Public Key [Linux]](dist/ssh/linux_util_ssh_get_key.py)  | ![tux](.supplemental/images/icons/tux.svg \"Linux-All\") |\n\n## Install as Python Package\n\nThis project can be installed as a Python package directly from GitHub, providing access to some Python libraries.\n\n### Installation\n\n```bash\npip install git+https://github.com/eVAL-Agency/ScriptsCollection.git\n```\n\nFor development/editable installation:\n\n```bash\ngit clone https://github.com/eVAL-Agency/ScriptsCollection.git\ncd ScriptsCollection\npip install -e .\n```\n\n## Compile all scripts\n\nWill compile each script into a single distributable file with all dependencies included within.\n\n```bash\npython3 compile.py\n```\n\n## Script Metadata\n\nMost of the metadata is collected from the file header.\nTo ensure rendering, please ensure all file headers start with `# `,\nand separating lines contain a `#`.\n\nHeader scanning will stop as soon as an empty line is encountered.\n\nExample, this will **not** see the \"Supports\" section as a header field, and thus will not include it.\n\n```bash\n#!/bin/bash\n#\n# Some title\n\n# Supports:\n#    Debian 12\n```\n\nCorrect form includes a '#' to ensure the entire block is seen as the file header.\n\n```bash\n#!/bin/bash\n#\n# Some title\n#\n# Supports:\n#    Debian 12\n```\n\n### Script Header\n\nThe first non-empty line retrieved from the script will be used as the title, (one line only).\n\n### Syntax\n\nLists how to run the application to the end user, and gets saved in the help icon in TRMM.\n\n```bash\n#/bin/bash\n# ...\n# Syntax:\n#   --option1 - Short description of option 1\n#   --option2=... - Short description of option 2\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\nSyntax:\n\t--option1 - Short description of option 1\n\t--option2=... - Short description of option 2\n\"\"\"\n```\n\n#### Argument Parsing\n\nAdding `# compile:argparse` to the script will generate a dynamic argument parser for the script.\n\n(BASH only) Optionally, you can include the destination variable name before each argument\nto allow for dynamic generation of the argument parsing via `compile:argparse`.\n\nIn this example, passing `--noninteractive` will set the variable `NONINTERACTIVE` to `1`.\n\n(The compiler will filter out the prefix)\n\n```bash\n#/bin/bash\n# ...\n# Syntax:\n#   NONINTERACTIVE=--noninteractive - Run in non-interactive mode, (will not ask for prompts)\n#   VERSION=--version=... - Version of Zabbix to install DEFAULT=7.0\n#   ZABBIX_SERVER=--server=... - Hostname or IP of Zabbix server\n#   ZABBIX_AGENT_HOSTNAME=--hostname=... - Hostname of local device for matching with a Zabbix host entry\n# ...\n\n# compile:argparse\n```\n\nGenerates:\n\n```bash\n#/bin/bash\n# ...\n# Syntax:\n#   --noninteractive - Run in non-interactive mode, (will not ask for prompts)\n#   --version=... - Version of Zabbix to install DEFAULT=7.0\n#   --server=... - Hostname or IP of Zabbix server\n#   --hostname=... - Hostname of local device for matching with a Zabbix host entry\n# ...\n\n# Parse arguments\nNONINTERACTIVE=\"0\"\nVERSION=\"7.0\"\nZABBIX_SERVER=\"\"\nZABBIX_AGENT_HOSTNAME=\"\"\nwhile [ \"$#\" -gt 0 ]; do\n\tcase \"$1\" in\n\t\t--noninteractive) NONINTERACTIVE=1; shift 1;;\n\t\t--version=*) VERSION=\"${1#*=}\"; shift 1;;\n\t\t--server=*) ZABBIX_SERVER=\"${1#*=}\"; shift 1;;\n\t\t--hostname=*) ZABBIX_AGENT_HOSTNAME=\"${1#*=}\"; shift 1;;\n\t\t-h|--help) usage;;\n\tesac\ndone\nif [ -z \"$SOURCE\" ]; then\n\tusage\nfi\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\nDo something\n\nSyntax:\n\t--arg1=\u003cstr\u003e - Some parameter DEFAULT=yup\n\t--arg2=\u003cint\u003e - The SSH key to authorize DEFAULT=42\n\"\"\"\n\nimport argparse\n\n# ...\n\nparser = argparse.ArgumentParser(\n\tprog='scriptname.py',\n\tdescription='Does a thing')\n# compile:argparse\nargs = parser.parse_args()\n```\n\n#### Variable Type\n\nTo support Python, ensure a variable type is specified, like so:\n\n```python\n#!/usr/bin/env python3\n\"\"\"\nSyntax:\n\t--option1=\u003cstr\u003e - Short description of option 1\n\t--option2=\u003cint\u003e - Short description of option 2\n\"\"\"\n```\n\nArgument types in Bash are ignored and are for reference only.\n\n#### Defaults\n\nThe default value can be specified by appending `DEFAULT=(value)` to the argument, like so:\n\n```bash\n#/bin/bash\n# ...\n# Syntax:\n#   --option1=\u003cstr\u003e - Short description of option 1 DEFAULT=default_value\n#   --option2=\u003cint\u003e - Short description of option 2 DEFAULT=42\n```\n\n\n\n### TRMM Arguments\n\nLists the default arguments and their values to be used when running the script in TRMM.\n\nDOES support TRMM variable replacement for site, client, and agent.\nTo use these, wrap the variable in double curly braces, like so: `{{client.zabbix_hostname}}`\n\n```bash\n#/bin/bash\n# ...\n# TRMM Arguments:\n#   --option1\n#   --option2=something\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\nSyntax:\n\t--option1 - Short description of option 1\n\t--option2=... - Short description of option 2\n\"\"\"\n```\n\n### TRMM Environment\n\nBehaves the same as TRMM Arguments, but is used for environment variables.\n\n```bash\n#/bin/bash\n# ...\n# TRMM Environment:\n#   VAR1=something\n#   VAR2={{client.zabbix_hostname}}\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\nTRMM Environment:\n\tVAR1=something\n\tVAR2={{client.zabbix_hostname}}\n\"\"\"\n```\n\n### Supports\n\nLists the OS support for the script.\n\n```bash\n#/bin/bash\n# ...\n# Supports:\n#   Debian 12\n#   Ubuntu 24.04\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\nSupports:\n\tDebian 12\n\tUbuntu 24.04\n\"\"\"\n```\n\nDistros can be listed individually, or one of the group declarations for multiple distros.\n\n* Linux-All - All Linux-based distros (completely os-agnostic script)\n* Debian-All - Any Debian-based distro (Debian, Ubuntu, Mint, etc)\n* RHEL-All - Any Red Hat-based distro (RHEL, CentOS, Fedora, etc)\n* ArchLinux / arch\n* CentOS\n* Debian\n* Fedora\n* LinuxMint\n* RedHat / RHEL\n* Rocky / RockyLinux\n* SuSE / OpenSuSE\n* Ubuntu\n* Windows\n\n### Author Tag\n\n```bash\n#/bin/bash\n# ...\n# Author:\n#   Some Name \u003csome-email@domain.tld\u003e\n```\n\nalternative syntax:\n\n```bash\n#/bin/bash\n# ...\n# @AUTHOR  Some Name \u003csome-email@domain.tld\u003e\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\n@AUTHOR  Some Name \u003csome-email@domain.tld\u003e\n\"\"\"\n```\n\n### Category Tag\n\n```bash\n#/bin/bash\n# ...\n# Category:\n#   Some Category\n```\n\nalternative syntax:\n\n```bash\n#/bin/bash\n# ...\n# @CATEGORY  Some Category\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\nCategory:\n\tSome Category\n\"\"\"\n```\n\n### TRMM Timeout Setting\n\n```bash\n#/bin/bash\n# ...\n# @TRMM-TIMEOUT  120\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\n@TRMM-TIMEOUT  120\n\"\"\"\n```\n\n### Draft\n\nSet to true to skip finalizing of the script.\nThe script will still be generated to dist/, but will not be recorded in the README and TRMM metafile.\n\n```bash\n#/bin/bash\n# ...\n# Draft:\n#   True\n```\n\n```python\n#!/usr/bin/env python3\n\"\"\"\n...\nDraft:\n\tTrue\n\"\"\"\n```\n\n## Generative Code\n\nThe compiler can generate dynamic code based on script comments, notably for usage and arguments\n\n### Compile usage()\n\nWill generate a \"usage()\" function with the description and syntax arguments.\n\n```bash\n# compile:usage\n```\n\n\n## Scriptlets\n\nScriptlets are small pieces of reusable code that can be included in scripts during compilation.\nThis system provides a number of scripts, and more can be added by adding a `compile.sources` file in the root of the project\nwith the format:\n\n```\nscriptlet_type=github:repo_owner/repo_name\n```\n\nWhere `scriptlet_type` is the directory that contains the scriptlets to include.\n\nBy default `main` is used to download sources, but a different branch can be specified by appending `:branch_name`.\n\n### [ufw/install.sh](scriptlets/ufw/install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:ufw/install.sh\n```\n\n#### function install_ufw:\n\nInstall UFW\n\n\n### [io_github_lsferreira42/lib_ini.sh](scriptlets/io_github_lsferreira42/lib_ini.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:io_github_lsferreira42/lib_ini.sh\n```\n\n#### function ini_debug:\n\nPrint debug messages\n\n#### function ini_error:\n\nPrint error messages\n\n#### function ini_validate_section_name:\n\nValidate section name\n\n#### function ini_validate_key_name:\n\nValidate key name\n\n#### function ini_create_temp_file:\n\nCreate a secure temporary file\n\n#### function ini_trim:\n\nTrim whitespace from start and end of a string\n\n#### function ini_escape_for_regex:\n\nEscape special characters in a string for regex matching\n\n#### function ini_check_file:\n\n\n\n#### function ini_read:\n\n\n\n#### function ini_list_sections:\n\n\n\n#### function ini_list_keys:\n\n\n\n#### function ini_section_exists:\n\n\n\n#### function ini_add_section:\n\n\n\n#### function ini_write:\n\n\n\n#### function ini_remove_section:\n\n\n\n#### function ini_remove_key:\n\n\n\n#### function ini_get_or_default:\n\n\n\n#### function ini_import:\n\n\n\n#### function ini_to_env:\n\n\n\n#### function ini_key_exists:\n\n\n\n#### function ini_read_array:\n\n\n\n#### function ini_write_array:\n\n\n\n\n### [openjdk/install.sh](scriptlets/openjdk/install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:openjdk/install.sh\n```\n\n#### function install_openjdk:\n\nInstall OpenJDK from Eclipse Adoptium\n\nhttps://github.com/adoptium\n\n@arg $1 string OpenJDK version to install\n\nWill print the directory where OpenJDK was installed.\n\nCHANGELOG:\n2026.04.13 - Mute curl output\n2026.03.07 - Bugfix to fix 'path-jre//bin/java'\n2026.03.05 - Add support for update-alternatives / alternatives.\n2026.03.03 - Bugfix, return the correct JDK directory.\n2026.01.13 - Initial version\n\n\n### [steam/install-steamcmd.sh](scriptlets/steam/install-steamcmd.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:steam/install-steamcmd.sh\n```\n\n#### function install_steamcmd:\n\nInstall SteamCMD\n\nCHANGELOG:\n\n2025.12.16 - Ensure steam GPG key is readable by apt\n2025.11.09 - Switch to using download to support curl/wget abstraction\n2025.11.03 - Add support for Debian 13\n2024.12.23 - Add support for non-interactive acceptance of Steam license\n2024.12.22 - Initial version\n\n\n### [firewalld/install.sh](scriptlets/firewalld/install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:firewalld/install.sh\n```\n\n#### function install_firewalld:\n\nInstall firewalld\n\nCHANGELOG:\n2026.03.16 - Switch awk to use $NF for better support\n\n\n### [bz_eval_tui/print_header.sh](scriptlets/bz_eval_tui/print_header.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:bz_eval_tui/print_header.sh\n```\n\n#### function print_header:\n\nPrint a header message\n\nCHANGELOG:\n2025.11.09 - Port from _common to bz_eval_tui\n2024.12.25 - Initial version\n\n\n### [bz_eval_tui/prompt_text.sh](scriptlets/bz_eval_tui/prompt_text.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:bz_eval_tui/prompt_text.sh\n```\n\n#### function prompt_text:\n\nPrompt user for a text response\n\nArguments:\n--default=\"...\"   Default text to use if no response is given\n\nReturns:\ntext as entered by user\n\nCHANGELOG:\n2025.11.23 - Use is_noninteractive to handle non-interactive mode\n2025.01.01 - Initial version\n\n\n### [bz_eval_tui/prompt_yn.sh](scriptlets/bz_eval_tui/prompt_yn.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:bz_eval_tui/prompt_yn.sh\n```\n\n#### function prompt_yn:\n\nPrompt user for a yes or no response\n\nArguments:\n--invert            Invert the response (yes becomes 0, no becomes 1)\n--default-yes       Default to yes if no response is given\n--default-no        Default to no if no response is given\n-q                  Quiet mode (no output text after response)\n\nReturns:\n1 for yes, 0 for no (or inverted if --invert is set)\n\nCHANGELOG:\n2025.12.16 - Add text output for non-interactive and empty responses\n2025.11.23 - Use is_noninteractive to handle non-interactive mode\n2025.11.09 - Add -q (quiet) option to suppress output after prompt (and use return value)\n2025.01.01 - Initial version\n\n\n### [zabbix/repo-setup.sh](scriptlets/zabbix/repo-setup.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:zabbix/repo-setup.sh\n```\n\n#### function zabbix_repo_setup:\n\nSetup the Zabbix repo for this OS, shared between agent, agent2, server, and proxy.\n\n\n### [xvfb/install.sh](scriptlets/xvfb/install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:xvfb/install.sh\n```\n\n#### function install_xvfb:\n\nInstall Xvfb and (optionally) a daemon helper\n\nSyntax:\ninstall_xvfb [--no-daemon] [--display \u003cint\u003e] [--service \u003cname\u003e]\n\nChangelog:\n20260216 - Initial version\n\n\n### [_common/package_remove.sh](scriptlets/_common/package_remove.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/package_remove.sh\n```\n\n#### function package_remove:\n\nRemove a package with the system's package manager.\n\nUses Redhat's yum, Debian's apt-get, and SuSE's zypper.\n\nUsage:\n\n```syntax-shell\npackage_remove apache2\n```\n\n@param $1..$N string\nPackage, (or packages), to remove.  Accepts multiple packages at once.\n\n\n### [_common/setconfigfile_orappend.sh](scriptlets/_common/setconfigfile_orappend.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/setconfigfile_orappend.sh\n```\n\n#### function setconfigfile_orappend:\n\nUse sed to set a line in a config file\n\nIf the target line does not exist, it will simply get appended to the end\n\nArguments:\n$1 Line match\n$2 Line replace\n$3 filename\n\nExample:\nsetconfigfile_orappend \"^Password=.*\" \"Password=1234\" \"/etc/myapp/myapp.conf\"\n\n\nCHANGELOG:\n2025.04.10 - Escape '?' characters in the sed search\n\n\n### [_common/random_password.sh](scriptlets/_common/random_password.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/random_password.sh\n```\n\n#### function random_password:\n\nGenerate a random password, (using characters that are easy to read and type)\n\n\n### [_common/print_header.sh](scriptlets/_common/print_header.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/print_header.sh\n```\n\n### [_common/firewall_install.sh](scriptlets/_common/firewall_install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/firewall_install.sh\n```\n\n#### function firewall_install:\n\nInstall the system default firewall based on the OS type\n\nFor Debian/Ubuntu, this installs UFW\nFor RHEL/CentOS, this installs firewalld\nFor SUSE, this installs firewalld\nFor other OS types, this defaults to installing UFW\n\n\n### [_common/require_root.sh](scriptlets/_common/require_root.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/require_root.sh\n```\n\n### [_common/get_wan_ip.sh](scriptlets/_common/get_wan_ip.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/get_wan_ip.sh\n```\n\n#### function get_wan_ip:\n\nTry to retrieve the WAN IP of this device based on ipify.org\n\nCHANGELOG:\n2025.12.15 - Use cmd_exists to fix regression bug\n2025.11.23 - use which -s for cleaner checks\n2025.11.09 - Initial version\n\n\n### [_common/get_firewall.sh](scriptlets/_common/get_firewall.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/get_firewall.sh\n```\n\n#### function get_enabled_firewall:\n\nGet which firewall is enabled,\nor \"none\" if none located\n\n#### function get_available_firewall:\n\nGet which firewall is available on the local system,\nor \"none\" if none located\n\nCHANGELOG:\n2025.12.15 - Use cmd_exists to fix regression bug\n2025.04.10 - Switch from \"systemctl list-unit-files\" to \"which\" to support older systems\n\n\n### [_common/prompt_text.sh](scriptlets/_common/prompt_text.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/prompt_text.sh\n```\n\n#### function prompt_text:\n\nPrompt user for a text response\n\nArguments:\n--default=\"...\"   Default text to use if no response is given\n\nReturns:\ntext as entered by user\n\n\n### [_common/cmd_exists.sh](scriptlets/_common/cmd_exists.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/cmd_exists.sh\n```\n\n#### function cmd_exists:\n\nSimple wrapper to emulate `which -s`\n\nThe -s flag is not available on all systems, so this function\nprovides a consistent way to check for command existence\nwithout having to include '\u0026\u003e/dev/null' everywhere.\n\nReturns 0 on success, 1 on failure\n\nArguments:\n$1 - Command to check\n\nCHANGELOG:\n2025.12.15 - Initial version (for a regression fix)\n\n\n### [_common/firewall_allow.sh](scriptlets/_common/firewall_allow.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/firewall_allow.sh\n```\n\n#### function firewall_allow:\n\nscriptlet:_common/get_firewall.sh\n\nAdd an \"allow\" rule to the firewall in the INPUT chain\n\nArguments:\n--port \u003cport\u003e       Port(s) to allow\n--source \u003csource\u003e   Source IP to allow (default: any)\n--zone \u003czone\u003e       Zone to allow (default: public)\n--tcp|--udp         Protocol to allow (default: tcp)\n--proto \u003ctcp|udp\u003e   Protocol to allow (alternative method)\n--comment \u003ccomment\u003e (only UFW) Comment for the rule\n\nSpecify multiple ports with `--port '#,#,#'` or a range `--port '#:#'`\n\nCHANGELOG:\n2025.11.23 - Use return codes instead of exit to allow the caller to handle errors\n2025.04.10 - Add \"--proto\" argument as alternative to \"--tcp|--udp\"\n\n\n### [_common/download.sh](scriptlets/_common/download.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/download.sh\n```\n\n#### function download:\n\nSimple download utility function\n\nUses either cURL or wget based on which is available\n\nDownloads the file to a temp location initially, then moves it to the final destination\nupon a successful download to avoid partial files.\n\nReturns 0 on success, 1 on failure\n\nArguments:\n--no-overwrite       Skip download if destination file already exists\n\nCHANGELOG:\n2025.12.15 - Use cmd_exists to fix regression bug\n2025.12.04 - Add --no-overwrite option to allow skipping download if the destination file exists\n2025.11.23 - Download to a temp location to verify download was successful\n- use which -s for cleaner checks\n2025.11.09 - Initial version\n\n\n### [_common/os_version.sh](scriptlets/_common/os_version.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/os_version.sh\n```\n\n#### function os_version:\n\nGet the operating system version\n\nJust the major version number is returned\n\n\n### [_common/is_noninteractive.sh](scriptlets/_common/is_noninteractive.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/is_noninteractive.sh\n```\n\n#### function is_noninteractive:\n\nDetermine if the current shell session is non-interactive.\n\nChecks NONINTERACTIVE, CI, DEBIAN_FRONTEND, and TERM.\n\nReturns 0 (true) if non-interactive, 1 (false) if interactive.\n\nCHANGELOG:\n2025.12.16 - Remove TTY checks to avoid false positives in some environments\n2025.11.23 - Initial version\n\n\n### [_common/os.sh](scriptlets/_common/os.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/os.sh\n```\n\n#### function os:\n\nGet the operating system\n\nalmalinux, alpine, amzn, antergos, arch, archarm, arcolinux,\ncentos, clear-linux-os, clearos,\ndebian,\nelementary, endeavouros,\nfedora, freebsd,\ngentoo,\nkali,\nlinuxmint,\nmageia, manjaro,\nnixos,\nopensuse, ol,\npop,\nraspbian, rhel, rocky,\nscientific, slackware, sles,\nubuntu,\nvirtuozzo\n\n\n### [_common/os_like.sh](scriptlets/_common/os_like.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/os_like.sh\n```\n\n#### function os_like:\n\nCheck if the OS is \"like\" a certain type\n\nReturns 0 if true, 1 if false\n\nUsage:\nif os_like debian; then ... ; fi\n\n#### function os_like_debian:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_debian)\" -eq 1 ]; then ... ; fi\nif os_like_debian -q; then ... ; fi\n\n#### function os_like_ubuntu:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_ubuntu)\" -eq 1 ]; then ... ; fi\nif os_like_ubuntu -q; then ... ; fi\n\n#### function os_like_rhel:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_rhel)\" -eq 1 ]; then ... ; fi\nif os_like_rhel -q; then ... ; fi\n\n#### function os_like_suse:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_suse)\" -eq 1 ]; then ... ; fi\nif os_like_suse -q; then ... ; fi\n\n#### function os_like_arch:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_arch)\" -eq 1 ]; then ... ; fi\nif os_like_arch -q; then ... ; fi\n\n#### function os_like_bsd:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_bsd)\" -eq 1 ]; then ... ; fi\nif os_like_bsd -q; then ... ; fi\n\n#### function os_like_macos:\n\nCheck if the OS is \"like\" a certain type\n\nie: \"ubuntu\" will be like \"debian\"\n\nReturns 0 if true, 1 if false\nPrints 1 if true, 0 if false\n\nUsage:\nif [ \"$(os_like_macos)\" -eq 1 ]; then ... ; fi\nif os_like_macos -q; then ... ; fi\n\n\n### [_common/package_install.sh](scriptlets/_common/package_install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/package_install.sh\n```\n\n#### function package_install:\n\nInstall a package with the system's package manager.\n\nUses Redhat's yum, Debian's apt-get, and SuSE's zypper.\n\nUsage:\n\n```syntax-shell\npackage_install apache2 php7.0 mariadb-server\n```\n\n@param $1..$N string\nPackage, (or packages), to install.  Accepts multiple packages at once.\n\n\nCHANGELOG:\n2026.01.09 - Cleanup os_like a bit and add support for RHEL 9's dnf\n2025.04.10 - Set Debian frontend to noninteractive\n\n\n### [_common/prompt_yn.sh](scriptlets/_common/prompt_yn.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:_common/prompt_yn.sh\n```\n\n#### function prompt_yn:\n\nPrompt user for a yes or no response\n\nArguments:\n--invert            Invert the response (yes becomes 0, no becomes 1)\n--default-yes       Default to yes if no response is given\n--default-no        Default to no if no response is given\n\nReturns:\n1 for yes, 0 for no (or inverted if --invert is set)\n\n\n### [proton/install.sh](scriptlets/proton/install.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:proton/install.sh\n```\n\n#### function install_proton:\n\nInstall Glorious Eggroll's Proton fork on a requested version\n\nhttps://github.com/GloriousEggroll/proton-ge-custom\n\nWill install Proton into /opt/script-collection/GE-Proton${VERSION}\nwith its pfx directory in /opt/script-collection/GE-Proton${VERSION}/files/share/default_pfx\n\n@arg $1 string Proton version to install\n\nCHANGELOG:\n2025.11.23 - Use download scriptlet for downloading\n2024.12.22 - Initial version\n\n\n### [yum/repo_excludepkg.sh](scriptlets/yum/repo_excludepkg.sh)\n\nTo include this scriptlet:\n\n```bash\n# scriptlet:yum/repo_excludepkg.sh\n```\n\n#### function yum_repo_excludepkg:\n\nDisable a package from a given yum repo\n\n\n### [steam/steamcmd_get_app_details.py](scriptlets/steam/steamcmd_get_app_details.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.steam.steamcmd_get_app_details import *\n```\n\n### [steam/steamcmd_parse_manifest.py](scriptlets/steam/steamcmd_parse_manifest.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.steam.steamcmd_parse_manifest import *\n```\n\n#### function steamcmd_parse_manifest:\n\nParses a SteamCMD manifest file content and returns a dictionary\nwith the all the relevant information.\n\nExample format of content to parse:\n\n\"2131400\"\n{\n\t\"common\"\n\t{\n\t\t\"name\"\t\t\"VEIN Dedicated Server\"\n\t\t\"type\"\t\t\"Tool\"\n\t\t\"parent\"\t\t\"1857950\"\n\t\t\"ReleaseState\"\t\t\"released\"\n\t\t\"oslist\"\t\t\"windows,linux\"\n\t\t\"osarch\"\t\t\"64\"\n\t\t\"osextended\"\t\t\"\"\n\t\t\"icon\"\t\t\"7573f431d9ecd0e9dc21f4406f884b92152508fd\"\n\t\t\"clienticon\"\t\t\"b5de75f7c5f84027200fdafe0483caaeb80f7dbe\"\n\t\t\"clienttga\"\t\t\"6012ea81d68607ad0dfc5610e61f17101373c1fd\"\n\t\t\"freetodownload\"\t\t\"1\"\n\t\t\"associations\"\n\t\t{\n\t\t}\n\t\t\"gameid\"\t\t\"2131400\"\n\t}\n\t\"extended\"\n\t{\n\t\t\"gamedir\"\t\t\"\"\n\t}\n\t\"config\"\n\t{\n\t\t\"installdir\"\t\t\"VEIN Dedicated Server\"\n\t\t\"launch\"\n\t\t{\n\t\t\t\"0\"\n\t\t\t{\n\t\t\t\t\"executable\"\t\t\"VeinServer.exe\"\n\t\t\t\t\"type\"\t\t\"default\"\n\t\t\t\t\"config\"\n\t\t\t\t{\n\t\t\t\t\t\"oslist\"\t\t\"windows\"\n\t\t\t\t}\n\t\t\t\t\"description_loc\"\n\t\t\t\t{\n\t\t\t\t\t\"english\"\t\t\"VEIN Dedicated Server\"\n\t\t\t\t}\n\t\t\t\t\"description\"\t\t\"VEIN Dedicated Server\"\n\t\t\t}\n\t\t\t\"1\"\n\t\t\t{\n\t\t\t\t\"executable\"\t\t\"VeinServer.sh\"\n\t\t\t\t\"type\"\t\t\"default\"\n\t\t\t\t\"config\"\n\t\t\t\t{\n\t\t\t\t\t\"oslist\"\t\t\"linux\"\n\t\t\t\t}\n\t\t\t\t\"description_loc\"\n\t\t\t\t{\n\t\t\t\t\t\"english\"\t\t\"VEIN Dedicated Server\"\n\t\t\t\t}\n\t\t\t\t\"description\"\t\t\"VEIN Dedicated Server\"\n\t\t\t}\n\t\t}\n\t\t\"uselaunchcommandline\"\t\t\"1\"\n\t}\n\t\"depots\"\n\t{\n\t\t\"228989\"\n\t\t{\n\t\t\t\"config\"\n\t\t\t{\n\t\t\t\t\"oslist\"\t\t\"windows\"\n\t\t\t}\n\t\t\t\"depotfromapp\"\t\t\"228980\"\n\t\t\t\"sharedinstall\"\t\t\"1\"\n\t\t}\n\t\t\"228990\"\n\t\t{\n\t\t\t\"config\"\n\t\t\t{\n\t\t\t\t\"oslist\"\t\t\"windows\"\n\t\t\t}\n\t\t\t\"depotfromapp\"\t\t\"228980\"\n\t\t\t\"sharedinstall\"\t\t\"1\"\n\t\t}\n\t\t\"2131401\"\n\t\t{\n\t\t\t\"config\"\n\t\t\t{\n\t\t\t\t\"oslist\"\t\t\"windows\"\n\t\t\t}\n\t\t\t\"manifests\"\n\t\t\t{\n\t\t\t\t\"public\"\n\t\t\t\t{\n\t\t\t\t\t\"gid\"\t\t\"3422721066391688500\"\n\t\t\t\t\t\"size\"\t\t\"13373528354\"\n\t\t\t\t\t\"download\"\t\t\"4719647568\"\n\t\t\t\t}\n\t\t\t\t\"experimental\"\n\t\t\t\t{\n\t\t\t\t\t\"gid\"\t\t\"5376672931011513884\"\n\t\t\t\t\t\"size\"\t\t\"14053570688\"\n\t\t\t\t\t\"download\"\t\t\"4881399680\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\"2131402\"\n\t\t{\n\t\t\t\"config\"\n\t\t\t{\n\t\t\t\t\"oslist\"\t\t\"linux\"\n\t\t\t}\n\t\t\t\"manifests\"\n\t\t\t{\n\t\t\t\t\"public\"\n\t\t\t\t{\n\t\t\t\t\t\"gid\"\t\t\"4027172715479418364\"\n\t\t\t\t\t\"size\"\t\t\"14134939630\"\n\t\t\t\t\t\"download\"\t\t\"4869512928\"\n\t\t\t\t}\n\t\t\t\t\"experimental\"\n\t\t\t\t{\n\t\t\t\t\t\"gid\"\t\t\"643377871134354986\"\n\t\t\t\t\t\"size\"\t\t\"14712396815\"\n\t\t\t\t\t\"download\"\t\t\"4982816608\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\"branches\"\n\t\t{\n\t\t\t\"public\"\n\t\t\t{\n\t\t\t\t\"buildid\"\t\t\"20727232\"\n\t\t\t\t\"timeupdated\"\t\t\"1762674215\"\n\t\t\t}\n\t\t\t\"experimental\"\n\t\t\t{\n\t\t\t\t\"buildid\"\t\t\"20729593\"\n\t\t\t\t\"description\"\t\t\"Bleeding-edge updates\"\n\t\t\t\t\"timeupdated\"\t\t\"1762704776\"\n\t\t\t}\n\t\t}\n\t\t\"privatebranches\"\t\t\"1\"\n\t}\n}\n\n:param manifest_content: str, content of the SteamCMD manifest file\n:return: dict, parsed manifest data\n\n\n### [steam/steamcmd_check_app_update.py](scriptlets/steam/steamcmd_check_app_update.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.steam.steamcmd_check_app_update import *\n```\n\n#### function steamcmd_check_app_update:\n\n\n\n\n### [suitecrm/suitecrmsync.py](scriptlets/suitecrm/suitecrmsync.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.suitecrm.suitecrmsync import *\n```\n\n#### function __init__:\n\n\n\n#### function update:\n\nPatch/update a record in SuiteCRM\n\n:param object_type:\n:param object_id:\n:param data:\n:return\n\n#### function create:\n\ncreate a record in SuiteCRM\n:param object_type:\n:param data:\n:return\n\n#### function find:\n\n:param object_type:\n:param filters:\n:param operator:\n:param fields:\n:return:\n\n\n### [bz_eval_tui/print_header.py](scriptlets/bz_eval_tui/print_header.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.bz_eval_tui.print_header import *\n```\n\n### [bz_eval_tui/prompt_text.py](scriptlets/bz_eval_tui/prompt_text.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.bz_eval_tui.prompt_text import *\n```\n\n### [bz_eval_tui/table.py](scriptlets/bz_eval_tui/table.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.bz_eval_tui.table import *\n```\n\n#### function __init__:\n\nInitialize the table with the columns to display\n:param columns:\n\n#### function add:\n\n\n\n#### function render:\n\nRender the table with the given list of services\n\n:param services: Services[]\n:return:\n\n\n### [bz_eval_tui/prompt_yn.py](scriptlets/bz_eval_tui/prompt_yn.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.bz_eval_tui.prompt_yn import *\n```\n\n### [_common/cmd.py](scriptlets/_common/cmd.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets._common.cmd import *\n```\n\n#### function __init__:\n\n\n\n#### function json:\n\nGet the output of the command decoded as JSON\n:return:\n\n#### function _exec:\n\n\n\n\n### [_common/get_wan_ip.py](scriptlets/_common/get_wan_ip.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets._common.get_wan_ip import *\n```\n\n### [_common/firewall_remove.py](scriptlets/_common/firewall_remove.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets._common.firewall_remove import *\n```\n\n### [_common/firewall_allow.py](scriptlets/_common/firewall_allow.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets._common.firewall_allow import *\n```\n\n### [_common/require_root.py](scriptlets/_common/require_root.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets._common.require_root import *\n```\n\n### [_common/get_firewall.py](scriptlets/_common/get_firewall.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets._common.get_firewall import *\n```\n\n### [org_python/venv_path_include.py](scriptlets/org_python/venv_path_include.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.org_python.venv_path_include import *\n```\n\n### [ssh/get_user_public_key.py](scriptlets/ssh/get_user_public_key.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.ssh.get_user_public_key import *\n```\n\n### [ssh/get_user_authorized_keys.py](scriptlets/ssh/get_user_authorized_keys.py)\n\nTo include this scriptlet:\n\n```python\n# from scriptlets.ssh.get_user_authorized_keys import *\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feval-agency%2Fscriptscollection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feval-agency%2Fscriptscollection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feval-agency%2Fscriptscollection/lists"}