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

smoother up (fixes #68) #66

Merged
merged 4 commits into from
Sep 26, 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
2 changes: 1 addition & 1 deletion src/aws/dependencies/utilitiyFunction.sh
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ function waitForConditionalOutput() {
fi
fi
attempt=$((attempt + 1))
sleep 5
sleep 10
done

echo "Error: Failed to meet the condition after $maxAttempts attempts."
Expand Down
182 changes: 100 additions & 82 deletions src/aws/up.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@
portConfigArray=
udpPortConfigArray=

publickey=`treehouses sshtunnel key name | cut -d ' ' -f 5`.pub
publickey=$(treehouses sshtunnel key name | cut -d ' ' -f 5).pub

keyname=
groupName=luftballons-sg
instanceName=luftballon
checkSSH=~/.ssh/$publickey

checkSshKey() {
aws ec2 describe-key-pairs --key-names $keyname &> /dev/null
aws ec2 describe-key-pairs --key-names $keyname &>/dev/null
return $?
}

checkSecurityGroup() {
aws ec2 describe-security-groups --group-names $groupName &> /dev/null
aws ec2 describe-security-groups --group-names $groupName &>/dev/null
return $?
}

Expand All @@ -29,18 +29,17 @@ checkInstanceState() {
aws ec2 describe-instances --instance-ids $ID --query "Reservations[*].Instances[*].State.Name" --output text
}

function importSshKey()
{
function importSshKey() {
if [[ -f ~/.ssh/$publickey ]]; then
aws ec2 import-key-pair --key-name "$keyname" --public-key-material fileb://~/.ssh/$publickey
aws ec2 import-key-pair --key-name "$keyname" --public-key-material fileb://~/.ssh/$publickey
else
echo 'ssh key pair (~/.ssh/$publickey) do not exist ~/.ssh/$publickey'
echo 'Please generate the ssh key by the commad "ssh-keygen -t rsa"'
exit 1
fi
}

function addPort(){
function addPort() {
aws ec2 authorize-security-group-ingress \
--group-name $groupName \
--protocol tcp \
Expand All @@ -56,7 +55,7 @@ function addUDPPort() {
--cidr 0.0.0.0/0
}

function createSecurityGroups(){
function createSecurityGroups() {
aws ec2 create-security-group \
--group-name $groupName \
--description "luftballons security group"
Expand All @@ -78,28 +77,28 @@ function createSecurityGroups(){
done
}

function createEc2(){
function createEc2() {
image="ami-0750fb43a63427eff"
#image="ami-01e5ff16fd6e8c542"
aws ec2 run-instances \
--count 1 \
--image-id $image \
--instance-type t2.micro \
--key-name $keyname \
--security-groups $groupName
--security-groups $groupName
}

function findData(){
function findData() {
keyWord=$1
grep $keyWord | awk -F':' '{ print $2 }' | sed 's/ //g; s/"//g; s/,//g'
grep $keyWord | awk -F':' '{ print $2 }' | sed 's/ //g; s/"//g; s/,//g'
}

function deleteKeyword(){
function deleteKeyword() {
keyWord=$1
sed "s/$keyWord//g; s/ //g"
}

function getValueByKeyword(){
function getValueByKeyword() {
keyWord=$1
findData $keyWord | deleteKeyword $keyWord
}
Expand All @@ -116,83 +115,102 @@ function usage {
function up {
while getopts 'n:pN:a:' OPTION; do
case "$OPTION" in
n)
keyname=$OPTARG
;;
p)
portConfigArray=$(getArrayValueAsStringByKey $instanceName tcpPortArray)
udpPortConfigArray=$(getArrayValueAsStringByKey $instanceName udpPortArray)
if [ -z "$portConfigArray" ]; then
echo "There is no stored port numbers. The default port numbers are used"
fi
if [ -z "$udpPortConfigArray" ]; then
echo "There is no stored udp port numbers. The default port numbers are used"
fi
;;
a)
groupName=$OPTARG-sg
instanceName=$OPTARG
keyname=$OPTARG
;;
?)
usage
;;
esac
done
shift "$(($OPTIND -1))"

aws --version || ( echo "Run './installAwsCli.sh' first. AWS CLI is not installed." && exit 1 )

if test ! -f "$checkSSH"; then
echo "Run 'ssh-keygen' first, with an empty passphrase for no passphrase. Missing ssh key." && exit 1
fi
n)
keyname=$OPTARG
;;
p)
portConfigArray=$(getArrayValueAsStringByKey $instanceName tcpPortArray)
udpPortConfigArray=$(getArrayValueAsStringByKey $instanceName udpPortArray)
if [ -z "$portConfigArray" ]; then
echo "There is no stored port numbers. The default port numbers are used"
fi
if [ -z "$udpPortConfigArray" ]; then
echo "There is no stored udp port numbers. The default port numbers are used"
fi
;;
a)
groupName=$OPTARG-sg
instanceName=$OPTARG
keyname=$OPTARG
;;
?)
usage
;;
esac
done
shift "$(($OPTIND - 1))"

if [ -z $keyname ]; then
keyname=luftballon
fi
aws --version || (echo "Run './installAwsCli.sh' first. AWS CLI is not installed." && exit 1)

if ! checkSshKey ; then
importedKeyName=$(importSshKey | getValueByKeyword KeyName )
if [ -z $importedKeyName ]; then
exit 1
fi
echo "Success to add ssh key: $importedKeyName"
else
echo "The key pair $keyname already exists. Please use another key name."
if test ! -f "$checkSSH"; then
echo "Run 'ssh-keygen' first, with an empty passphrase for no passphrase. Missing ssh key." && exit 1
fi

if [ -z $keyname ]; then
keyname=luftballon
fi

if ! checkSshKey; then
importedKeyName=$(importSshKey | getValueByKeyword KeyName)
if [ -z $importedKeyName ]; then
exit 1
fi
echo "Success to add ssh key: $importedKeyName"
else
echo "The key pair $keyname already exists. Please use another key name."
fi

if ! checkSecurityGroup; then
createSecurityGroups
echo "Add security group"
# Add rules to Security Group as needed
else
echo "Security Group already exists."
fi

createAndTagInstance() {
instanceId=$(createEc2 | getValueByKeyword InstanceId)
echo "Creating and running EC2 instance..."
echo "Instance id is $instanceId"

aws ec2 create-tags --resources $instanceId --tags Key=Name,Value=$instanceName
aws ec2 create-tags --resources $instanceId --tags Key=Class,Value=treehouses

if ! checkSecurityGroup; then
createSecurityGroups
echo "Add security group"
# Add rules to Security Group as needed
else
echo "Security Group already exists."
publicIp=$(waitForOutput "getLatestIpAddress $instanceId")
echo "Public IP Address is $publicIp"
echo "Will open ssh tunnel soon"

isOpen=$(waitForOutput "ssh-keyscan -H $publicIp | grep ecdsa-sha2-nistp256")
echo "Opened ssh tunnel"

openSSHTunnel $instanceName $publicIp $portConfigArray
storeConfigIntoTreehousesConfigAsStringfiedJson $instanceName $importedKeyName $instanceId $publicIp $groupName
}

instanceId=$(checkInstance)
if [ -z "$instanceId" ]; then
createAndTagInstance
else
instanceState=$(waitForConditionalOutput "checkInstanceState $instanceId" "\"stopping\"" "different")
if [ $? -ne 0 ]; then
echo "Wait for starting on start command until instance is stopped."
exit 1
fi

instanceId=$(checkInstance)
if [ -z "$instanceId" ]; then
instanceState=""
instanceId=$(createEc2 | getValueByKeyword InstanceId)
echo "Creating and running EC2 instance..."
echo "Instance id is $instanceId"
aws ec2 create-tags --resources $instanceId --tags Key=Name,Value=$instanceName
aws ec2 create-tags --resources $instanceId --tags Key=Class,Value=treehouses
publicIp=$(waitForOutput "getLatestIpAddress $instanceId")
echo "Public IP Address is $publicIp"
echo "Will open ssh tunnel soon"
isOpen=$(waitForOutput "ssh-keyscan -H $publicIp | grep ecdsa-sha2-nistp256")
echo "Opened ssh tunnel"
openSSHTunnel $instanceName $publicIp $portConfigArray
storeConfigIntoTreehousesConfigAsStringfiedJson $instanceName $importedKeyName $instanceId $publicIp $groupNameaws ec2 create-tags --resources $instanceId --tags Key=Class,Value=treehouses
else
instanceState=$(checkInstanceState $instanceId)
if [ "$instanceState" = "running" ]; then
case "$instanceState" in
"running")
echo "EC2 instance is already running."
elif [ "$instanceState" = "stopped" ]; then
;;
"stopped")
echo "Starting stopped EC2 instance..."
start $instanceName
else
;;
"terminated")
createAndTagInstance
;;
*)
echo "EC2 instance is in state: $instanceState."
fi
;;
esac
fi
}
Loading