@@ -9,7 +9,7 @@ use std::cell::RefCell;
99use std:: collections:: { VecDeque , HashMap } ;
1010use std:: fs:: File ;
1111use std:: io:: { self , BufReader } ;
12- use std:: net;
12+ use std:: net:: { self , SocketAddr } ;
1313use std:: rc:: Rc ;
1414use std:: time:: Duration ;
1515use tacho:: { self , Tacho } ;
@@ -21,12 +21,12 @@ mod admin_http;
2121mod sni;
2222pub mod config;
2323
24- use self :: config:: * ;
25- use self :: sni:: Sni ;
2624use WeightedAddr ;
2725use lb:: { Balancer , Acceptor , Connector , PlainAcceptor , PlainConnector , SecureAcceptor ,
2826 SecureConnector } ;
2927use namerd;
28+ use self :: config:: * ;
29+ use self :: sni:: Sni ;
3030
3131const DEFAULT_BUFFER_SIZE : usize = 8 * 1024 ;
3232const DEFAULT_MAX_WAITERS : usize = 8 ;
@@ -95,7 +95,7 @@ pub fn configure(app: AppConfig) -> (Admin, Proxies) {
9595
9696pub trait Loader : Sized {
9797 type Run : Future < Item = ( ) , Error = io:: Error > ;
98- fn load ( self , handle : Handle ) -> io:: Result < Self :: Run > ;
98+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Self :: Run ) > ;
9999}
100100pub trait Runner : Sized {
101101 fn run ( self ) -> io:: Result < ( ) > ;
@@ -104,7 +104,7 @@ pub trait Runner: Sized {
104104impl < L : Loader > Runner for L {
105105 fn run ( self ) -> io:: Result < ( ) > {
106106 let mut core = Core :: new ( ) ?;
107- let fut = self . load ( core. handle ( ) ) ?;
107+ let ( _ , fut) = self . load ( core. handle ( ) ) ?;
108108 core. run ( fut)
109109 }
110110}
@@ -118,12 +118,12 @@ pub struct Admin {
118118}
119119impl Loader for Admin {
120120 type Run = Running ;
121- fn load ( self , handle : Handle ) -> io:: Result < Running > {
121+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
122122 let mut running = Running :: new ( ) ;
123123 {
124124 let mut namerds = self . namerds ;
125125 for _ in 0 ..namerds. len ( ) {
126- let f = namerds. pop_front ( ) . unwrap ( ) . load ( handle. clone ( ) ) ?;
126+ let ( _ , f ) = namerds. pop_front ( ) . unwrap ( ) . load ( handle. clone ( ) ) ?;
127127 running. register ( f. map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ) ;
128128 }
129129 }
@@ -163,19 +163,19 @@ impl Loader for Admin {
163163 } ) ;
164164 running. register ( srv) ;
165165 }
166- Ok ( running)
166+ Ok ( ( self . addr , running) )
167167 }
168168}
169169
170170
171- struct Namerd {
172- config : NamerdConfig ,
173- sender : mpsc:: Sender < Vec < WeightedAddr > > ,
174- metrics : tacho:: Metrics ,
171+ pub struct Namerd {
172+ pub config : NamerdConfig ,
173+ pub sender : mpsc:: Sender < Vec < WeightedAddr > > ,
174+ pub metrics : tacho:: Metrics ,
175175}
176176impl Loader for Namerd {
177177 type Run = Box < Future < Item = ( ) , Error = io:: Error > > ;
178- fn load ( self , handle : Handle ) -> io:: Result < Self :: Run > {
178+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Self :: Run ) > {
179179 let path = self . config . path ;
180180 let addr = self . config . addr ;
181181 let interval_secs = self . config . interval_secs . unwrap_or ( DEFAULT_NAMERD_SECONDS ) ;
@@ -194,7 +194,7 @@ impl Loader for Namerd {
194194 let sink = self . sender . sink_map_err ( |_| error ! ( "sink error" ) ) ;
195195 addrs. forward ( sink) . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) . map ( |_| { } )
196196 } ;
197- Ok ( Box :: new ( driver) )
197+ Ok ( ( addr , Box :: new ( driver) ) )
198198 }
199199}
200200
@@ -203,29 +203,32 @@ pub struct Proxies {
203203}
204204impl Loader for Proxies {
205205 type Run = Running ;
206- fn load ( self , handle : Handle ) -> io:: Result < Running > {
206+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
207207 let mut running = Running :: new ( ) ;
208208 let mut proxies = self . proxies ;
209+ let mut addr: SocketAddr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
209210 for _ in 0 ..proxies. len ( ) {
210211 let p = proxies. pop_front ( ) . unwrap ( ) ;
211- let f = p. load ( handle. clone ( ) ) ?;
212+ let ( _addr, f) = p. load ( handle. clone ( ) ) ?;
213+ addr = _addr;
212214 running. register ( f) ;
213215 }
214- Ok ( running)
216+ Ok ( ( addr , running) )
215217 }
216218}
217219
218- struct Proxy {
219- client : Option < ClientConfig > ,
220- server : ProxyServer ,
220+ pub struct Proxy {
221+ pub client : Option < ClientConfig > ,
222+ pub server : ProxyServer ,
221223}
222224impl Loader for Proxy {
223225 type Run = Running ;
224- fn load ( self , handle : Handle ) -> io:: Result < Running > {
226+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
225227 match self . client . and_then ( |c| c. tls ) {
226228 None => {
227229 let conn = PlainConnector :: new ( handle. clone ( ) ) ;
228- self . server . load ( & handle, conn)
230+ let f = self . server . load ( & handle, conn) . expect ( "b" ) ;
231+ Ok ( f)
229232 }
230233 Some ( ref c) => {
231234 let mut tls = rustls:: ClientConfig :: new ( ) ;
@@ -238,29 +241,33 @@ impl Loader for Proxy {
238241 }
239242 } ;
240243 let conn = SecureConnector :: new ( c. dns_name . clone ( ) , tls, handle. clone ( ) ) ;
241- self . server . load ( & handle, conn)
244+ let f = self . server . load ( & handle, conn) . expect ( "a" ) ;
245+ Ok ( f)
242246 }
243247 }
244248 }
245249}
246250
247- struct ProxyServer {
248- label : String ,
249- servers : Vec < ServerConfig > ,
250- addrs : Box < Stream < Item = Vec < WeightedAddr > , Error = ( ) > > ,
251- buf : Rc < RefCell < Vec < u8 > > > ,
252- max_waiters : usize ,
253- metrics : tacho:: Metrics ,
251+ pub struct ProxyServer {
252+ pub label : String ,
253+ pub servers : Vec < ServerConfig > ,
254+ pub addrs : Box < Stream < Item = Vec < WeightedAddr > , Error = ( ) > > ,
255+ pub buf : Rc < RefCell < Vec < u8 > > > ,
256+ pub max_waiters : usize ,
257+ pub metrics : tacho:: Metrics ,
254258}
255259impl ProxyServer {
256- fn load < C > ( self , handle : & Handle , conn : C ) -> io:: Result < Running >
260+ fn load < C > ( self , handle : & Handle , conn : C ) -> io:: Result < ( SocketAddr , Running ) >
257261 where C : Connector + ' static
258262 {
259263 let addrs = self . addrs . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ;
260264 let metrics = self . metrics . clone ( ) . labeled ( "proxy" . into ( ) , self . label . into ( ) ) ;
261265 let bal = Balancer :: new ( addrs, conn, self . buf . clone ( ) , metrics. clone ( ) )
262266 . into_shared ( self . max_waiters , handle. clone ( ) ) ;
263267
268+ // Placeholder for our local listening SocketAddr.
269+ let mut local_addr: SocketAddr = "127.0.0.1:0" . parse ( ) . expect ( "unable to parse addr" ) ;
270+
264271 // TODO scope/tag stats for servers.
265272
266273 let mut running = Running :: new ( ) ;
@@ -271,7 +278,9 @@ impl ProxyServer {
271278 ServerConfig :: Tcp { ref addr } => {
272279 let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
273280 let acceptor = PlainAcceptor :: new ( handle, metrics) ;
274- let f = acceptor. accept ( addr) . forward ( bal) . map ( |_| { } ) ;
281+ let ( bound_addr, forwarder) = acceptor. accept ( addr) ;
282+ local_addr = bound_addr;
283+ let f = forwarder. forward ( bal) . map ( |_| { } ) ;
275284 running. register ( f) ;
276285 }
277286 ServerConfig :: Tls { ref addr,
@@ -287,12 +296,14 @@ impl ProxyServer {
287296
288297 let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
289298 let acceptor = SecureAcceptor :: new ( handle, tls, metrics) ;
290- let f = acceptor. accept ( addr) . forward ( bal) . map ( |_| { } ) ;
299+ let ( bound_addr, forwarder) = acceptor. accept ( addr) ;
300+ local_addr = bound_addr;
301+ let f = forwarder. forward ( bal) . map ( |_| { } ) ;
291302 running. register ( f) ;
292303 }
293304 }
294305 }
295- Ok ( running)
306+ Ok ( ( local_addr , running) )
296307 }
297308}
298309
0 commit comments