@@ -9,7 +9,7 @@ use std::cell::RefCell;
9
9
use std:: collections:: { VecDeque , HashMap } ;
10
10
use std:: fs:: File ;
11
11
use std:: io:: { self , BufReader } ;
12
- use std:: net;
12
+ use std:: net:: { self , SocketAddr } ;
13
13
use std:: rc:: Rc ;
14
14
use std:: time:: Duration ;
15
15
use tacho:: { self , Tacho } ;
@@ -21,12 +21,12 @@ mod admin_http;
21
21
mod sni;
22
22
pub mod config;
23
23
24
- use self :: config:: * ;
25
- use self :: sni:: Sni ;
26
24
use WeightedAddr ;
27
25
use lb:: { Balancer , Acceptor , Connector , PlainAcceptor , PlainConnector , SecureAcceptor ,
28
26
SecureConnector } ;
29
27
use namerd;
28
+ use self :: config:: * ;
29
+ use self :: sni:: Sni ;
30
30
31
31
const DEFAULT_BUFFER_SIZE : usize = 8 * 1024 ;
32
32
const DEFAULT_MAX_WAITERS : usize = 8 ;
@@ -95,7 +95,7 @@ pub fn configure(app: AppConfig) -> (Admin, Proxies) {
95
95
96
96
pub trait Loader : Sized {
97
97
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 ) > ;
99
99
}
100
100
pub trait Runner : Sized {
101
101
fn run ( self ) -> io:: Result < ( ) > ;
@@ -104,7 +104,7 @@ pub trait Runner: Sized {
104
104
impl < L : Loader > Runner for L {
105
105
fn run ( self ) -> io:: Result < ( ) > {
106
106
let mut core = Core :: new ( ) ?;
107
- let fut = self . load ( core. handle ( ) ) ?;
107
+ let ( _ , fut) = self . load ( core. handle ( ) ) ?;
108
108
core. run ( fut)
109
109
}
110
110
}
@@ -118,12 +118,12 @@ pub struct Admin {
118
118
}
119
119
impl Loader for Admin {
120
120
type Run = Running ;
121
- fn load ( self , handle : Handle ) -> io:: Result < Running > {
121
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
122
122
let mut running = Running :: new ( ) ;
123
123
{
124
124
let mut namerds = self . namerds ;
125
125
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 ( ) ) ?;
127
127
running. register ( f. map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ) ;
128
128
}
129
129
}
@@ -163,19 +163,19 @@ impl Loader for Admin {
163
163
} ) ;
164
164
running. register ( srv) ;
165
165
}
166
- Ok ( running)
166
+ Ok ( ( self . addr , running) )
167
167
}
168
168
}
169
169
170
170
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 ,
175
175
}
176
176
impl Loader for Namerd {
177
177
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 ) > {
179
179
let path = self . config . path ;
180
180
let addr = self . config . addr ;
181
181
let interval_secs = self . config . interval_secs . unwrap_or ( DEFAULT_NAMERD_SECONDS ) ;
@@ -194,7 +194,7 @@ impl Loader for Namerd {
194
194
let sink = self . sender . sink_map_err ( |_| error ! ( "sink error" ) ) ;
195
195
addrs. forward ( sink) . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) . map ( |_| { } )
196
196
} ;
197
- Ok ( Box :: new ( driver) )
197
+ Ok ( ( addr , Box :: new ( driver) ) )
198
198
}
199
199
}
200
200
@@ -203,29 +203,32 @@ pub struct Proxies {
203
203
}
204
204
impl Loader for Proxies {
205
205
type Run = Running ;
206
- fn load ( self , handle : Handle ) -> io:: Result < Running > {
206
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
207
207
let mut running = Running :: new ( ) ;
208
208
let mut proxies = self . proxies ;
209
+ let mut addr: SocketAddr = "127.0.0.1:0" . parse ( ) . unwrap ( ) ;
209
210
for _ in 0 ..proxies. len ( ) {
210
211
let p = proxies. pop_front ( ) . unwrap ( ) ;
211
- let f = p. load ( handle. clone ( ) ) ?;
212
+ let ( _addr, f) = p. load ( handle. clone ( ) ) ?;
213
+ addr = _addr;
212
214
running. register ( f) ;
213
215
}
214
- Ok ( running)
216
+ Ok ( ( addr , running) )
215
217
}
216
218
}
217
219
218
- struct Proxy {
219
- client : Option < ClientConfig > ,
220
- server : ProxyServer ,
220
+ pub struct Proxy {
221
+ pub client : Option < ClientConfig > ,
222
+ pub server : ProxyServer ,
221
223
}
222
224
impl Loader for Proxy {
223
225
type Run = Running ;
224
- fn load ( self , handle : Handle ) -> io:: Result < Running > {
226
+ fn load ( self , handle : Handle ) -> io:: Result < ( SocketAddr , Running ) > {
225
227
match self . client . and_then ( |c| c. tls ) {
226
228
None => {
227
229
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)
229
232
}
230
233
Some ( ref c) => {
231
234
let mut tls = rustls:: ClientConfig :: new ( ) ;
@@ -238,29 +241,33 @@ impl Loader for Proxy {
238
241
}
239
242
} ;
240
243
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)
242
246
}
243
247
}
244
248
}
245
249
}
246
250
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 ,
254
258
}
255
259
impl 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 ) >
257
261
where C : Connector + ' static
258
262
{
259
263
let addrs = self . addrs . map_err ( |_| io:: ErrorKind :: Other . into ( ) ) ;
260
264
let metrics = self . metrics . clone ( ) . labeled ( "proxy" . into ( ) , self . label . into ( ) ) ;
261
265
let bal = Balancer :: new ( addrs, conn, self . buf . clone ( ) , metrics. clone ( ) )
262
266
. into_shared ( self . max_waiters , handle. clone ( ) ) ;
263
267
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
+
264
271
// TODO scope/tag stats for servers.
265
272
266
273
let mut running = Running :: new ( ) ;
@@ -271,7 +278,9 @@ impl ProxyServer {
271
278
ServerConfig :: Tcp { ref addr } => {
272
279
let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
273
280
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 ( |_| { } ) ;
275
284
running. register ( f) ;
276
285
}
277
286
ServerConfig :: Tls { ref addr,
@@ -287,12 +296,14 @@ impl ProxyServer {
287
296
288
297
let metrics = metrics. clone ( ) . labeled ( "srv" . into ( ) , format ! ( "{}" , addr) ) ;
289
298
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 ( |_| { } ) ;
291
302
running. register ( f) ;
292
303
}
293
304
}
294
305
}
295
- Ok ( running)
306
+ Ok ( ( local_addr , running) )
296
307
}
297
308
}
298
309
0 commit comments