Software / code / prosody
Comparison
core/portmanager.lua @ 6779:6236668da30a
core.*: Remove use of module() function
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 21 Feb 2015 10:42:19 +0100 |
| parent | 6688:1d4fb397e561 |
| child | 6788:d64c1f3c7e2e |
comparison
equal
deleted
inserted
replaced
| 6778:4009ae66e0f0 | 6779:6236668da30a |
|---|---|
| 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 function deactivate(service_name, service_info) |
| 155 for name, interface, port, n, active_service --luacheck: ignore 213/name 213/n | 146 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 | 147 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 | 148 if service_info == nil or active_service.service == service_info then |
| 158 close(interface, port); | 149 close(interface, port); |
| 159 end | 150 end |
| 160 end | 151 end |
| 161 log("info", "Deactivated service '%s'", service_name or service_info.name); | 152 log("info", "Deactivated service '%s'", service_name or service_info.name); |
| 162 end | 153 end |
| 163 | 154 |
| 164 function register_service(service_name, service_info) | 155 local function register_service(service_name, service_info) |
| 165 table.insert(services[service_name], service_info); | 156 table.insert(services[service_name], service_info); |
| 166 | 157 |
| 167 if not active_services:get(service_name) then | 158 if not active_services:get(service_name) then |
| 168 log("debug", "No active service for %s, activating...", service_name); | 159 log("debug", "No active service for %s, activating...", service_name); |
| 169 local ok, err = activate(service_name); | 160 local ok, err = activate(service_name); |
| 174 | 165 |
| 175 fire_event("service-added", { name = service_name, service = service_info }); | 166 fire_event("service-added", { name = service_name, service = service_info }); |
| 176 return true; | 167 return true; |
| 177 end | 168 end |
| 178 | 169 |
| 179 function unregister_service(service_name, service_info) | 170 local function unregister_service(service_name, service_info) |
| 180 log("debug", "Unregistering service: %s", service_name); | 171 log("debug", "Unregistering service: %s", service_name); |
| 181 local service_info_list = services[service_name]; | 172 local service_info_list = services[service_name]; |
| 182 for i, service in ipairs(service_info_list) do | 173 for i, service in ipairs(service_info_list) do |
| 183 if service == service_info then | 174 if service == service_info then |
| 184 table.remove(service_info_list, i); | 175 table.remove(service_info_list, i); |
| 189 activate(service_name); -- Re-activate with the next available one | 180 activate(service_name); -- Re-activate with the next available one |
| 190 end | 181 end |
| 191 fire_event("service-removed", { name = service_name, service = service_info }); | 182 fire_event("service-removed", { name = service_name, service = service_info }); |
| 192 end | 183 end |
| 193 | 184 |
| 194 function close(interface, port) | 185 local function close(interface, port) |
| 195 local service, service_server = get_service_at(interface, port); | 186 local service, service_server = get_service_at(interface, port); |
| 196 if not service then | 187 if not service then |
| 197 return false, "port-not-open"; | 188 return false, "port-not-open"; |
| 198 end | 189 end |
| 199 service_server:close(); | 190 service_server:close(); |
| 200 active_services:remove(service.name, interface, port); | 191 active_services:remove(service.name, interface, port); |
| 201 log("debug", "Removed listening service %s from [%s]:%d", service.name, interface, port); | 192 log("debug", "Removed listening service %s from [%s]:%d", service.name, interface, port); |
| 202 return true; | 193 return true; |
| 203 end | 194 end |
| 204 | 195 |
| 205 function get_service_at(interface, port) | 196 local function get_service_at(interface, port) |
| 206 local data = active_services:search(nil, interface, port)[1][1]; | 197 local data = active_services:search(nil, interface, port)[1][1]; |
| 207 return data.service, data.server; | 198 return data.service, data.server; |
| 208 end | 199 end |
| 209 | 200 |
| 210 function get_service(service_name) | 201 local function get_service(service_name) |
| 211 return (services[service_name] or {})[1]; | 202 return (services[service_name] or {})[1]; |
| 212 end | 203 end |
| 213 | 204 |
| 214 function get_active_services() | 205 local function get_active_services() |
| 215 return active_services; | 206 return active_services; |
| 216 end | 207 end |
| 217 | 208 |
| 218 function get_registered_services() | 209 local function get_registered_services() |
| 219 return services; | 210 return services; |
| 220 end | 211 end |
| 221 | 212 |
| 222 return _M; | 213 -- Event handlers |
| 214 | |
| 215 prosody.events.add_handler("item-added/net-provider", function (event) | |
| 216 local item = event.item; | |
| 217 register_service(item.name, item); | |
| 218 end); | |
| 219 prosody.events.add_handler("item-removed/net-provider", function (event) | |
| 220 local item = event.item; | |
| 221 unregister_service(item.name, item); | |
| 222 end); | |
| 223 | |
| 224 return { | |
| 225 activate = activate; | |
| 226 deactivate = deactivate; | |
| 227 register_service = register_service; | |
| 228 unregister_service = unregister_service; | |
| 229 close = close; | |
| 230 get_service_at = get_service_at; | |
| 231 get_service = get_service; | |
| 232 get_active_services = get_active_services; | |
| 233 get_registered_services = get_registered_services; | |
| 234 }; |