summaryrefslogtreecommitdiffstats
path: root/py3status/modules
diff options
context:
space:
mode:
Diffstat (limited to 'py3status/modules')
-rwxr-xr-xpy3status/modules/aws_bill.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/py3status/modules/aws_bill.py b/py3status/modules/aws_bill.py
new file mode 100755
index 0000000..6336da4
--- /dev/null
+++ b/py3status/modules/aws_bill.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+"""
+Display the current AWS bill.
+
+##### WARNING #####
+This module generate some costs on the AWS bill. Take care about the cache_timout to limit these fees !
+##### WARNING #####
+
+Configuration parameters:
+ - aws_access_key_id : Your AWS access key
+ - aws_secret_access_key : Your AWS secret key
+ - aws_account_id : the root ID of the AWS account. Can be find here https://console.aws.amazon.com/billing/home#/account
+ - s3_bucket_name : the bucket where billing files are sent by AWS. Follow this article to activate this feature : http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/detailed-billing-reports.html
+ - billing_file : where the billing file must be stored
+ - cache_timeout : how often we refresh this module in seconds
+
+@author nawadanp
+"""
+
+import csv
+import datetime
+import boto
+
+from boto.s3.connection import Key
+from time import time
+
+class Py3status:
+
+ # available configuration parameters
+ aws_access_key_id = ''
+ aws_secret_access_key = ''
+ aws_account_id = ''
+ s3_bucket_name = ''
+ billing_file = '/tmp/.aws_billing.csv'
+ cache_timeout = 3600
+
+ def _get_bill_amount(self):
+ # Billing file name, generated by Amazon itself
+ # Format : 123456789012-aws-billing-csv-yyyy-mm.csv
+ s3_file_key = self.aws_account_id + '-aws-billing-csv-' + datetime.datetime.now().strftime("%Y") + '-' + datetime.datetime.now().strftime("%m") + '.csv'
+ i = 0
+
+ # Connect to the bucket
+ conn = boto.connect_s3(self.aws_access_key_id, self.aws_secret_access_key)
+ bucket = conn.get_bucket(self.s3_bucket_name)
+
+ # Fetch the objects keys and get the billing file
+ k = Key(bucket)
+ k.key = s3_file_key
+ try:
+ k.get_contents_to_filename(self.billing_file)
+ except:
+ return False
+ k.close
+
+ # Parse the file and get the InvoiceTotal amount
+ with open(self.billing_file,'rb') as f:
+ reader = csv.reader(f)
+ for row in reader:
+ if ''.join(row).find('InvoiceTotal') == -1:
+ continue
+ i = i+1
+ return row[-1]
+
+
+ def aws_bill(self, i3s_output_list, i3s_config):
+ response = {
+ 'cached_until': time() + self.cache_timeout,
+ 'full_text': ''
+ }
+
+ bill_amount = self._get_bill_amount()
+
+ if bill_amount:
+ response['full_text'] = str(bill_amount) + "$"
+ response['color'] = i3s_config['color_good']
+ else:
+ response['full_text'] = "Billing file not found in the bucket"
+ response['color'] = i3s_config['color_bad']
+
+ return response
+
+
+if __name__ == "__main__":
+ """
+ Test this module by calling it directly.
+ """
+ from time import sleep
+ x = Py3status()
+ config = {
+ 'color_good': '#00FF00',
+ 'color_bad': '#FF0000',
+ }
+ while True:
+ print(x.aws_bill([], config))
+ sleep(1)