Comparison

core/portmanager.lua @ 6791:e813e8cf6046

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Thu, 20 Aug 2015 13:05:22 +0200
parent 6788:d64c1f3c7e2e
child 6980:daaa52b3f45f
comparison
equal deleted inserted replaced
6776:4412a2307c89 6791:e813e8cf6046
12 local type, tonumber, tostring, ipairs = type, tonumber, tostring, ipairs; 12 local type, tonumber, tostring, ipairs = type, tonumber, tostring, ipairs;
13 13
14 local prosody = prosody; 14 local prosody = prosody;
15 local fire_event = prosody.events.fire_event; 15 local fire_event = prosody.events.fire_event;
16 16
17 module "portmanager"; 17 local _ENV = nil;
18 18
19 --- Config 19 --- Config
20 20
21 local default_interfaces = { }; 21 local default_interfaces = { };
22 local default_local_interfaces = { }; 22 local default_local_interfaces = { };
61 friendly_message = "Prosody does not have sufficient privileges to use this port"; 61 friendly_message = "Prosody does not have sufficient privileges to use this port";
62 end 62 end
63 return friendly_message; 63 return friendly_message;
64 end 64 end
65 65
66 prosody.events.add_handler("item-added/net-provider", function (event)
67 local item = event.item;
68 register_service(item.name, item);
69 end);
70 prosody.events.add_handler("item-removed/net-provider", function (event)
71 local item = event.item;
72 unregister_service(item.name, item);
73 end);
74
75 --- Public API 66 --- Public API
76 67
77 function activate(service_name) 68 local function activate(service_name)
78 local service_info = services[service_name][1]; 69 local service_info = services[service_name][1];
79 if not service_info then 70 if not service_info then
80 return nil, "Unknown service: "..service_name; 71 return nil, "Unknown service: "..service_name;
81 end 72 end
82 73
149 end 140 end
150 log("info", "Activated service '%s' on %s", service_name, #hooked_ports == 0 and "no ports" or table.concat(hooked_ports, ", ")); 141 log("info", "Activated service '%s' on %s", service_name, #hooked_ports == 0 and "no ports" or table.concat(hooked_ports, ", "));
151 return true; 142 return true;
152 end 143 end
153 144
154 function deactivate(service_name, service_info) 145 local close; -- forward declaration
146
147 local function deactivate(service_name, service_info)
155 for name, interface, port, n, active_service --luacheck: ignore 213/name 213/n 148 for name, interface, port, n, active_service --luacheck: ignore 213/name 213/n
156 in active_services:iter(service_name or service_info and service_info.name, nil, nil, nil) do 149 in active_services:iter(service_name or service_info and service_info.name, nil, nil, nil) do
157 if service_info == nil or active_service.service == service_info then 150 if service_info == nil or active_service.service == service_info then
158 close(interface, port); 151 close(interface, port);
159 end 152 end
160 end 153 end
161 log("info", "Deactivated service '%s'", service_name or service_info.name); 154 log("info", "Deactivated service '%s'", service_name or service_info.name);
162 end 155 end
163 156
164 function register_service(service_name, service_info) 157 local function register_service(service_name, service_info)
165 table.insert(services[service_name], service_info); 158 table.insert(services[service_name], service_info);
166 159
167 if not active_services:get(service_name) then 160 if not active_services:get(service_name) then
168 log("debug", "No active service for %s, activating...", service_name); 161 log("debug", "No active service for %s, activating...", service_name);
169 local ok, err = activate(service_name); 162 local ok, err = activate(service_name);
174 167
175 fire_event("service-added", { name = service_name, service = service_info }); 168 fire_event("service-added", { name = service_name, service = service_info });
176 return true; 169 return true;
177 end 170 end
178 171
179 function unregister_service(service_name, service_info) 172 local function unregister_service(service_name, service_info)
180 log("debug", "Unregistering service: %s", service_name); 173 log("debug", "Unregistering service: %s", service_name);
181 local service_info_list = services[service_name]; 174 local service_info_list = services[service_name];
182 for i, service in ipairs(service_info_list) do 175 for i, service in ipairs(service_info_list) do
183 if service == service_info then 176 if service == service_info then
184 table.remove(service_info_list, i); 177 table.remove(service_info_list, i);
189 activate(service_name); -- Re-activate with the next available one 182 activate(service_name); -- Re-activate with the next available one
190 end 183 end
191 fire_event("service-removed", { name = service_name, service = service_info }); 184 fire_event("service-removed", { name = service_name, service = service_info });
192 end 185 end
193 186
187 local get_service_at -- forward declaration
188
194 function close(interface, port) 189 function close(interface, port)
195 local service, service_server = get_service_at(interface, port); 190 local service, service_server = get_service_at(interface, port);
196 if not service then 191 if not service then
197 return false, "port-not-open"; 192 return false, "port-not-open";
198 end 193 end
205 function get_service_at(interface, port) 200 function get_service_at(interface, port)
206 local data = active_services:search(nil, interface, port)[1][1]; 201 local data = active_services:search(nil, interface, port)[1][1];
207 return data.service, data.server; 202 return data.service, data.server;
208 end 203 end
209 204
210 function get_service(service_name) 205 local function get_service(service_name)
211 return (services[service_name] or {})[1]; 206 return (services[service_name] or {})[1];
212 end 207 end
213 208
214 function get_active_services() 209 local function get_active_services()
215 return active_services; 210 return active_services;
216 end 211 end
217 212
218 function get_registered_services() 213 local function get_registered_services()
219 return services; 214 return services;
220 end 215 end
221 216
222 return _M; 217 -- Event handlers
218
219 prosody.events.add_handler("item-added/net-provider", function (event)
220 local item = event.item;
221 register_service(item.name, item);
222 end);
223 prosody.events.add_handler("item-removed/net-provider", function (event)
224 local item = event.item;
225 unregister_service(item.name, item);
226 end);
227
228 return {
229 activate = activate;
230 deactivate = deactivate;
231 register_service = register_service;
232 unregister_service = unregister_service;
233 close = close;
234 get_service_at = get_service_at;
235 get_service = get_service;
236 get_active_services = get_active_services;
237 get_registered_services = get_registered_services;
238 };