Skip to content

Commit f652933

Browse files
committed
fix(scripts): add uninstall handlers and sudo-aware removal
Add missing uninstall action to install_go.sh, install_composer.sh, install_docker.sh, and install_parallel.sh. All 14 dedicated scripts now consistently handle install/update/uninstall actions. Fix remove_installation() in reconcile.sh to check directory writability before removal, using sudo for root-owned paths like /usr/local/bin. Closes #36, closes #37 Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
1 parent 39b106c commit f652933

6 files changed

Lines changed: 642 additions & 199 deletions

File tree

scripts/install_composer.sh

Lines changed: 111 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -5,82 +5,123 @@ set -euo pipefail
55

66
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
77

8+
ACTION="${1:-install}"
89
INSTALL_DIR="${COMPOSER_INSTALL_DIR:-/usr/local/bin}"
910
COMPOSER_URL="https://getcomposer.org/download/latest-stable/composer.phar"
1011

11-
# Check for PHP dependency
12-
if ! command -v php >/dev/null 2>&1; then
13-
echo "[composer] Error: PHP is required but not installed." >&2
14-
echo "[composer] Install PHP first using one of:" >&2
15-
echo " - sudo apt-get install php php-cli (Debian/Ubuntu)" >&2
16-
echo " - brew install php (macOS)" >&2
17-
echo " - ./install_tool.sh php (via this toolset)" >&2
18-
19-
# Try to install PHP automatically if we can
20-
if [ -f "$DIR/installers/package_manager.sh" ]; then
21-
echo "[composer] Attempting to install PHP automatically..." >&2
22-
if "$DIR/installers/package_manager.sh" php; then
23-
echo "[composer] PHP installed successfully, continuing with Composer..." >&2
12+
install_composer() {
13+
# Check for PHP dependency
14+
if ! command -v php >/dev/null 2>&1; then
15+
echo "[composer] Error: PHP is required but not installed." >&2
16+
echo "[composer] Install PHP first using one of:" >&2
17+
echo " - sudo apt-get install php php-cli (Debian/Ubuntu)" >&2
18+
echo " - brew install php (macOS)" >&2
19+
echo " - ./install_tool.sh php (via this toolset)" >&2
20+
21+
# Try to install PHP automatically if we can
22+
if [ -f "$DIR/installers/package_manager.sh" ]; then
23+
echo "[composer] Attempting to install PHP automatically..." >&2
24+
if "$DIR/installers/package_manager.sh" php; then
25+
echo "[composer] PHP installed successfully, continuing with Composer..." >&2
26+
else
27+
echo "[composer] Failed to install PHP automatically. Please install manually." >&2
28+
exit 1
29+
fi
2430
else
25-
echo "[composer] Failed to install PHP automatically. Please install manually." >&2
2631
exit 1
2732
fi
33+
fi
34+
35+
echo "[composer] Downloading latest stable composer.phar..."
36+
37+
# Download to temp file
38+
TMP_FILE="$(mktemp)"
39+
trap "rm -f '$TMP_FILE'" EXIT
40+
41+
if ! curl -fsSL "$COMPOSER_URL" -o "$TMP_FILE"; then
42+
echo "[composer] Error: Failed to download from $COMPOSER_URL" >&2
43+
exit 1
44+
fi
45+
46+
# Verify it's a valid phar by checking version
47+
echo "[composer] Verifying downloaded phar..."
48+
if ! php "$TMP_FILE" --version >/dev/null 2>&1; then
49+
echo "[composer] Error: Downloaded file is not a valid composer.phar" >&2
50+
exit 1
51+
fi
52+
53+
# Get version
54+
COMPOSER_VERSION="$(php "$TMP_FILE" --version 2>/dev/null | head -1 || echo 'unknown')"
55+
echo "[composer] Downloaded: $COMPOSER_VERSION"
56+
57+
# Get current version
58+
CURRENT_VERSION="$(command -v composer >/dev/null 2>&1 && composer --version 2>/dev/null | head -1 || echo '<none>')"
59+
echo "[composer] Current: $CURRENT_VERSION"
60+
61+
# Install composer.phar
62+
echo "[composer] Installing to $INSTALL_DIR/composer..."
63+
64+
if [ -w "$INSTALL_DIR" ]; then
65+
# User has write access
66+
cp "$TMP_FILE" "$INSTALL_DIR/composer"
67+
chmod 755 "$INSTALL_DIR/composer"
68+
elif command -v sudo >/dev/null 2>&1; then
69+
# Need sudo
70+
echo "[composer] Requires sudo to install to $INSTALL_DIR"
71+
sudo cp "$TMP_FILE" "$INSTALL_DIR/composer"
72+
sudo chmod 755 "$INSTALL_DIR/composer"
2873
else
74+
echo "[composer] Error: Cannot write to $INSTALL_DIR and sudo not available" >&2
75+
echo "[composer] Try: COMPOSER_INSTALL_DIR=~/.local/bin $0" >&2
2976
exit 1
3077
fi
31-
fi
32-
33-
echo "[composer] Downloading latest stable composer.phar..."
34-
35-
# Download to temp file
36-
TMP_FILE="$(mktemp)"
37-
trap "rm -f '$TMP_FILE'" EXIT
38-
39-
if ! curl -fsSL "$COMPOSER_URL" -o "$TMP_FILE"; then
40-
echo "[composer] Error: Failed to download from $COMPOSER_URL" >&2
41-
exit 1
42-
fi
43-
44-
# Verify it's a valid phar by checking version
45-
echo "[composer] Verifying downloaded phar..."
46-
if ! php "$TMP_FILE" --version >/dev/null 2>&1; then
47-
echo "[composer] Error: Downloaded file is not a valid composer.phar" >&2
48-
exit 1
49-
fi
50-
51-
# Get version
52-
COMPOSER_VERSION="$(php "$TMP_FILE" --version 2>/dev/null | head -1 || echo 'unknown')"
53-
echo "[composer] Downloaded: $COMPOSER_VERSION"
54-
55-
# Get current version
56-
CURRENT_VERSION="$(command -v composer >/dev/null 2>&1 && composer --version 2>/dev/null | head -1 || echo '<none>')"
57-
echo "[composer] Current: $CURRENT_VERSION"
58-
59-
# Install composer.phar
60-
echo "[composer] Installing to $INSTALL_DIR/composer..."
61-
62-
if [ -w "$INSTALL_DIR" ]; then
63-
# User has write access
64-
cp "$TMP_FILE" "$INSTALL_DIR/composer"
65-
chmod 755 "$INSTALL_DIR/composer"
66-
elif command -v sudo >/dev/null 2>&1; then
67-
# Need sudo
68-
echo "[composer] Requires sudo to install to $INSTALL_DIR"
69-
sudo cp "$TMP_FILE" "$INSTALL_DIR/composer"
70-
sudo chmod 755 "$INSTALL_DIR/composer"
71-
else
72-
echo "[composer] Error: Cannot write to $INSTALL_DIR and sudo not available" >&2
73-
echo "[composer] Try: COMPOSER_INSTALL_DIR=~/.local/bin $0" >&2
74-
exit 1
75-
fi
76-
77-
# Verify installation
78-
NEW_VERSION="$(composer --version 2>/dev/null | head -1 || echo '<failed>')"
79-
echo "[composer] Installed: $NEW_VERSION"
80-
81-
if [ "$NEW_VERSION" = "<failed>" ]; then
82-
echo "[composer] Error: Installation verification failed" >&2
83-
exit 1
84-
fi
85-
86-
echo "[composer] ✓ Installation successful"
78+
79+
# Verify installation
80+
NEW_VERSION="$(composer --version 2>/dev/null | head -1 || echo '<failed>')"
81+
echo "[composer] Installed: $NEW_VERSION"
82+
83+
if [ "$NEW_VERSION" = "<failed>" ]; then
84+
echo "[composer] Error: Installation verification failed" >&2
85+
exit 1
86+
fi
87+
88+
echo "[composer] Installation successful"
89+
}
90+
91+
uninstall_composer() {
92+
local composer_bin
93+
composer_bin="$(command -v composer 2>/dev/null || echo "")"
94+
95+
if [ -z "$composer_bin" ]; then
96+
echo "[composer] Not installed, nothing to remove" >&2
97+
return 0
98+
fi
99+
100+
echo "[composer] Removing composer binary: $composer_bin" >&2
101+
local bin_dir
102+
bin_dir="$(dirname "$composer_bin")"
103+
if [ -w "$bin_dir" ]; then
104+
rm -f "$composer_bin"
105+
elif command -v sudo >/dev/null 2>&1; then
106+
sudo rm -f "$composer_bin"
107+
else
108+
echo "[composer] Error: Cannot remove $composer_bin (no write access and sudo not available)" >&2
109+
return 1
110+
fi
111+
112+
# Remove composer cache/config directories
113+
for dir in "$HOME/.composer" "$HOME/.config/composer"; do
114+
if [ -d "$dir" ]; then
115+
echo "[composer] Removing $dir" >&2
116+
rm -rf "$dir"
117+
fi
118+
done
119+
120+
echo "[composer] Uninstall complete" >&2
121+
}
122+
123+
case "$ACTION" in
124+
install|update) install_composer ;;
125+
uninstall) uninstall_composer ;;
126+
*) echo "Usage: $0 {install|update|uninstall}" ; exit 2 ;;
127+
esac

scripts/install_docker.sh

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,52 @@ set -euo pipefail
44
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
55
. "$DIR/lib/common.sh"
66

7+
ACTION="${1:-install}"
8+
79
before() { command -v docker >/dev/null 2>&1 && docker --version || true; }
810
after() { command -v docker >/dev/null 2>&1 && docker --version || true; }
911

10-
# Reconcile to official script/apt on Debian/Ubuntu systems
11-
if have apt-get; then
12-
echo "[docker] current: $(before)"
13-
# Remove legacy docker.io if present
14-
apt_purge_if_present docker.io docker-doc docker-compose podman-docker containerd runc || true
15-
16-
if is_wsl; then
17-
echo "[docker] WSL detected - installing Docker Engine (skipping 20s wait)..."
18-
echo "[docker] Note: Docker Desktop for Windows is also available."
19-
echo "[docker] See: https://docs.docker.com/desktop/wsl/"
20-
# Download script and remove the sleep to skip 20-second wait
21-
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
22-
sed -i 's/sleep 20/sleep 0/' /tmp/get-docker.sh
23-
sudo sh /tmp/get-docker.sh
24-
rm -f /tmp/get-docker.sh
25-
# Start service manually (no systemd in WSL)
26-
sudo service docker start || echo "[docker] Run 'sudo service docker start' to start Docker"
27-
else
28-
curl -fsSL https://get.docker.com | sh
12+
install_docker() {
13+
# Reconcile to official script/apt on Debian/Ubuntu systems
14+
if have apt-get; then
15+
echo "[docker] current: $(before)"
16+
# Remove legacy docker.io if present
17+
apt_purge_if_present docker.io docker-doc docker-compose podman-docker containerd runc || true
18+
19+
if is_wsl; then
20+
echo "[docker] WSL detected - installing Docker Engine (skipping 20s wait)..."
21+
echo "[docker] Note: Docker Desktop for Windows is also available."
22+
echo "[docker] See: https://docs.docker.com/desktop/wsl/"
23+
# Download script and remove the sleep to skip 20-second wait
24+
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
25+
sed -i 's/sleep 20/sleep 0/' /tmp/get-docker.sh
26+
sudo sh /tmp/get-docker.sh
27+
rm -f /tmp/get-docker.sh
28+
# Start service manually (no systemd in WSL)
29+
sudo service docker start || echo "[docker] Run 'sudo service docker start' to start Docker"
30+
else
31+
curl -fsSL https://get.docker.com | sh
32+
fi
33+
34+
sudo usermod -aG docker "$USER" || true
35+
echo "[docker] updated: $(after)"
36+
return 0
2937
fi
3038

31-
sudo usermod -aG docker "$USER" || true
32-
echo "[docker] updated: $(after)"
33-
exit 0
34-
fi
35-
36-
echo "Please install Docker following https://docs.docker.com/engine/install/"
37-
38-
39+
echo "Please install Docker following https://docs.docker.com/engine/install/"
40+
}
41+
42+
uninstall_docker() {
43+
echo "[docker] Docker uninstall is a system-level operation." >&2
44+
echo "[docker] To remove Docker Engine, run:" >&2
45+
echo "[docker] sudo apt-get remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" >&2
46+
echo "[docker] sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" >&2
47+
echo "[docker] sudo rm -rf /var/lib/docker /var/lib/containerd" >&2
48+
echo "[docker] See: https://docs.docker.com/engine/install/ubuntu/#uninstall-docker-engine" >&2
49+
}
50+
51+
case "$ACTION" in
52+
install|update) install_docker ;;
53+
uninstall) uninstall_docker ;;
54+
*) echo "Usage: $0 {install|update|uninstall}" ; exit 2 ;;
55+
esac

0 commit comments

Comments
 (0)