diff --git a/scripts/cloudron-support b/scripts/cloudron-support index 808351abe..3a3bb754a 100755 --- a/scripts/cloudron-support +++ b/scripts/cloudron-support @@ -2,151 +2,146 @@ set -eu -o pipefail -# This script collects diagnostic information to help debug server related issues -# It also enables SSH access for the cloudron support team - -PASTEBIN="https://paste.cloudron.io" -OUT="/tmp/cloudron-support.log" -LINE="\n========================================================\n" -CLOUDRON_SUPPORT_PUBLIC_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWS+930b8QdzbchGljt3KSljH9wRhYvht8srrtQHdzg support@cloudron.io" -HELP_MESSAGE=" -This script collects diagnostic information to help debug server related issues. - - Options: - --owner-login Login as owner - --enable-remote-access Enable SSH Remote Access for the Cloudron support team - --help Show this message -" - -# We require root +# scripts requires root if [[ ${EUID} -ne 0 ]]; then echo "This script should be run as root. Run with sudo" exit 1 fi -enableSSH="false" +readonly PASTEBIN="https://paste.cloudron.io" +readonly LINE="\n========================================================\n" +readonly HELP_MESSAGE=" + Cloudron Support and Diagnostics Tool -args=$(getopt -o "" -l "help,enable-ssh,enable-remote-access,admin-login,owner-login" -n "$0" -- "$@") -eval set -- "${args}" + Options: + --enable-remote-access Enable SSH Remote Access for the Cloudron support team + --send-diag Collects server diagnostics and uploads it to ${PASTEBIN} + --owner-login Login as owner + --help Show this message +" -while true; do - case "$1" in - --help) echo -e "${HELP_MESSAGE}"; exit 0;; - --enable-remote-access) - # fall through - ;& - --enable-ssh) - enableSSH="true"; - shift;; - --admin-login) - # fall through - ;& - --owner-login) - admin_username=$(mysql -NB -uroot -ppassword -e "SELECT username FROM box.users WHERE role='owner' AND username IS NOT NULL AND active=1 ORDER BY creationTime LIMIT 1" 2>/dev/null) - admin_password=$(pwgen -1s 12) - dashboard_domain=$(mysql -NB -uroot -ppassword -e "SELECT value FROM box.settings WHERE name='dashboard_domain'" 2>/dev/null) - mysql -NB -uroot -ppassword -e "INSERT INTO box.settings (name, value) VALUES ('ghosts_config', '{\"${admin_username}\":\"${admin_password}\"}') ON DUPLICATE KEY UPDATE name='ghosts_config', value='{\"${admin_username}\":\"${admin_password}\"}'" 2>/dev/null - echo "Login at https://my.${dashboard_domain} as ${admin_username} / ${admin_password} . This password may only be used once." - exit 0 - ;; - --) break;; - *) echo "Unknown option $1"; exit 1;; - esac -done +function enable_remote_access() { + local -r cloudron_support_public_key="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWS+930b8QdzbchGljt3KSljH9wRhYvht8srrtQHdzg support@cloudron.io" + local -r ssh_user="cloudron-support" + local -r keys_file="/home/cloudron-support/.ssh/authorized_keys" -# check if at least 10mb root partition space is available -if [[ "`df --output="avail" / | sed -n 2p`" -lt "10240" ]]; then - echo "No more space left on /" - echo "This is likely the root case of the issue. Free up some space and also check other partitions below:" - echo "" - df -h - echo "" - echo "To recover from a full disk, follow the guide at https://docs.cloudron.io/troubleshooting/#recovery-after-disk-full" - exit 1 -fi - -# check for at least 5mb free /tmp space for the log file -if [[ "`df --output="avail" /tmp | sed -n 2p`" -lt "5120" ]]; then - echo "Not enough space left on /tmp" - echo "Free up some space first by deleting files from /tmp" - exit 1 -fi - -if [[ "${enableSSH}" == "true" ]]; then - ssh_port=$(cat /etc/ssh/sshd_config | grep "Port " | sed -e "s/.*Port //") - - ssh_user="cloudron-support" - keys_file="/home/cloudron-support/.ssh/authorized_keys" - - echo -e $LINE"SSH"$LINE >> $OUT - echo "Username: ${ssh_user}" >> $OUT - echo "Port: ${ssh_port}" >> $OUT - echo "Key file: ${keys_file}" >> $OUT - - echo -n "Enabling ssh access for the Cloudron support team..." + echo -n "Enabling Remote Access for the Cloudron support team..." mkdir -p $(dirname "${keys_file}") # .ssh does not exist sometimes touch "${keys_file}" # required for concat to work - if ! grep -q "${CLOUDRON_SUPPORT_PUBLIC_KEY}" "${keys_file}"; then - echo -e "\n${CLOUDRON_SUPPORT_PUBLIC_KEY}" >> "${keys_file}" + if ! grep -q "${cloudron_support_public_key}" "${keys_file}"; then + echo -e "\n${cloudron_support_public_key}" >> "${keys_file}" chmod 600 "${keys_file}" chown "${ssh_user}" "${keys_file}" fi echo "Done" +} - exit 0 -fi +function owner_login() { + local -r owner_username=$(mysql -NB -uroot -ppassword -e "SELECT username FROM box.users WHERE role='owner' AND username IS NOT NULL AND active=1 ORDER BY creationTime LIMIT 1" 2>/dev/null) + local -r owner_password=$(pwgen -1s 12) + local -r dashboard_domain=$(mysql -NB -uroot -ppassword -e "SELECT value FROM box.settings WHERE name='dashboard_domain'" 2>/dev/null) + mysql -NB -uroot -ppassword -e "INSERT INTO box.settings (name, value) VALUES ('ghosts_config', '{\"${owner_username}\":\"${owner_password}\"}') ON DUPLICATE KEY UPDATE name='ghosts_config', value='{\"${owner_username}\":\"${owner_password}\"}'" 2>/dev/null + echo "Login at https://my.${dashboard_domain} as ${owner_username} / ${owner_password} . This password may only be used once." +} -echo -n "Generating Cloudron Support stats..." +function send_diag() { + local -r log="/tmp/cloudron-support.log" -# clear file -rm -rf $OUT + echo -n "Generating Cloudron Support stats..." -echo -e $LINE"Linux"$LINE >> $OUT -uname -nar &>> $OUT + rm -rf $log -echo -e $LINE"Ubuntu"$LINE >> $OUT -lsb_release -a &>> $OUT + echo -e $LINE"Linux"$LINE >> $log + uname -nar &>> $log -echo -e $LINE"Dashboard Domain"$LINE >> $OUT -mysql -NB -uroot -ppassword -e "SELECT value FROM box.settings WHERE name='dashboard_domain'" &>> $OUT 2>/dev/null || true + echo -e $LINE"Ubuntu"$LINE >> $log + lsb_release -a &>> $log -echo -e $LINE"Docker containers"$LINE >> $OUT -if ! timeout --kill-after 10s 15s docker ps -a &>> $OUT 2>&1; then - echo -e "Docker is not responding" >> $OUT -fi + echo -e $LINE"Dashboard Domain"$LINE >> $log + mysql -NB -uroot -ppassword -e "SELECT value FROM box.settings WHERE name='dashboard_domain'" &>> $log 2>/dev/null || true -echo -e $LINE"Filesystem stats"$LINE >> $OUT -df -h &>> $OUT + echo -e $LINE"Docker containers"$LINE >> $log + if ! timeout --kill-after 10s 15s docker ps -a &>> $log 2>&1; then + echo -e "Docker is not responding" >> $log + fi -echo -e $LINE"Appsdata stats"$LINE >> $OUT -du -hcsL /home/yellowtent/appsdata/* &>> $OUT || true + echo -e $LINE"Filesystem stats"$LINE >> $log + df -h &>> $log -echo -e $LINE"Boxdata stats"$LINE >> $OUT -du -hcsL /home/yellowtent/boxdata/* &>> $OUT + echo -e $LINE"Appsdata stats"$LINE >> $log + du -hcsL /home/yellowtent/appsdata/* &>> $log || true -echo -e $LINE"Backup stats (possibly misleading)"$LINE >> $OUT -du -hcsL /var/backups/* &>> $OUT || true + echo -e $LINE"Boxdata stats"$LINE >> $log + du -hcsL /home/yellowtent/boxdata/* &>> $log -echo -e $LINE"System daemon status"$LINE >> $OUT -systemctl status --lines=100 box mysql unbound cloudron-syslog nginx collectd docker &>> $OUT + echo -e $LINE"Backup stats (possibly misleading)"$LINE >> $log + du -hcsL /var/backups/* &>> $log || true -echo -e $LINE"Box logs"$LINE >> $OUT -tail -n 100 /home/yellowtent/platformdata/logs/box.log &>> $OUT + echo -e $LINE"System daemon status"$LINE >> $log + systemctl status --lines=100 box mysql unbound cloudron-syslog nginx collectd docker &>> $log -echo -e $LINE"Interface Info"$LINE >> $OUT -ip addr &>> $OUT + echo -e $LINE"Box logs"$LINE >> $log + tail -n 100 /home/yellowtent/platformdata/logs/box.log &>> $log -echo -e $LINE"Firewall chains"$LINE >> $OUT -iptables -L &>> $OUT -has_ipv6=$(cat /proc/net/if_inet6 >/dev/null 2>&1 && echo "yes" || echo "no") -echo -e "IPv6: ${has_ipv6}" >> $OUT -[[ "${has_ipv6}" == "yes" ]] && ip6tables -L &>> $OUT + echo -e $LINE"Interface Info"$LINE >> $log + ip addr &>> $log -echo "Done" + echo -e $LINE"Firewall chains"$LINE >> $log + iptables -L &>> $log + has_ipv6=$(cat /proc/net/if_inet6 >/dev/null 2>&1 && echo "yes" || echo "no") + echo -e "IPv6: ${has_ipv6}" >> $log + [[ "${has_ipv6}" == "yes" ]] && ip6tables -L &>> $log -echo -n "Uploading information..." -paste_key=$(curl -X POST ${PASTEBIN}/documents --silent --data-binary "@$OUT" | python3 -c "import sys, json; print(json.load(sys.stdin)['key'])") -echo "Done" + echo "Done" -echo -e "\nPlease email the following link to support@cloudron.io : ${PASTEBIN}/${paste_key}" + echo -n "Uploading information..." + paste_key=$(curl -X POST ${PASTEBIN}/documents --silent --data-binary "@$log" | python3 -c "import sys, json; print(json.load(sys.stdin)['key'])") + echo "Done" + + echo -e "\nPlease email the following link to support@cloudron.io : ${PASTEBIN}/${paste_key}" +} + +function check_disk_space() { + # check if at least 10mb root partition space is available + if [[ "`df --output="avail" / | sed -n 2p`" -lt "10240" ]]; then + echo "No more space left on /" + echo "This is likely the root case of the issue. Free up some space and also check other partitions below:" + echo "" + df -h + echo "" + echo "To recover from a full disk, follow the guide at https://docs.cloudron.io/troubleshooting/#recovery-after-disk-full" + exit 1 + fi + + # check for at least 5mb free /tmp space for the log file + if [[ "`df --output="avail" /tmp | sed -n 2p`" -lt "5120" ]]; then + echo "Not enough space left on /tmp" + echo "Free up some space first by deleting files from /tmp" + exit 1 + fi +} + +check_disk_space + +args=$(getopt -o "" -l "admin-login,enable-ssh,enable-remote-access,help,owner-login,send-diag" -n "$0" -- "$@") +eval set -- "${args}" + +while true; do + case "$1" in + --enable-ssh) + # fall through + ;& + --enable-remote-access) enable_remote_access; exit 0;; + --admin-login) + # fall through + ;& + --owner-login) owner_login; exit 0;; + --send-diag) send_diag; exit 0;; + --help) break;; + --) break;; + *) echo "Unknown option $1"; exit 1;; + esac +done + +echo -e "${HELP_MESSAGE}"