#!/bin/sh # # ec2_cost: approximate EC2 cost (USD) of the current instance # Copyright (C) 2008 Canonical Ltd. # # Authors: Dustin Kirkland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . DETAIL=0 PKG="byobu" color 2>/dev/null || color() { true; } for arg in $@; do case "$arg" in -d|--detail) DETAIL=1 ;; esac done # Get the going rates [ -r "$HOME/.$PKG/ec2_rates" ] || ln -s /usr/share/$PKG/ec2/rates.us_ca "$HOME/.$PKG/ec2_rates" . "$HOME/.$PKG/ec2_rates" || exit 1 # Count CPUs, Memory, Architecture cpu=$(grep -c "^processor.*:" /proc/cpuinfo) || cpu=1 mem=$(grep ^MemTotal /proc/meminfo | awk '{print $2}') # Guess this system's going rate, based on mem available (m* types) if [ $mem -gt 64000000 ]; then RATE=$M2_4XLARGE elif [ $mem -gt 32000000 ]; then RATE=$M2_2XLARGE elif [ $mem -gt 16000000 ]; then RATE=$M2_XLARGE elif [ $mem -gt 14000000 ]; then RATE=$M1_XLARGE elif [ $mem -gt 7000000 ]; then RATE=$M1_LARGE else # Otherwise, scale based on number of cpu's (c* types) RATE=$(echo "$cpu" "$M1_SMALL" | awk '{printf "%f", $1*$2}') fi # Data Transfer Cost Basis # Incoming $0.10/GB # Outgoing $0.17/GB # (This gets more complex if you use >1TB/mo) RX_RATE="0.10" TX_RATE="0.15" # Auto detect network interface IF=`tail -n1 /proc/net/route | awk '{print $1}'` ifconfig_out=`/sbin/ifconfig "$IF"` # Calculate bandwidth cost tx_gb=`echo "$ifconfig_out" | grep "TX bytes:" | sed "s/^.*TX bytes://" | awk '{ printf "%f", $1 / 1024 / 1024 / 1024 }'` rx_gb=`echo "$ifconfig_out" | grep "RX bytes:" | sed "s/^.*RX bytes://" | awk '{ printf "%f", $1 / 1024 / 1024 / 1024 }'` network_cost=`echo "$tx_gb" "$TX_RATE" "$rx_gb" "$RX_RATE" | awk '{printf "%f %f", $1*$2, $3*$4}' | awk '{printf "%f", $1 + $2}'` # Calculate uptime cost # BUG: This will only calculate uptime since boot! # Some additional input will be required to account for reboots!!! hours=`awk '{printf "%f", 1 + $1 / 60 / 60 }' /proc/uptime | sed 's/\..*$//' ` uptime_cost=`echo "$hours" | awk "{printf \"%f\", "$RATE" * $hours}"` total_cost=`echo "$network_cost" "$uptime_cost" | awk '{printf "%.2f", $1 + $2}'` if [ "$DETAIL" = "1" ]; then echo "================================================" echo "Estimated cost in Amazon's EC2 since last reboot" echo "================================================" echo " Network sent: $tx_gb GB @ \$$RX_RATE/GB" echo " Network recv: $rx_gb GB @ \$$TX_RATE/GB" echo " Network cost: \$$network_cost" echo "------------------------------------------------" echo " Uptime: $hours hr @ \$$RATE/hr" echo " Uptime cost: \$$uptime_cost" echo "------------------------------------------------" echo "Total cost: ~\$$total_cost" echo "================================================" exit 0 fi printf "$(color K G)~\$$(color -)$(color b K G)%s$(color -) " $total_cost