diff options
Diffstat (limited to 'py3status/modules/aws_bill.py')
| -rwxr-xr-x | py3status/modules/aws_bill.py | 96 |
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) |
