Mercurial > prosody-hg
comparison core/portmanager.lua @ 4607:7f45b2cb3c03
portmanager: Add unregister_service(), and allow multiple services with the same name (they get queued)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 14 Mar 2012 21:39:02 +0000 |
| parents | d2bcb959d713 |
| children | 01d52f31b6b3 |
comparison
equal
deleted
inserted
replaced
| 4606:17785dbd9d58 | 4607:7f45b2cb3c03 |
|---|---|
| 11 table.insert(default_local_interfaces, "::1"); | 11 table.insert(default_local_interfaces, "::1"); |
| 12 end | 12 end |
| 13 | 13 |
| 14 --- Private state | 14 --- Private state |
| 15 | 15 |
| 16 -- service_name -> service_info | 16 -- service_name -> { service_info, ... } |
| 17 local services = {}; | 17 local services = setmetatable({}, { __index = function (t, k) rawset(t, k, {}); return rawget(t, k); end }); |
| 18 | 18 |
| 19 -- service_name, interface (string), port (number) | 19 -- service_name, interface (string), port (number) |
| 20 local active_services = multitable.new(); | 20 local active_services = multitable.new(); |
| 21 | 21 |
| 22 --- Private helpers | 22 --- Private helpers |
| 53 module("portmanager", package.seeall); | 53 module("portmanager", package.seeall); |
| 54 | 54 |
| 55 --- Public API | 55 --- Public API |
| 56 | 56 |
| 57 function activate_service(service_name) | 57 function activate_service(service_name) |
| 58 local service_info = services[service_name]; | 58 local service_info = services[service_name][1]; |
| 59 if not service_info then | 59 if not service_info then |
| 60 return nil, "Unknown service: "..service_name; | 60 return nil, "Unknown service: "..service_name; |
| 61 end | 61 end |
| 62 | 62 |
| 63 local bind_interfaces = set.new(config.get("*", service_name.."_interfaces") | 63 local bind_interfaces = set.new(config.get("*", service_name.."_interfaces") |
| 100 end | 100 end |
| 101 end | 101 end |
| 102 end | 102 end |
| 103 end | 103 end |
| 104 log("info", "Activated service '%s'", service_name); | 104 log("info", "Activated service '%s'", service_name); |
| 105 return true; | |
| 105 end | 106 end |
| 106 | 107 |
| 107 function deactivate(service_name) | 108 function deactivate(service_name) |
| 108 local active = active_services:search(service_name)[1]; | 109 local active = active_services:search(service_name)[1]; |
| 109 if not active then return; end | 110 if not active then return; end |
| 116 end | 117 end |
| 117 log("info", "Deactivated service '%s'", service_name); | 118 log("info", "Deactivated service '%s'", service_name); |
| 118 end | 119 end |
| 119 | 120 |
| 120 function register_service(service_name, service_info) | 121 function register_service(service_name, service_info) |
| 121 services[service_name] = service_info; | 122 table.insert(services[service_name], service_info); |
| 122 | 123 |
| 123 if not active_services[service_name] then | 124 if not active_services:get(service_name) then |
| 124 activate_service(service_name); | 125 log("debug", "No active service for %s, activating...", service_name); |
| 126 local ok, err = activate_service(service_name); | |
| 127 if not ok then | |
| 128 log("error", "Failed to activate service '%s': %s", service_name, err or "unknown error"); | |
| 129 end | |
| 125 end | 130 end |
| 126 | 131 |
| 127 fire_event("service-added", { name = service_name, service = service_info }); | 132 fire_event("service-added", { name = service_name, service = service_info }); |
| 128 return true; | 133 return true; |
| 134 end | |
| 135 | |
| 136 function unregister_service(service_name, service_info) | |
| 137 local service_info_list = services[service_name]; | |
| 138 for i, service in ipairs(service_info_list) do | |
| 139 if service == service_info then | |
| 140 table.remove(service_info_list, i); | |
| 141 end | |
| 142 end | |
| 143 if active_services[service_name] == service_info then | |
| 144 deactivate(service_name); | |
| 145 if #service_info_list > 0 then -- Other services registered with this name | |
| 146 activate(service_name); -- Re-activate with the next available one | |
| 147 end | |
| 148 end | |
| 129 end | 149 end |
| 130 | 150 |
| 131 function get_service(service_name) | 151 function get_service(service_name) |
| 132 return services[service_name]; | 152 return services[service_name]; |
| 133 end | 153 end |
