import time

import boto3
#from dateutil import tz


def parse_command_id(send_command_output):
    return send_command_output['Command']['CommandId']

def main():
    ec2_client = boto3.client('ec2')
    ssm_client = boto3.client('ssm')

    # Get the list of instance IDs and their states
    instances_response = ec2_client.describe_instances()
    instances = [
        (instance['InstanceId'], instance['State']['Name'])
        for reservation in instances_response['Reservations']
        for instance in reservation['Instances']
    ]

    for instance_id, state in instances:
        if state == 'running':
            print(f"Starting command for instance: {instance_id}")

            # Send command to the instance
            send_command_output = ssm_client.send_command(
                DocumentName="AWS-RunShellScript",
                Targets=[{"Key": "instanceids", "Values": [instance_id]}],
                Parameters={'commands': ['sudo su - -c "tail /var/log/cloud-init-output.log"']}
            )

            # Get the command ID
            command_id = parse_command_id(send_command_output)

            # Check the command status every second for 4 seconds
            for _ in range(4):
                time.sleep(20)
                command_status = ssm_client.list_command_invocations(CommandId=command_id, Details=True)
                
                print(command_status)
                for invocation in command_status['CommandInvocations']:
                    if invocation['Status'] == 'Success':
                        for plugin in invocation['CommandPlugins']:
                            if plugin['Status'] == 'Success':
                                print(f"Output from instance {instance_id}:\n{plugin['Output']}")
                            else:
                                print(f"Error in plugin execution for instance {instance_id}: {plugin['StatusDetails']}")
                    else:
                        print(f"Command for instance {instance_id} is still in progress... Status: {invocation['Status']}")


if __name__ == "__main__":
    main()