@@ -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 url = self . config . url ;
181181 let interval_secs = self . config . interval_secs . unwrap_or ( DEFAULT_NAMERD_SECONDS ) ;
@@ -194,7 +194,8 @@ 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+ // FIXME: 127.0.0.1:0 is a hideous hack but I lost the ability to get a SocketAddr.
198+ Ok ( ( "127.0.0.1:0" . parse ( ) . unwrap ( ) , Box :: new ( driver) ) )
198199 }
199200}
200201
@@ -203,29 +204,32 @@ pub struct Proxies {
203204}
204205impl Loader for Proxies {
205206 type Run = Running ;
206- fn load ( self , handle : Handle ) -> io:: Result < Running > {
207+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
207208 let mut running = Running :: new ( ) ;
208209 let mut proxies = self . proxies ;
210+ let mut addr: SocketAddr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
209211 for _ in 0 ..proxies. len ( ) {
210212 let p = proxies. pop_front ( ) . unwrap ( ) ;
211- let f = p. load ( handle. clone ( ) ) ?;
213+ let ( _addr, f) = p. load ( handle. clone ( ) ) ?;
214+ addr = _addr;
212215 running. register ( f) ;
213216 }
214- Ok ( running)
217+ Ok ( ( addr , running) )
215218 }
216219}
217220
218- struct Proxy {
219- client : Option < ClientConfig > ,
220- server : ProxyServer ,
221+ pub struct Proxy {
222+ pub client : Option < ClientConfig > ,
223+ pub server : ProxyServer ,
221224}
222225impl Loader for Proxy {
223226 type Run = Running ;
224- fn load ( self , handle : Handle ) -> io:: Result < Running > {
227+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
225228 match self . client . and_then ( |c| c. tls ) {
226229 None => {
227230 let conn = PlainConnector :: new ( handle. clone ( ) ) ;
228- self . server . load ( & handle, conn)
231+ let f = self . server . load ( & handle, conn) . expect ( "b" ) ;
232+ Ok ( f)
229233 }
230234 Some ( ref c) => {
231235 let mut tls = rustls:: ClientConfig :: new ( ) ;
@@ -238,29 +242,33 @@ impl Loader for Proxy {
238242 }
239243 } ;
240244 let conn = SecureConnector :: new ( c. dns_name . clone ( ) , tls, handle. clone ( ) ) ;
241- self . server . load ( & handle, conn)
245+ let f = self . server . load ( & handle, conn) . expect ( "a" ) ;
246+ Ok ( f)
242247 }
243248 }
244249 }
245250}
246251
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 ,
252+ pub struct ProxyServer {
253+ pub label : String ,
254+ pub servers : Vec < ServerConfig > ,
255+ pub addrs : Box < Stream < Item = Vec < WeightedAddr > , Error = ( ) > > ,
256+ pub buf : Rc < RefCell < Vec < u8 > > > ,
257+ pub max_waiters : usize ,
258+ pub metrics : tacho:: Metrics ,
254259}
255260impl ProxyServer {
256- fn load < C > ( self , handle : & Handle , conn : C ) -> io:: Result < Running >
261+ fn load < C > ( self , handle : & Handle , conn : C ) -> io:: Result < ( SocketAddr , Running ) >
257262 where C : Connector + ' static
258263 {
259264 let addrs = self . addrs . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ;
260265 let metrics = self . metrics . clone ( ) . labeled ( "proxy" . into ( ) , self . label . into ( ) ) ;
261266 let bal = Balancer :: new ( addrs, conn, self . buf . clone ( ) , metrics. clone ( ) )
262267 . into_shared ( self . max_waiters , handle. clone ( ) ) ;
263268
269+ // Placeholder for our local listening SocketAddr.
270+ let mut local_addr: SocketAddr = "127.0.0.1:0" . parse ( ) . expect ( "unable to parse addr" ) ;
271+
264272 // TODO scope/tag stats for servers.
265273
266274 let mut running = Running :: new ( ) ;
@@ -271,7 +279,9 @@ impl ProxyServer {
271279 ServerConfig :: Tcp { ref addr } => {
272280 let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
273281 let acceptor = PlainAcceptor :: new ( handle, metrics) ;
274- let f = acceptor. accept ( addr) . forward ( bal) . map ( |_| { } ) ;
282+ let ( bound_addr, forwarder) = acceptor. accept ( addr) ;
283+ local_addr = bound_addr;
284+ let f = forwarder. forward ( bal) . map ( |_| { } ) ;
275285 running. register ( f) ;
276286 }
277287 ServerConfig :: Tls { ref addr,
@@ -287,12 +297,14 @@ impl ProxyServer {
287297
288298 let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
289299 let acceptor = SecureAcceptor :: new ( handle, tls, metrics) ;
290- let f = acceptor. accept ( addr) . forward ( bal) . map ( |_| { } ) ;
300+ let ( bound_addr, forwarder) = acceptor. accept ( addr) ;
301+ local_addr = bound_addr;
302+ let f = forwarder. forward ( bal) . map ( |_| { } ) ;
291303 running. register ( f) ;
292304 }
293305 }
294306 }
295- Ok ( running)
307+ Ok ( ( local_addr , running) )
296308 }
297309}
298310
0 commit comments