miscell
[plcapi.git] / PLC / Methods / GetPeers.py
index cc85ef1..4a77ce4 100644 (file)
@@ -1,28 +1,47 @@
 #
 # Thierry Parmentelat - INRIA
-# 
+#
 
 from PLC.Faults import *
 from PLC.Method import Method
 from PLC.Parameter import Parameter, Mixed
+from PLC.Filter import Filter
 from PLC.Auth import Auth
 
+from PLC.Persons import Person
 from PLC.Peers import Peer, Peers
 
 class GetPeers (Method):
     """
-    returns information on known peers
+    Returns an array of structs containing details about peers. If
+    peer_filter is specified and is an array of peer identifiers or
+    peer names, or a struct of peer attributes, only peers matching
+    the filter will be returned. If return_fields is specified, only the
+    specified details will be returned.
     """
 
-    roles = ['admin']
+    roles = ['admin', 'node', 'pi', 'user']
 
-    accepts = [Auth(),
-              [Mixed(Peer.fields['peer_id'],
-                     Peer.fields['peername'])],
-              ]
+    accepts = [
+        Auth(),
+        Mixed([Mixed(Peer.fields['peer_id'],
+                     Peer.fields['peername'])],
+              Filter(Peer.fields)),
+        Parameter([str], "List of fields to return", nullok = True)
+        ]
 
     returns = [Peer.fields]
 
-    def call (self, auth, peer_id_or_peername_list = None):
+    def call (self, auth, peer_filter = None, return_fields = None):
+
+        peers = Peers(self.api, peer_filter, return_fields)
+
+        # Remove admin only fields
+        if not isinstance(self.caller, Person) or \
+                'admin' not in self.caller['roles']:
+            for peer in peers:
+                for field in ['key', 'cacert']:
+                    if field in peer:
+                        del peer[field]
 
-       return Peers (self.api, peer_id_or_peername_list).values()
+        return peers