Software / code / prosody
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 }; |