From f9924d760afc0f43fa4c8fde8daa031536a43283 Mon Sep 17 00:00:00 2001 From: Jon Bernard Date: Wed, 28 Apr 2010 10:42:37 -0400 Subject: [PATCH 1/3] Add rcs_cost, a rackspace cloud server instance cost estimator --- etc/byobu/statusrc | 1 + usr/bin/byobu-config | 1 + usr/lib/byobu/rcs_cost | 99 +++++++++++++++++++++++++++++++++ usr/share/byobu/profiles/common | 1 + usr/share/man/man1/byobu.1 | 4 +- 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100755 usr/lib/byobu/rcs_cost diff --git a/etc/byobu/statusrc b/etc/byobu/statusrc index 86c73f28..f97735e6 100644 --- a/etc/byobu/statusrc +++ b/etc/byobu/statusrc @@ -41,6 +41,7 @@ mem_used=1 menu=1 network=0 processes=0 +rcs_cost=0 reboot_required=1 release=1 services=1 diff --git a/usr/bin/byobu-config b/usr/bin/byobu-config index 7dc68bed..be160d05 100755 --- a/usr/bin/byobu-config +++ b/usr/bin/byobu-config @@ -301,6 +301,7 @@ def readstatus(): status["menu"]=1 status["network"]=0 status["processes"]=0 + status["rcs_cost"]=0 status["reboot_required"]=1 status["release"]=1 status["services"]=1 diff --git a/usr/lib/byobu/rcs_cost b/usr/lib/byobu/rcs_cost new file mode 100755 index 00000000..6d9706ad --- /dev/null +++ b/usr/lib/byobu/rcs_cost @@ -0,0 +1,99 @@ +#!/bin/sh +# +# rcs_cost: approximate Rackspace Cloud Server cost (USD) of the current +# instance +# +# Copyright (C) 2009-2010 Jon Bernard +# +# Author: Jon Bernard +# +# Derived from byobu's ec2_cost written by Dustin Kirkland, see +# Byobu's project page: https://launchpad.net/byobu for more information +# +# 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 + +# Approximate Instance Cost Basis +# Memory US +# 256MB $0.015/h +# 512MB $0.030/h +# 1024MB $0.060/h +# 2048MB $0.120/h +# 4096MB $0.240/h +# 8192MB $0.480/h +# 15872MB $0.960/h + +# Instance memory +memory=`grep "^MemTotal:" /proc/meminfo | awk '{print $2}'` + +# Round memory down to the nearest multiple of 64MB +memory=$((${memory} - (${memory} % (64 * 1024)))) + +# Apply the going rate +INCREMENTS="256 512 1024 2048 4096 8192 16384 32768 65536" +for X in ${INCREMENTS}; do + test "$((${X} * 1024 + 65536))" -ge ${memory} && break +done +MEMORY_RATE=`echo "$X" | awk '{printf "%f", $1 / 256 * 15 / 1000}'` + +# Data Transfer Cost Basis +# Incoming $0.08/GB +# Outgoing $0.22/GB +RX_RATE="0.08" +TX_RATE="0.22" + +# 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\", "$MEMORY_RATE" * $hours}"` +total_cost=`echo "$network_cost" "$uptime_cost" | awk '{printf "%.2f", $1 + $2}'` + +if [ "$DETAIL" = "1" ]; then + echo "==========================================================" + echo "Estimated cost in Rackspace Cloud Server 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 @ \$$MEMORY_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 diff --git a/usr/share/byobu/profiles/common b/usr/share/byobu/profiles/common index f4fd9579..bff8ab18 100644 --- a/usr/share/byobu/profiles/common +++ b/usr/share/byobu/profiles/common @@ -70,6 +70,7 @@ backtick 129 67 67 byobu-status apport backtick 130 5 5 byobu-status custom backtick 131 53 53 byobu-status services backtick 132 11 11 byobu-status time_utc +backtick 133 613 613 byobu-status rcs_cost hardstatus alwayslastline diff --git a/usr/share/man/man1/byobu.1 b/usr/share/man/man1/byobu.1 index dc7901a4..368d6275 100644 --- a/usr/share/man/man1/byobu.1 +++ b/usr/share/man/man1/byobu.1 @@ -32,7 +32,9 @@ byobu \- wrapper script for seeding a user's byobu configuration and launching s \fBdisk\fP \- total disk space available and total used on / directory; displayed in the lower bar on the far right in white text on a light purple background; override the default directory by specifying an alternate mount point with MONITORED_DISK=/wherever in \fI$HOME/.byobu/statusrc\fP -\fBec2_cost\fP \- an estimation of the cost of the current boot of the system in terms of the Amazon EC2 billing model; displayed in the lower bar toward the right in green text on a black background; there is a leading '~' to indicate that this is an estimation, and the monetary units are US Dollars '$' +\fBec2_cost\fP \- an estimation of the cost of the current boot of the system in terms of the Rackspace Cloud Server billing model; displayed in the lower bar toward the right in green text on a black background; there is a leading '~' to indicate that this is an estimation, and the monetary units are US Dollars '$' + +\fBrcs_cost\fP \- an estimation of the cost of the current boot of the system in terms of the Amazon EC2 billing model; displayed in the lower bar toward the right in green text on a black background; there is a leading '~' to indicate that this is an estimation, and the monetary units are US Dollars '$' \fBfan_speed\fP \- cpu or system fan speed as reported by lm-sensors; displayed in the lower bar toward the right in black text on a grey background; there is a trailing 'rpm' for units From 0d16375442adc8323b692822daec50af5291fc47 Mon Sep 17 00:00:00 2001 From: Jon Bernard Date: Wed, 28 Apr 2010 11:29:39 -0400 Subject: [PATCH 2/3] Include rcs_cost in statusline --- usr/share/byobu/profiles/common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usr/share/byobu/profiles/common b/usr/share/byobu/profiles/common index cdd9c0c6..a2e15d97 100644 --- a/usr/share/byobu/profiles/common +++ b/usr/share/byobu/profiles/common @@ -105,7 +105,7 @@ source $HOME/.byobu/keybindings caption always "%12`%?%-Lw%50L>%?%{=r}%n*%f %t%?(%u)%?%{-}%12`%?%+Lw%?%11` %=%12`%110`%109`%122`%111`%10`%<" # Status string, last line -hardstatus string '%99`%{-}%{=r}%12` %100`%112`%= %130`%102`%101`%129`%131`%127`%114`%115`%108`%128`%125`%126`%113`%119`%133`%117`%116`%106`%104`%103`%105`%107`%123`%132`%120`%121`' +hardstatus string '%99`%{-}%{=r}%12` %100`%112`%= %130`%102`%101`%129`%131`%127`%114`%115`%108`%134`%128`%125`%126`%113`%119`%133`%117`%116`%106`%104`%103`%105`%107`%123`%132`%120`%121`' # NOTE: Older version of screen have an arbitrary limit of only being able # to change colors 16 times in this 'hardstatus string'. From 97c3df898c08cb9fea6abee109a9c27781c426ea Mon Sep 17 00:00:00 2001 From: Jon Bernard Date: Wed, 28 Apr 2010 11:31:40 -0400 Subject: [PATCH 3/3] Use tabs instead of spaces in rcs_cost --- usr/lib/byobu/rcs_cost | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/usr/lib/byobu/rcs_cost b/usr/lib/byobu/rcs_cost index 6d9706ad..e2ff11f1 100755 --- a/usr/lib/byobu/rcs_cost +++ b/usr/lib/byobu/rcs_cost @@ -26,12 +26,12 @@ DETAIL=0 PKG="byobu" color 2>/dev/null || color() { true; } -for arg in "$@"; do - case "$arg" in - -d|--detail) - DETAIL=1 - ;; - esac +for arg in $@; do + case "$arg" in + -d|--detail) + DETAIL=1 + ;; + esac done # Approximate Instance Cost Basis @@ -53,7 +53,7 @@ memory=$((${memory} - (${memory} % (64 * 1024)))) # Apply the going rate INCREMENTS="256 512 1024 2048 4096 8192 16384 32768 65536" for X in ${INCREMENTS}; do - test "$((${X} * 1024 + 65536))" -ge ${memory} && break + test "$((${X} * 1024 + 65536))" -ge ${memory} && break done MEMORY_RATE=`echo "$X" | awk '{printf "%f", $1 / 256 * 15 / 1000}'` @@ -81,19 +81,19 @@ uptime_cost=`echo "$hours" | awk "{printf \"%f\", "$MEMORY_RATE" * $hours}"` total_cost=`echo "$network_cost" "$uptime_cost" | awk '{printf "%.2f", $1 + $2}'` if [ "$DETAIL" = "1" ]; then - echo "==========================================================" - echo "Estimated cost in Rackspace Cloud Server 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 @ \$$MEMORY_RATE/hr" - echo " Uptime cost: \$$uptime_cost" - echo "----------------------------------------------------------" - echo "Total cost: ~\$$total_cost" - echo "==========================================================" - exit 0 + echo "==========================================================" + echo "Estimated cost in Rackspace Cloud Server 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 @ \$$MEMORY_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