#!/usr/bin/env python | |
import os | |
import sys | |
import json | |
import pprint | |
import argparse | |
import boto3 | |
import misc | |
import certs | |
import thing | |
import policy | |
pp = pprint.PrettyPrinter(indent=4) | |
def check_aws_configuration(): | |
mysession = boto3.session.Session() | |
if not mysession._session._config['profiles']: | |
print("AWS not configured. Please run `aws configure`.") | |
sys.exit(1) | |
def prereq(): | |
with open('configure.json') as configure_file: | |
json_text = json.load(configure_file) | |
# Create a Thing | |
thing_name = json_text['thing_name'] | |
thing_obj = thing.Thing(thing_name) | |
if not thing_obj.create(): | |
# Create a Certificate | |
cert_obj = certs.Certificate() | |
result = cert_obj.create() | |
# Store certId | |
cert_id = result['certificateId'] | |
cert_id_filename = thing_name + '_cert_id_file.txt' | |
cert_id_file = open(cert_id_filename, 'w') | |
cert_id_file.write(cert_id) | |
cert_id_file_path = os.path.abspath(cert_id_filename) | |
os.chmod(cert_id_file_path, 0o444) | |
cert_id_file.close() | |
# Store cert_pem as file | |
cert_pem = result['certificatePem'] | |
cert_pem_filename = thing_name + '_cert_pem_file.pem' | |
cert_pem_file = open(cert_pem_filename, 'w') | |
cert_pem_file.write(cert_pem) | |
cert_pem_file_path = os.path.abspath(cert_pem_filename) | |
os.chmod(cert_pem_file_path, 0o444) | |
cert_pem_file.close() | |
# Store private key PEM as file | |
private_key_pem = result['keyPair']['PrivateKey'] | |
private_key_pem_filename = thing_name + '_private_key_pem_file.pem' | |
private_key_pem_file = open(private_key_pem_filename, 'w') | |
private_key_pem_file.write(private_key_pem) | |
private_key_pem_file_path = os.path.abspath(private_key_pem_filename) | |
os.chmod(private_key_pem_file_path, 0o444) | |
private_key_pem_file.close() | |
# Create a Policy | |
policy_document = misc.create_policy_document() | |
policy_name = thing_name + '_amazon_freertos_policy' | |
policy_obj = policy.Policy(policy_name, policy_document) | |
policy_obj.create() | |
# Attach certificate to Thing | |
cert_obj.attach_thing(thing_name) | |
# Attach policy to certificate | |
cert_obj.attach_policy(policy_name) | |
def update_credential_file(): | |
with open('configure.json') as configure_file: | |
json_text = json.load(configure_file) | |
source_dir = os.path.expanduser(json_text['FreeRTOS_source_dir']) | |
thing_name = json_text['thing_name'] | |
# Read cert_pem from file | |
cert_pem_filename = thing_name + '_cert_pem_file.pem' | |
try: | |
cert_pem_file = open(cert_pem_filename, 'r') | |
except IOError: | |
print("{} file not found. Run prerequisite step" | |
.format(cert_pem_filename)) | |
sys.exit(1) | |
else: | |
cert_pem = cert_pem_file.read() | |
# Read private_key_pem from file | |
private_key_pem_filename = thing_name + '_private_key_pem_file.pem' | |
try: | |
private_key_pem_file = open(private_key_pem_filename, 'r') | |
except IOError: | |
print("{} file not found. Run prerequisite step" | |
.format(private_key_pem_filename)) | |
sys.exit(1) | |
else: | |
private_key_pem = private_key_pem_file.read() | |
# Modify 'iot_clientcredential.h' file | |
misc.write_client_credentials( | |
source_dir, | |
thing_name=thing_name, | |
client_certificate_pem=cert_pem, | |
client_private_key_pem=private_key_pem, | |
cleanup=False) | |
def delete_prereq(): | |
with open('configure.json') as configure_file: | |
json_text = json.load(configure_file) | |
# Delete Thing | |
thing_name = json_text['thing_name'] | |
thing_obj = thing.Thing(thing_name) | |
if thing_obj.exists(): | |
thing_obj.delete() | |
# Delete certificate | |
cert_id_filename = thing_name + '_cert_id_file.txt' | |
if os.path.exists(cert_id_filename): | |
cert_id_file = open(cert_id_filename, 'r') | |
cert_id = cert_id_file.read() | |
cert_obj = certs.Certificate(cert_id) | |
cert_obj.delete() | |
cert_id_file.close() | |
cert_id_file_path = os.path.abspath(cert_id_filename) | |
os.chmod(cert_id_file_path, 0o666) | |
os.remove(cert_id_filename) | |
# Delete cert_pem file and private_key_pem file | |
cert_pem_filename = thing_name + '_cert_pem_file.pem' | |
if os.path.exists(cert_pem_filename): | |
cert_pem_file_path = os.path.abspath(cert_pem_filename) | |
os.chmod(cert_pem_file_path, 0o666) | |
os.remove(cert_pem_filename) | |
private_key_pem_filename = thing_name + '_private_key_pem_file.pem' | |
if os.path.exists(private_key_pem_filename): | |
private_key_pem_file_path = os.path.abspath(private_key_pem_filename) | |
os.chmod(private_key_pem_file_path, 0o666) | |
os.remove(private_key_pem_filename) | |
# Delete policy | |
policy_name = thing_name + '_amazon_freertos_policy' | |
policy_obj = policy.Policy(policy_name) | |
if policy_obj.exists(): | |
policy_obj.delete() | |
def cleanup_creds(): | |
with open('configure.json') as file: | |
json_text = json.load(file) | |
source_dir = os.path.expanduser(json_text['FreeRTOS_source_dir']) | |
# Cleanup 'iot_clientcredential.h' file | |
misc.write_client_credentials(source_dir, cleanup=True) | |
def setup(): | |
prereq() | |
update_credential_file() | |
print("Setup Completed") | |
def cleanup(): | |
delete_prereq() | |
cleanup_creds() | |
print("Cleanup Completed") | |
def list_certificates(): | |
client = boto3.client('iot') | |
certs = client.list_certificates()['certificates'] | |
pp.pprint(certs) | |
def list_things(): | |
client = boto3.client('iot') | |
things = client.list_things()['things'] | |
pp.pprint(things) | |
def list_policies(): | |
client = boto3.client('iot') | |
policies = client.list_policies()['policies'] | |
pp.pprint(policies) | |
if __name__ == "__main__": | |
arg_parser = argparse.ArgumentParser() | |
subparsers = arg_parser.add_subparsers(help='Available commands', | |
dest='command') | |
subparsers.add_parser('setup', help='Setup AWS IoT') | |
subparsers.add_parser('cleanup', help='Cleanup AWS IoT') | |
subparsers.add_parser('list_certificates', help='List certificates') | |
subparsers.add_parser('list_things', help='List things') | |
subparsers.add_parser('list_policies', help='List policies') | |
subparsers.add_parser('prereq', help='Setup prerequisites for AWS IoT') | |
subparsers.add_parser('update_creds', help='Update credential files') | |
subparsers.add_parser('delete_prereq', help='Delete prerequisites created') | |
subparsers.add_parser('cleanup_creds', help='Cleanup credential files') | |
args = arg_parser.parse_args() | |
check_aws_configuration() | |
if args.command == 'setup': | |
setup() | |
elif args.command == 'cleanup': | |
cleanup() | |
elif args.command == 'list_certificates': | |
list_certificates() | |
elif args.command == 'list_things': | |
list_things() | |
elif args.command == 'list_policies': | |
list_policies() | |
elif args.command == 'prereq': | |
prereq() | |
elif args.command == 'update_creds': | |
update_credential_file() | |
elif args.command == 'delete_prereq': | |
delete_prereq() | |
elif args.command == 'cleanup_creds': | |
cleanup_creds() | |
else: | |
print("Command does not exist") | |
sys.exit(1) |