Skip to content
Snippets Groups Projects
rabbitmq-client.py 2.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python3
    import pika
    import dbus
    from random import randint
    from time import sleep
    
    server_host = 'rabbitmq.edu-al.unipmn.it';
    server_port = 5672;
    server_username = 'labmanager-client';
    server_pwd = '3aB7=2zV9:1jN3-4hE2';
    server_vhost = 'labmanager';
    
    exchange_name = 'labmanager-test';
    exchange_type = 'x-recent-history'; # It's a plugin. Enable with 'rabbitmq-plugins enable rabbitmq_recent_history_exchange'
    
    systemd_getconfig_unit_name = 'esame-get-config.service'
    
    bus = dbus.SystemBus()
    systemd = bus.get_object(
        'org.freedesktop.systemd1',
        '/org/freedesktop/systemd1'
    )
    
    manager = dbus.Interface(
        systemd,
        'org.freedesktop.systemd1.Manager'
    )
    
    server_credentials = pika.PlainCredentials(server_username, server_pwd, True)
    
    while True:
        try:
    
            connection = pika.BlockingConnection(
                pika.ConnectionParameters(
                    host=server_host,
                    port=server_port,
                    virtual_host=server_vhost,
                    credentials=server_credentials
                )
            )
    
            channel = connection.channel()
    
            '''
            L'exchange lo dichiara il publisher
            TODO: qui serve sapere se esiste gia' e in caso negativo aspettare e ripetere (valutare se usare passive=true)
            '''
            # channel.exchange_declare(exchange=exchange_name, exchange_type=exchange_type)
    
            result = channel.queue_declare(queue='', exclusive=True)
            queue_name = result.method.queue
    
            channel.queue_bind(exchange=exchange_name, queue=queue_name)
    
            print('Waiting for RabbitMQ messages')
    
            def callback(ch, method, properties, body):
                # Sleep a random number of seconds (between 1 and 10)
                # to avoid all machines reboot at the same time
                sleep(randint(1,10))
                
                print("RabbitMQ message: %s" % body.decode('UTF-8'))
                start_unit = manager.StartUnit(systemd_getconfig_unit_name, 'fail')
    
            channel.basic_consume(
                queue=queue_name, on_message_callback=callback, auto_ack=True)
    
            channel.start_consuming()
    
        except pika.exceptions.ConnectionClosedByBroker:
            break
        # Don't recover on channel errors
        except pika.exceptions.AMQPChannelError:
            break
        # Recover on all other connection errors
        except pika.exceptions.AMQPConnectionError:
            continue