def get_userstats(self,user,comp_name,domain): """ Get stats of user. Accepts params: user - user jid comp_name - component name which should receive answer (usually we are) domain - our domain returns callback with one cb added - it converts answer to dict with fields name,fulljid,ip,status """ def process_stats(item): """ Process result of user-stats command Extract IP address and related info and returns it as dict """ x = xpath.queryForNodes("//x/field[@var='ipaddresses']",item) if not x: raise ValueError, "Wrong response from stats-request" frm = Form.fromElement(x[0]) values = frm.getValues() jid = JID(values['accountjid']) ipport = values['ipaddresses'] ip, port = ipport.split(':') userstats = dict() userstats['username'] = jid.userhost() userstats['fulljid'] = jid.full() #full jid which causes current change, i.e. which is connestion actualy used userstats['ip'] = ip return userstats #TODO: implement error handling if ACL doesn't allows us to call admin commands iq = IQ(self.xmlstream) iq['to'] = domain iq['from'] = comp_name cmd = iq.addElement((NS_COMMANDS,'command')) cmd['node'] = CMD_ADMIN_USER_STATS frm = Form('submit') frm.addField( Field(fieldType='hidden',var='FORM_TYPE',value=NS_ADMIN) ) frm.addField( Field(fieldType='jid-single',var='accountjid',value=user.full()) ) cmd.addChild(frm.toElement()) d = iq.send(domain) d.addCallback(process_stats) return d
def configure_node(data): request = PubSubRequestWithConf('configureSet') request.recipient = JID(self.pubsub_name) request.nodeIdentifier = PUB_NODE request.sender = JID(self.name) frm = Form('submit') frm.addField( Field(fieldType='hidden',var='FORM_TYPE',value=NS_PUBSUB_NODE_CONFIG) ) frm.addField( Field(var='pubsub#title',value='Live presence events') ) frm.addField( Field(var='pubsub#persist_items',value='1') ) frm.addField( Field(var='pubsub#deliver_payloads',value='1') ) frm.addField( Field(var='pubsub#send_last_published_item',value='never') ) frm.addField( Field(var='pubsub#presence_based_delivery',value='0') ) frm.addField( Field(var='pubsub#access_model',value='open') ) frm.addField( Field(var='pubsub#node_type',value='leaf') ) frm.addField( Field(var='pubsub#max_items',value='100') ) request.configureForm = frm request.send(self.xmlstream)