## DebMirror Manager Actions Library # doAddRepo (Busy) # doEditRepo # doHelper # doHelperAdd # doHelperEditRepo # doHelperExitCodes # doHelperListRepos # doHelperQuietSyncRepos # doHelperRemoveRepo # doHelperRepoUsage # doHelperShowRepo # doHelperSyncRepos # doHelperTestRepo # doHelperUpdater # doLicense # doQuietSyncRepos # doRepoUsage # doShowRepo # doSyncRepos # doTestRepo # doUpdater function doAddRepo { local architecture local debinst local distribution local keyring local keyringurl local localrepo local method local prettyname local remotefqdn local remoterepo local section local sources echo -en "What is the FQDN for the repo server you want to mirror? " read -r remotefqdn [[ "${remotefqdn}" =~ ^([a-z0-9](-?[a-z0-9])*\.)+[a-z]{2,}$ ]] || funcError "Not a valid FQDN..." nslookup "${remotefqdn}" > /dev/null 2>&1 || funcError "FQDN does not resolve to an IP address..." echo -en "What is the name of the repo on ${remotefqdn} you want to mirror? " read -r remoterepo [[ "${remoterepo}" =~ ^[a-z0-9]+([a-z0-9-]*[a-z0-9])?$ ]] || funcError "Invalid repo name...\nMust use lowercase letter, digits and/or dash - (dash can not be the first or last character)..." echo -en "What is the name you want to use for the repo on your local mirror server ${localfqdn}?\n(Press ENTER to use ${remoterepo}) " read -r localrepo if [[ -z "${localrepo}" ]]; then localrepo="${remoterepo}" fi [[ "${localrepo}" =~ ^[a-z0-9]+([a-z0-9-]*[a-z0-9])?$ ]] || funcError "Invalid repo name...\nMust use lowercase letter, digits and/or dash - (dash can not be the first or last character)..." echo -en "What is the name of the section(s) on ${remotefqdn}/${remoterepo} that you want to mirror?\n(Use a comma , as a delimeter if you want to use more than one - no spaces) " read -r section [[ "${section}" =~ ^([a-z0-9]+([a-z0-9-]*[a-z0-9])?)(,([a-z0-9]+([a-z0-9-]*[a-z0-9])?))*$ ]] || funcError "Invalid section(s) name(s)...\nMust use lowercase letter, digits and/or dash - (dash can not be the first or last character)...\nYou can use a comma , as a delimiter for multiple sections, but no spaces..." echo -en "What is the name of the distribution(s) on ${remotefqdn}/${remoterepo} that you want to mirror?\n(Use a comma , as a delimeter if you want to use more than one - no spaces) " read -r distribution [[ "${distribution}" =~ ^([a-z0-9]+([a-z0-9-]*[a-z0-9])?)(,([a-z0-9]+([a-z0-9-]*[a-z0-9])?))*$ ]] || funcError "Invalid distribution(s) name(s)...\nMust use lowercase letter, digits and/or dash - (dash can not be the first or last character)...\nYou can use a comma , as a delimiter for multiple distributions, but no spaces..." echo -en "What hardware architecture(s) do you want to mirror? (Use a comma , as a delimeter\nif you want to use more than one - no spaces) " read -r architecture [[ "${architecture}" =~ ^([a-z0-9]+)(,[a-z0-9]+)*$ ]] || funcError "Invalid architecture string given...\nMust use lowercase letter, digits and/or dash - (dash can not be the first or last character)...\nYou can use a comma , as a delimiter for multiple architectures, but no spaces..." echo -en "Must we use HTTPS for the remote repo? (Y/n) " read -r -n 1 method if [[ -z "${method}" || "${method,,}" == "y" ]]; then echo "Using HTTPS..." method="https" else echo "Using HTTP..." method="http" fi echo -en "If this repo requires a GPG key then paste the URL to download it, or just press\nENTER if there is no GPG key. " read -r keyringurl if [[ -z "${keyringurl}" ]]; then echo "No keyring is being used..." keyring=false else echo "Downloading keyring file and saving it to /etc/debmirrorman/${localrepo}.gpg..." curl -sSLo "/etc/debmirrorman/${localrepo}.gpg" "${keyringurl}" || funcError "Failed to down ${keyringurl}..." keyring=true fi echo -en "Do you want to mirror the Source data and files (y/N) " read -r -n 1 sources if [[ -z "${sources}" || "${sources,,}" != "y" ]]; then echo "Not including Source data..." sources=false else echo "Including Source data..." sources=true fi echo -en "Do you want to mirror the Debian Install data (normally only needed when mirroring\nthe main Debian repos at deb.debian.org) (y/N) " read -r -n 1 debinst if [[ -z "${debinst}" || "${debinst,,}" != "y" ]]; then echo "Not including Debian Install data..." debinst=false else echo "Including Debian Install data..." debinst=true fi echo -en "Choose a memorable name that you can use to identify this repo in the future... " read -r prettyname echo "Writing configuration files..." echo "declare -a localrepos=(" >> "/etc/debmirrorman/settings.conf" || funcError "Failed to write /etc/debmirrorman/settings.conf" echo " \"${localrepo}\"" >> "/etc/debmirrorman/settings.conf" || funcError "Failed to write /etc/debmirrorman/settings.conf" echo ")" >> "/etc/debmirrorman/settings.conf" || funcError "Failed to write /etc/debmirrorman/settings.conf" echo "declare -A prettynames=(" >> "/etc/debmirrorman/settings.conf" || funcError "Failed to write /etc/debmirrorman/settings.conf" echo " [${localrepo}]=\"${prettyname}\"" >> "/etc/debmirrorman/settings.conf" || funcError "Failed to write /etc/debmirrorman/settings.conf" echo ")" >> "/etc/debmirrorman/settings.conf" || funcError "Failed to write /etc/debmirrorman/settings.conf" echo "## Details for ${prettyname}" > "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare remotefqdn=\"${remotefqdn}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare remoterepo=\"${remoterepo}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare section=\"${section}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare distribution=\"${distribution}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare architecture=\"${architecture}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare method=\"${method}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare keyring=${keyring}" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare keyringurl=\"${keyringurl}\"" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare sources=${sources}" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "declare debinst=${debinst}" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo "## This file was last updated on $(date)" >> "/etc/debmirrorman/${localrepo}.repo" || funcError "Failed to write /etc/debmirrorman/${localrepo}.repo" echo exit } function doEditRepo { echo "Edit Repo ${1}" exit } function doHelper { echo "Helper" exit } function doHelperAdd { echo "Helper Add" exit } function doHelperEditRepo { echo "Helper Edit" exit } function doHelperExitCodes { echo "${TITLE} Documentation - Exit Codes" echo echo "Use up and down arrows to scroll or press Q to exit" echo echo " No Errors" echo " 0 - Completed and exited with no errors" echo echo " Command Errors" echo " 1 - Command not valid" echo " 2 - Command does not support a local repo name" echo " 3 - Command requires a local repo name" echo " 4 - Local repo name is not valid" echo " 5 - Local repo name is not found in ${etcdirectory}/settings.conf" echo " 6 - Local repo file is not found in ${etcdirectory}" echo " 9 - Unknown error with local repo" echo echo " Help Errors" echo " 11 - No help documentation available for invalid command" echo " 12 - No help documentation available for command" echo echo " Configuration Errors" echo " 21 - ${etcdirectory}/settings.conf does not exist" echo " 22 - No \${localfqdn} defined in ${etcdirectory}/settings.conf" echo " 23 - Invalid \${localfqdn} defined in ${etcdirectory}/settings.conf" echo " 29 - Unknown error loading ${etcdirectory}/settings.conf" echo echo " Adding Repo Errors" echo " 31 - No local repo name given" echo " 32 - Given local repo name is invalid" echo " 33 - Given local repo name already exists in ${etcdirectory}/settings.conf" echo " 34 - There is already a file {localreponame}.repo in /etc/debmirrorman" echo " 35 - No pretty name given" echo " 36 - No remote FQDN given" echo " 37 - Given remote FQDN is invalid" echo " 38 - Given remote FQDN does not resolve to an IP address" echo " 39 - No remote repo name given" echo " 40 - Given remote repo name is invalid" echo " 41 - No section name given" echo " 42 - Given section name is invalid" echo " 43 - No distributions list given" echo " 44 - Given distributions list is invalid" echo " 45 - No architectures list given" echo " 46 - Given architectures list is invalid" echo " 47 - Given keyring URL is invalid" echo " 48 - Given keyring URL cannot be downloaded" } function doHelperListRepos { echo "Helper List" exit } function doHelperQuietSyncRepos { echo "Helper Silent Run" exit } function doHelperRemoveRepo { echo "Helper Remove" exit } function doHelperRepoUsage { echo "Helper Usage" exit } function doHelperShowRepo { echo "Helper Show" exit } function doHelperSyncRepos { echo "Helper Run" exit } function doHelperTestRepo { echo "Helper Dryrun" exit } function doHelperUpdater { echo "Helper Update" exit } function doLicense { echo "License" exit } function doListRepos { local diff local n local repo local reponamelength local reponamemaxlength reponamemaxlength=10 for repo in ${localrepos[@]}; do reponamelength=${#repo} [[ ${reponamelength} -gt ${reponamemaxlength} ]] && reponamemaxlength=${reponamelength} done diff=$((reponamemaxlength-7)) echo -n "Local Repo" for ((n=0; n<${diff}; n++)); do echo -n " " done echo "Pretty Name" echo for repo in ${localrepos[@]}; do reponamelength=${#repo} diff=$((reponamemaxlength-${reponamelength}+3)) echo -n "${repo}" for ((n=0; n<${diff}; n++)); do echo -n " " done echo "${prettynames[${repo}]}" done | sort echo exit } function doQuietSyncRepos { if [[ -z "${1}" ]]; then echo "Silent Run All Repos" else echo "Silent Run Repo ${1}" fi exit } function doRemoveRepo { local confirmation local repo="${1}" echo "Removing '${prettynames[${repo}]}'..." echo -n "This cannot be undone. Type REMOVE then press ENTER to continue... " read -r confirmation if [[ "${confirmation,,}" != "remove" ]]; then echo "Exiting without removing!" echo exit fi if [[ -f /etc/debmirrorman/${repo}.repo ]]; then echo "Deleting /etc/debmirrorman/${repo}.repo..." rm -f /etc/debmirrorman/${repo}.repo fi if [[ -f /etc/debmirrorman/${repo}.gpg ]]; then echo "Deleting /etc/debmirrorman/${repo}.gpg..." rm -f /etc/debmirrorman/${repo}.gpg fi echo "Writing /etc/debmirrorman/settings.conf..." localrepos+=("${repo}") localrepos=($(echo "${localrepos[@]}" | tr ' ' '\n' | sort | uniq -u)) echo "declare localfqdn=\"${localfqdn}\"" > /etc/debmirrorman/settings.conf echo "declare -a localrepos=(" >> /etc/debmirrorman/settings.conf for repo in ${localrepos[@]}; do echo " \"${repo}\"" >> /etc/debmirrorman/settings.conf done echo ")" >> /etc/debmirrorman/settings.conf echo "declare -A prettynames=(" >> /etc/debmirrorman/settings.conf for repo in ${localrepos[@]}; do echo " [${repo}]=\"${prettynames[${repo}]}\"" >> /etc/debmirrorman/settings.conf done echo ")" >> /etc/debmirrorman/settings.conf echo "DONE!" echo exit } function doRepoUsage { if [[ -z "${1}" ]]; then echo "Usage All Repos" else echo "Usage Repo ${1}" fi exit } function doShowRepo { echo "Show Repo ${1}" exit } function doSyncRepos { if [[ -z "${1}" ]]; then echo "Run All Repos" else echo "Run Repo ${1}" fi exit } function doTestRepo { echo "Dryrun Repo ${1}" exit } function doUpdater { echo "Updater" exit } function doVersion { echo "DebMirror Manager version ${VERSION}" echo exit }