#!/bin/bash # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. parse_json() { local json_string=$1 echo "$json_string" | jq '.' > /dev/null || { echo '{"error":"Invalid JSON input"}'; exit 1; } } generate_random_mac() { hexchars="0123456789ABCDEF" echo "52:54:00:$(for i in {1..3}; do echo -n ${hexchars:$(( RANDOM % 16 )):1}${hexchars:$(( RANDOM % 16 )):1}; [[ $i -lt 3 ]] && echo -n ':'; done)" } prepare() { parse_json "$1" || exit 1 local input_json="$1" local nics_json nics_json=$(echo "$input_json" | jq '.["cloudstack.vm.details"].nics') # If NICs array is empty, return empty string if [ "$(echo "$nics_json" | jq 'length // 0')" -eq 0 ]; then echo "" return fi local result='{"nics":[' local first=1 while IFS= read -r uuid; do local mac mac=$(generate_random_mac) if [ $first -eq 1 ]; then first=0 else result+=',' fi result+='{"uuid":"'"$uuid"'","mac":"'"$mac"'"}' done < <(echo "$nics_json" | jq -r '.[].uuid') result+=']}' echo "$result" } create() { parse_json "$1" || exit 1 local response response=$(jq -n \ '{status: "success", message: "Instance created"}') echo "$response" } delete() { parse_json "$1" || exit 1 local response response=$(jq -n \ '{status: "success", message: "Instance deleted"}') echo "$response" } start() { parse_json "$1" || exit 1 echo '{"status": "success", "message": "Instance started"}' } stop() { parse_json "$1" || exit 1 echo '{"status": "success", "message": "Instance stopped"}' } reboot() { parse_json "$1" || exit 1 echo '{"status": "success", "message": "Instance rebooted"}' } status() { parse_json "$1" || exit 1 echo '{"status": "success", "power_state": "poweron"}' } action=$1 parameters_file="$2" wait_time="$3" if [[ -z "$action" || -z "$parameters_file" ]]; then echo '{"error":"Missing required arguments"}' exit 1 fi if [[ ! -r "$parameters_file" ]]; then echo '{"error":"File not found or unreadable"}' exit 1 fi # Read file content as parameters (assumes space-separated arguments) parameters=$(<"$parameters_file") case $action in prepare) prepare "$parameters" ;; create) create "$parameters" ;; delete) delete "$parameters" ;; start) start "$parameters" ;; stop) stop "$parameters" ;; reboot) reboot "$parameters" ;; status) status "$parameters" ;; *) echo '{"error":"Invalid action"}' exit 1 ;; esac exit 0