diff --git a/install/install_cockpit.sh b/install/install_cockpit.sh index 2cb2ef4e..2a79b9f5 100644 --- a/install/install_cockpit.sh +++ b/install/install_cockpit.sh @@ -1,390 +1,4 @@ #!/bin/bash -# Define PATH -PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin -# Export PATH -# export PATH -## This script is used for install or upgrade Cockpit on Linux -## Cockpit build at redhat family: https://copr.fedorainfracloud.org/coprs/g/cockpit/cockpit-preview/monitor/ -## Cockpit reposoitory list: https://pkgs.org/download/cockpit -## PackageKit: https://www.freedesktop.org/software/PackageKit/ -## Not use pkcon install/update cockpit, the reason is: https://cockpit-project.org/faq.html#error-message-about-being-offline -## pkcon can read repositories at you system directly, it don't provide exra repository -## [apt show cockpit] or [apt install cockpit] show all additional packages -## Ubuntu have backports at file /etc/apt/sources.list by default -## Cockpit application: https://cockpit-project.org/applications - -# Command-line options -# ========================================================== -# -# --port <9000> -# Use the --port option to set Websoft9 cosole port. default is 9000, for example: -# -# $ sudo sh install_cockpit.sh --port 9001 - -############################################################ -# Below vars export from install.sh -# $port -# $install_path -############################################################ -set -e -echo -e "\n\n-------- Cockpit --------" - -while [[ $# -gt 0 ]]; do - case $1 in - --port) - port="$2" - shift 2 - ;; - *) - shift - ;; - esac -done - -# Port priority: --port > ListenStream= > 9000 - -cockpit_exist() { - systemctl list-unit-files | grep -q "cockpit.service" - return $? -} - -if cockpit_exist; then - cockpit_now_port=$(grep -oP "(?<=^ListenStream=).*" "/lib/systemd/system/cockpit.socket") - if [ -z "${cockpit_now_port// }" ]; then - echo "cockpit port is null,set it to 9000" - cockpit_now_port=9000 - else - echo "$cockpit_now_port at cockpit.socket" - fi - -else - cockpit_now_port=9000 -fi - -if [ -n "$port" ]; then - cockpit_port=$port -else - cockpit_port=$cockpit_now_port -fi - - -if [ -n "$install_path" ]; then - echo "Have found install files" -else - install_path="/data/websoft9/source" -fi - -echo -e "\nYour installation parameters are as follows: " -echo "cockpit_port:$cockpit_port" -echo "install_path:$install_path" - -related_containers=("websoft9-apphub") -echo_prefix_cockpit=$'\n[Cockpit] - ' -# package cockpit depends_on [cockpit-bridge,cockpit-ws,cockpit-system], but update cockpit the depends don't update -cockpit_packages="cockpit cockpit-ws cockpit-bridge cockpit-system cockpit-pcp cockpit-storaged cockpit-networkmanager cockpit-session-recording cockpit-doc cockpit-packagekit cockpit-sosreport" -menu_overrides_github_page_url="https://websoft9.github.io/websoft9/cockpit/menu_override" -cockpit_config_github_page_url="https://websoft9.github.io/websoft9/cockpit/cockpit.conf" -cockpit_menu_overrides=() -# export OS release environments -if [ -f /etc/os-release ]; then - . /etc/os-release -else - echo "Can't judge your Linux distribution" - exit 1 -fi - -# This solution from: https://help.ubuntu.com/community/PinningHowto -pin_config=" -Package: cockpit* -Pin: release a=$VERSION_CODENAME-backports -Pin-Priority: 1000 -" - -check_ports() { - local ports=("$@") - - for port in "${ports[@]}"; do - if netstat -tuln | grep ":$port " >/dev/null; then - echo "Port $port is in use, install failed" - exit - fi - done - - echo "All ports are available" -} - -Print_Version(){ - sudo /usr/libexec/cockpit-ws --version 2>/dev/null || sudo /usr/lib/cockpit-ws --version 2>/dev/null || /usr/lib/cockpit/cockpit-ws --version 2>/dev/null -} - -Install_PackageKit(){ - echo "$echo_prefix_cockpit Install PackageKit(pkcon) and Cockpit repository" - - if command -v pkcon &> /dev/null; then - echo "pkcon is at your system ..." - - elif command -v yum &> /dev/null; then - if [ "$(cat /etc/redhat-release)" = "Redhat7" ]; then - sudo subscription-manager repos --enable rhel-7-server-extras-rpms - fi - sudo yum install PackageKit -y - - elif command -v dnf &> /dev/null; then - sudo dnf install PackageKit -y - - elif command -v apt &> /dev/null; then - sudo apt update - sudo apt install packagekit -y - - else - echo "PackageKit not found, Cockpit cannot be installed" - exit 1 - fi -} - - -Set_Repository() { - echo "$echo_prefix_cockpit Set Cockpit deb repository" - if command -v apt &> /dev/null; then - if [ "$NAME" = "Debian" ]; then - echo "deb http://deb.debian.org/debian $VERSION_CODENAME-backports main" > /etc/apt/sources.list.d/backports.list - fi - echo "Set the cockpit repository priority on Ubuntu/Debian..." - sudo bash -c "echo '$pin_config' > /etc/apt/preferences.d/cockpit_backports" - fi - echo "Complete set Cockpit repository" -} - - -Restart_Cockpit(){ - echo "$echo_prefix_cockpit Restart Cockpit" - sudo systemctl daemon-reload - sudo systemctl restart cockpit.socket 2> /dev/null - sudo systemctl restart cockpit || exit 1 -} - -Add_Firewalld(){ - echo "Add cockpit service to Firewalld..." - # cockpit.xml is not always the same path at Linux distributions - sudo sed -i "s/port=\"[0-9]*\"/port=\"$cockpit_port\"/g" /etc/firewalld/services/cockpit.xml - sudo sed -i "s/port=\"[0-9]*\"/port=\"$cockpit_port\"/g" /usr/lib/firewalld/services/cockpit.xml - sudo firewall-cmd --zone=public --add-service=cockpit --permanent - sudo firewall-cmd --zone=public --add-port=443/tcp --permanent - sudo firewall-cmd --zone=public --add-port=80/tcp --permanent - sudo firewall-cmd --reload -} - -Set_Firewalld(){ - echo "$echo_prefix_cockpit Set firewalld for cockpit access" - if command -v firewall-cmd &> /dev/null; then - echo "Set firewall for Cockpit..." - if ! systemctl is-active --quiet firewalld; then - sudo systemctl start firewalld - Add_Firewalld - sudo systemctl stop firewalld - else - Add_Firewalld - fi - fi -} - -Set_Selinux(){ - echo "$echo_prefix_cockpit Set Selinux for cockpit access" - if [ -f /etc/selinux/config ]; then - echo "Set Selinux for Cockpit..." - sudo setenforce 0 1>/dev/null 2>&1 - sudo sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 1>/dev/null 2>&1 - fi -} - -Set_Cockpit(){ - echo "$echo_prefix_cockpit Set Cockpit for Websoft9" - - echo "Cockpit allowed root user ..." - echo "" > /etc/cockpit/disallowed-users - - # fix bug: https://github.com/Websoft9/websoft9/issues/332 - sed 's/selector(:is():where())/selector(:is(*):where(*))/' -i /usr/share/cockpit/static/login.js - - echo "Set Cockpit config file..." - if [ -f "$install_path/cockpit/cockpit.conf" ]; then - cp -f "$install_path/cockpit/cockpit.conf" /etc/cockpit/cockpit.conf - else - echo "Download config from URL $cockpit_config_github_page_url" - curl -sSL $cockpit_config_github_page_url | sudo tee /etc/cockpit/cockpit.conf > /dev/null - fi - - - echo "Change cockpit default port to $cockpit_port ..." - sudo sed -i "s/ListenStream=[0-9]*/ListenStream=${cockpit_port}/" /lib/systemd/system/cockpit.socket - - - if docker ps --format '{{.Names}}' | grep -wq "${related_containers[0]}"; then - echo "Try to change cockpit port at ${related_containers[0]} container..." - sudo docker exec -i ${related_containers[0]} apphub setconfig --section cockpit --key port --value $cockpit_port || true - else - echo "Not found ${related_containers[0]} container" - fi - - - # fwupd-refresh.service may push error for Cockpit menu, so disable it - if sudo systemctl is-active --quiet fwupd-refresh.service; then - echo "fwupd-refresh.service is already running. Stopping and disabling it..." - sudo systemctl stop fwupd-refresh.service - sudo systemctl disable fwupd-refresh.service - echo "fwupd-refresh.service stopped and disabled." - else - echo "fwupd-refresh.service is not running." - fi - -} - -get_github_files() { - python3 - < /dev/null - if [ $? -ne 0 ]; then - echo "Failed to download files" - exit 1 - fi - - done -} - -Edit_Menu(){ - echo "$echo_prefix_cockpit Start to edit Cockpit origin Menu" - if [ -f "$install_path/cockpit/cockpit.conf" ]; then - cp -f "$install_path/cockpit/cockpit.conf" /etc/cockpit/cockpit.conf - else - echo "Download config file from URL..." - curl -sSL $cockpit_config_github_page_url | sudo tee /etc/cockpit/cockpit.conf > /dev/null - if [ $? -ne 0 ]; then - echo "Failed to download cockpit.conf" - exit 1 - fi - fi - - if test -d "$install_path/cockpit/menu_override"; then - cp -r $install_path/cockpit/menu_override/* /etc/cockpit - else - echo "Download override files from URL..." - Download_Menu_Override - fi -} - -Upgrade_Cockpit(){ - echo "$echo_prefix_cockpit Prepare to upgrade Cockpit" - echo "You installed version: " - Print_Version - if command -v apt >/dev/null; then - export DEBIAN_FRONTEND=noninteractive - sudo dpkg --configure -a - apt update -y - apt --fix-broken install - for pkg in $cockpit_packages - do - echo "Installing $pkg" - sudo apt install -u -y "$pkg" || echo "$pkg failed to install" - done - else - sudo pkcon refresh > /dev/null - sudo pkcon get-updates > /dev/null - sudo pkcon update $cockpit_packages -y - sudo pkcon install $cockpit_packages -y --allow-untrusted --allow-reinstall - fi -} - -Install_Cockpit(){ - - if cockpit_exist; then - Upgrade_Cockpit - Restart_Cockpit - else - echo "$echo_prefix_cockpit Prepare to install Cockpit" - check_ports $port - export DEBIAN_FRONTEND=noninteractive - sudo pkcon refresh > /dev/null - sudo pkcon get-updates > /dev/null - output=$(sudo pkcon install $cockpit_packages -y --allow-untrusted --allow-reinstall 2>&1) - if echo "$output" | grep -q "offline"; then - Upgrade_Cockpit - fi - Restart_Cockpit - fi - - Set_Firewalld - Set_Selinux - Set_Cockpit - Edit_Menu - Restart_Cockpit -} - -Test_Cockpit(){ - echo "$echo_prefix_cockpit Test Cockpit console accessibility" - test_cmd="curl localhost:$cockpit_port" - start_time=$(date +%s) - timeout=30 - while true; do - if $test_cmd >/dev/null 2>&1; then - echo "Cockpit running OK..." - break - else - current_time=$(date +%s) - elapsed_time=$(($current_time - $start_time)) - if [ $elapsed_time -ge $timeout ]; then - echo "Cockpit is not running... Timeout after waiting $timeout seconds." - exit 1 - fi - sleep 1 - fi - done - - Print_Version -} - - -#### -------------- main() start here ------------------- #### - -Install_PackageKit -Set_Repository -Install_Cockpit -Test_Cockpit - -# release package memory -if systemctl cat packagekit > /dev/null 2>&1; then - sudo systemctl restart packagekit -else - echo "no packagekit" -fi - echo "cockpit install finished." \ No newline at end of file