test: Support the possibility to input multiple parameters into simple-agent
[framework/connectivity/connman.git] / test / simple-agent
1 #!/usr/bin/python
2
3 import gobject
4
5 import dbus
6 import dbus.service
7 import dbus.mainloop.glib
8 import sys
9
10 class Canceled(dbus.DBusException):
11         _dbus_error_name = "net.connman.Error.Canceled"
12
13 class Agent(dbus.service.Object):
14         name = None
15         ssid = None
16         identity = None
17         passphrase = None
18         wpspin = None
19         username = None
20         password = None
21
22         @dbus.service.method("net.connman.Agent",
23                                         in_signature='', out_signature='')
24         def Release(self):
25                 print("Release")
26                 mainloop.quit()
27
28         def input_passphrase(self):
29                 response = {}
30
31                 if not self.identity and not self.passphrase and not self.wpspin:
32                         args = raw_input('Answer: ')
33
34                         for arg in args.split():
35                                 if arg.startswith("Identity="):
36                                         identity = arg.replace("Identity=", "", 1)
37                                         response["Identity"] = identity
38                                 if arg.startswith("Passphrase="):
39                                         passphrase = arg.replace("Passphrase=", "", 1)
40                                         response["Passphrase"] = passphrase
41                                 if arg.startswith("WPS="):
42                                         wpspin = arg.replace("WPS=", "", 1)
43                                         response["WPS"] = wpspin
44                                         break
45                 else:
46                         if self.identity:
47                                 response["Identity"] = self.identity
48                         if self.passphrase:
49                                 response["Passphrase"] = self.passphrase
50                         if self.wpspin:
51                                 response["WPS"] = self.wpspin
52
53                 return response
54
55         def input_username(self):
56                 response = {}
57
58                 if not self.username and not self.password:
59                         args = raw_input('Answer: ')
60
61                         for arg in args.split():
62                                 if arg.startswith("Username="):
63                                         username = arg.replace("Username=", "", 1)
64                                         response["Username"] = username
65                                 if arg.startswith("Password="):
66                                         password = arg.replace("Password=", "", 1)
67                                         response["Password"] = password
68                 else:
69                         if self.username:
70                                 response["Username"] = self.username
71                         if self.password:
72                                 response["Password"] = self.password
73
74                 return response
75
76         def input_hidden(self):
77                 response = {}
78
79                 if not self.name and not self.ssid:
80                         args = raw_input('Answer ')
81
82                         for arg in args.split():
83                                 if arg.startswith("Name="):
84                                         name = arg.replace("Name=", "", 1)
85                                         response["Name"] = name
86                                         break
87                                 if arg.startswith("SSID="):
88                                         ssid = arg.replace("SSID", "", 1)
89                                         response["SSID"] = ssid
90                                         break
91                 else:
92                         if self.name:
93                                 response["Name"] = self.name
94                         if self.ssid:
95                                 response["SSID"] = self.ssid
96
97                 return response
98
99         @dbus.service.method("net.connman.Agent",
100                                         in_signature='oa{sv}',
101                                         out_signature='a{sv}')
102         def RequestInput(self, path, fields):
103                 print "RequestInput (%s,%s)" % (path, fields)
104
105                 response = None
106
107                 if fields.has_key("Name"):
108                         response = self.input_hidden()
109                 elif fields.has_key("Passphrase"):
110                         response = self.input_passphrase()
111                 elif fields.has_key("Username"):
112                         response = self.input_username()
113                 else:
114                         print "No method to answer the input request"
115
116                 print "returning (%s)" % (response)
117
118                 return response
119
120         @dbus.service.method("net.connman.Agent",
121                                         in_signature='os',
122                                         out_signature='')
123         def RequestBrowser(self, path, url):
124                 print "RequestBrowser (%s,%s)" % (path, url)
125
126                 print "Please login through the given url in a browser"
127                 print "Then press enter to accept or some text to cancel"
128
129                 args = raw_input('> ')
130
131                 if len(args) > 0:
132                         raise Canceled("canceled")
133
134                 return
135
136         @dbus.service.method("net.connman.Agent",
137                                         in_signature='os',
138                                         out_signature='')
139         def ReportError(self, path, error):
140                 print "ReportError %s, %s" % (path, error)
141                 retry = raw_input("Retry service (yes/no): ")
142                 if (retry == "yes"):
143                         class Retry(dbus.DBusException):
144                                 _dbus_error_name = "net.connman.Agent.Error.Retry"
145
146                         raise Retry("retry service")
147                 else:
148                         return
149
150
151         @dbus.service.method("net.connman.Agent",
152                                         in_signature='', out_signature='')
153         def Cancel(self):
154                 print "Cancel"
155
156 def print_usage():
157         print "Usage:"
158         print "For hidden service:"
159         print "%s Name=<hidden service name> [SSID=<hidden ssid>]" % (sys.argv[0])
160         print "For EAP/WPA input:"
161         print "%s Identity=<identity> Passphrase=<passphrase> WPS=<wpspin>" % (sys.argv[0])
162         print "For WISPr login input:"
163         print "%s Username=<username> Password=<password>" % (sys.argv[0])
164         print "Help: %s help" % (sys.argv[0])
165         sys.exit(1)
166
167 if __name__ == '__main__':
168         if len(sys.argv) == 2 and sys.argv[1] == "help":
169                 print_usage()
170
171         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
172
173         bus = dbus.SystemBus()
174         manager = dbus.Interface(bus.get_object('net.connman', "/"),
175                                         'net.connman.Manager')
176
177         path = "/test/agent"
178         object = Agent(bus, path)
179
180         if len(sys.argv) >= 2:
181                 for arg in sys.argv[1:]:
182                         if arg.startswith("Name="):
183                                 object.name = arg.replace("Name=", "", 1)
184                         elif arg.startswith("SSID="):
185                                 object.ssid = arg.replace("SSID=", "", 1)
186                         elif arg.startswith("Identity="):
187                                 object.identity = arg.replace("Identity=", "", 1)
188                         elif arg.startswith("Passphrase="):
189                                 object.passphrase = arg.replace("Passphrase=", "", 1)
190                         elif arg.startswith("WPS="):
191                                 object.wpspin = arg.replace("WPS=", "", 1)
192                         elif arg.startswith("Username="):
193                                 object.username = arg.replace("Username=", "", 1)
194                         elif arg.startswith("Password="):
195                                 object.password = arg.replace("Password=", "", 1)
196                         else:
197                                 print_usage()
198
199         manager.RegisterAgent(path)
200
201         mainloop = gobject.MainLoop()
202         mainloop.run()
203
204         #manager.UnregisterAgent(path)