Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: avoid RPM lock issue #44

Merged
merged 16 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 38 additions & 10 deletions userdata.sh.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,59 @@ exec > >(tee /var/log/user-data.log | logger -t user-data -s 2>/dev/console) 2>&
echo "Starting user-data script..."

echo "Enabling IP forwarding..."
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

# Function to retry a command up to a maximum number of attempts
retry_command() {
local cmd="$1"
local max_attempts="$2"
local attempt=1
local exit_code=0

while [ $attempt -le $max_attempts ]; do
echo "Attempt $attempt of $max_attempts: $cmd"
eval "$cmd"
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "Command succeeded: $cmd"
return 0
else
echo "Command failed with exit code $exit_code: $cmd"
attempt=$((attempt + 1))
if [ $attempt -le $max_attempts ]; then
echo "Retrying in 2 seconds..."
sleep 2
fi
fi
done

echo "Command failed after $max_attempts attempts: $cmd"
return $exit_code
}
Comment on lines +11 to +37
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add timeout and cleanup handling to retry mechanism

While the retry logic is well-implemented, consider these enhancements:

  1. Add the agreed-upon 30-second timeout
  2. Include cleanup handling for interrupted execution
 retry_command() {
   local cmd="$1"
   local max_attempts="$2"
   local attempt=1
   local exit_code=0
+  local start_time=$(date +%s)
+  local timeout=30  # 30-second timeout
+
+  # Setup cleanup trap
+  trap 'echo "Command interrupted: $cmd"; return 1' INT TERM
 
   while [ $attempt -le $max_attempts ]; do
+    current_time=$(date +%s)
+    if (( current_time - start_time > timeout )); then
+      echo "Timeout after ${timeout} seconds: $cmd"
+      return 124  # Standard timeout exit code
+    fi
     echo "Attempt $attempt of $max_attempts: $cmd"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Function to retry a command up to a maximum number of attempts
retry_command() {
local cmd="$1"
local max_attempts="$2"
local attempt=1
local exit_code=0
while [ $attempt -le $max_attempts ]; do
echo "Attempt $attempt of $max_attempts: $cmd"
eval "$cmd"
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "Command succeeded: $cmd"
return 0
else
echo "Command failed with exit code $exit_code: $cmd"
attempt=$((attempt + 1))
if [ $attempt -le $max_attempts ]; then
echo "Retrying in 2 seconds..."
sleep 2
fi
fi
done
echo "Command failed after $max_attempts attempts: $cmd"
return $exit_code
}
# Function to retry a command up to a maximum number of attempts
retry_command() {
local cmd="$1"
local max_attempts="$2"
local attempt=1
local exit_code=0
local start_time=$(date +%s)
local timeout=30 # 30-second timeout
# Setup cleanup trap
trap 'echo "Command interrupted: $cmd"; return 1' INT TERM
while [ $attempt -le $max_attempts ]; do
current_time=$(date +%s)
if (( current_time - start_time > timeout )); then
echo "Timeout after ${timeout} seconds: $cmd"
return 124 # Standard timeout exit code
fi
echo "Attempt $attempt of $max_attempts: $cmd"
eval "$cmd"
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "Command succeeded: $cmd"
return 0
else
echo "Command failed with exit code $exit_code: $cmd"
attempt=$((attempt + 1))
if [ $attempt -le $max_attempts ]; then
echo "Retrying in 2 seconds..."
sleep 2
fi
fi
done
echo "Command failed after $max_attempts attempts: $cmd"
return $exit_code
}


echo "Installing Tailscale..."
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://pkgs.tailscale.com/stable/amazon-linux/2/tailscale.repo
sudo yum install -y tailscale
retry_command "dnf install -y dnf-utils" 5
retry_command "dnf config-manager --add-repo https://pkgs.tailscale.com/stable/amazon-linux/2/tailscale.repo" 5
retry_command "dnf install -y tailscale" 5

%{ if tailscaled_extra_flags_enabled == true }
echo "Exporting FLAGS to /etc/default/tailscaled..."
sudo sed -i "s|^FLAGS=.*|FLAGS=\"${tailscaled_extra_flags}\"|" /etc/default/tailscaled
sed -i "s|^FLAGS=.*|FLAGS=\"${tailscaled_extra_flags}\"|" /etc/default/tailscaled
%{ endif }

# Setup tailscale
# Setup Tailscale
echo "Enabling and starting tailscaled service..."
sudo systemctl enable --now tailscaled
systemctl enable --now tailscaled

echo "Waiting for tailscaled to initialize..."
sleep 5

# Start tailscale
# We pass --advertise-tags below even though the authkey being created with those tags should result
# in the same effect. This is to be more explicit because tailscale tags are a complicated topic.
sudo tailscale up \
tailscale up \
gberenice marked this conversation as resolved.
Show resolved Hide resolved
%{ if ssh_enabled == true }--ssh%{ endif } \
%{ if exit_node_enabled == true }--advertise-exit-node%{ endif } \
%{ if tailscale_up_extra_flags_enabled == true }${tailscale_up_extra_flags}%{ endif } \
Expand Down
4 changes: 3 additions & 1 deletion variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,9 @@ variable "ssm_state_enabled" {
default = false
type = bool
description = <<-EOT
Control if tailscaled state is stored in AWS SSM (including preferences and keys). This tells the Tailscale daemon to write + read state from SSM, which unlocks important features like retaining the existing tailscale machine name.
Control if tailscaled state is stored in AWS SSM (including preferences and keys).
This tells the Tailscale daemon to write + read state from SSM,
which unlocks important features like retaining the existing tailscale machine name.
See more in the [docs](https://tailscale.com/kb/1278/tailscaled#flags-to-tailscaled).
EOT
}
Loading