| #!/usr/bin/env python | |
| # | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| # | |
| import optparse, traceback | |
| from qpid.messaging import * | |
| from qpid.log import enable, DEBUG, WARN | |
| from common import * | |
| parser = optparse.OptionParser(usage="usage: %prog [options]", | |
| description="machine inventory agent") | |
| parser.add_option("-b", "--broker", default="localhost", | |
| help="connect to specified BROKER (default %default)") | |
| parser.add_option("-d", "--database", | |
| help="database file for persistent machine status") | |
| parser.add_option("-a", "--address", default="reservations", | |
| help="address for reservation requests") | |
| parser.add_option("-v", dest="verbose", action="store_true", | |
| help="enable verbose logging") | |
| opts, args = parser.parse_args() | |
| if opts.verbose: | |
| enable("qpid", DEBUG) | |
| else: | |
| enable("qpid", WARN) | |
| conn = Connection.establish(opts.broker, reconnect=True, reconnect_interval=1) | |
| class Inventory(Dispatcher): | |
| def __init__(self): | |
| self.agents = {} | |
| def running(self): | |
| return True | |
| def do_status(self, msg): | |
| id, status, owner = get_status(msg) | |
| self.agents[id] = (status, owner) | |
| def do_query(self, msg): | |
| patterns = msg.content["identity"] | |
| result = [] | |
| for id, (status, owner) in self.agents.items(): | |
| if match(id, patterns): | |
| r = Message(properties = { | |
| "type": "status" | |
| }, | |
| content = { | |
| "identity": id, | |
| "status": status, | |
| "owner": owner | |
| }) | |
| result.append((msg.reply_to, r)) | |
| continue | |
| if not result: | |
| result.append((msg.reply_to, | |
| Message(properties = {"type": "empty"}))) | |
| return result | |
| def ignored(self, msg): | |
| type = msg.properties.get("type") | |
| return type not in ("status", "query") | |
| try: | |
| ssn = conn.session() | |
| rcv = ssn.receiver(opts.address, capacity = 10) | |
| snd = ssn.sender(opts.address) | |
| snd.send(Message(reply_to = opts.address, | |
| properties = {"type": "discover", "identity": ["*"]})) | |
| inv = Inventory() | |
| inv.run(ssn) | |
| except KeyboardInterrupt: | |
| pass | |
| finally: | |
| conn.close() |