@@ -26,8 +26,8 @@ import (
26
26
"golang.org/x/sys/unix"
27
27
)
28
28
29
- const progname = "pdhcp"
30
- const version = "2.0.5 "
29
+ const PROGNAME = "pdhcp"
30
+ const VERSION = "2.0.6 "
31
31
32
32
type SOURCE struct {
33
33
mode string
@@ -48,7 +48,7 @@ type CONTEXT struct {
48
48
}
49
49
50
50
var (
51
- log * ulog.ULog
51
+ logger * ulog.ULog
52
52
sources = map [string ]* SOURCE {}
53
53
contexts = map [string ]* CONTEXT {}
54
54
lock sync.RWMutex
@@ -68,8 +68,7 @@ func main() {
68
68
arguments = flag.FlagSet {Usage : func () {
69
69
fmt .Fprintf (os .Stderr , "usage: %s [OPTIONS...]\n \n options are:\n " , filepath .Base (os .Args [0 ]))
70
70
arguments .PrintDefaults ()
71
- },
72
- }
71
+ }}
73
72
help := arguments .Bool ("h" , false , "show this help screen" )
74
73
sversion := arguments .Bool ("v" , false , "show the program version" )
75
74
list1 := arguments .Bool ("l" , false , "list all available DHCP options (human format)" )
@@ -110,7 +109,7 @@ func main() {
110
109
111
110
// show program version
112
111
if * sversion {
113
- fmt .Printf ("%s/v%s\n " , progname , version )
112
+ fmt .Printf ("%s/v%s\n " , PROGNAME , VERSION )
114
113
os .Exit (0 )
115
114
}
116
115
@@ -124,9 +123,9 @@ func main() {
124
123
if * format == "" {
125
124
* format = "console(output=stderr,time=msdatetime) syslog(facility=local0)"
126
125
}
127
- log = ulog .New (* format )
126
+ logger = ulog .New (* format )
128
127
if mode != "client" {
129
- log .Info (map [string ]interface {}{"mode" : mode , "event" : "start" , "version" : version , "pid" : os .Getpid ()})
128
+ logger .Info (map [string ]interface {}{"mode" : mode , "event" : "start" , "version" : VERSION , "pid" : os .Getpid ()})
130
129
}
131
130
132
131
// start and keep backend workers alive
@@ -143,8 +142,8 @@ func main() {
143
142
if request , err := http .NewRequest (http .MethodPost , * backend , bytes .NewBuffer (payload )); err == nil {
144
143
request .Header .Set ("Content-Length" , fmt .Sprintf ("%d" , len (payload )))
145
144
request .Header .Set ("Content-Type" , "application/json" )
146
- request .Header .Set ("User-Agent" , fmt .Sprintf ("%s/%s" , progname , version ))
147
- log .Info (map [string ]interface {}{"event" : "http-send" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
145
+ request .Header .Set ("User-Agent" , fmt .Sprintf ("%s/%s" , PROGNAME , VERSION ))
146
+ logger .Info (map [string ]interface {}{"event" : "http-send" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
148
147
"txid" : fmt .Sprintf ("%v/%v" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]), "target" : * backend })
149
148
client := & http.Client {Timeout : 7 * time .Second }
150
149
if response , err := client .Do (request ); err == nil {
@@ -156,7 +155,7 @@ func main() {
156
155
lock .RLock ()
157
156
if contexts [v4key (frame )] != nil {
158
157
if packet , err := v4build (frame ); err == nil {
159
- log .Info (map [string ]interface {}{"event" : "http-receive" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
158
+ logger .Info (map [string ]interface {}{"event" : "http-receive" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
160
159
"txid" : fmt .Sprintf ("%v/%v" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]), "target" : * backend })
161
160
pmux <- PACKET {source : "http" , client : * backend , data : packet }
162
161
}
@@ -175,25 +174,26 @@ func main() {
175
174
for * workers > 0 {
176
175
go func () {
177
176
for {
178
- command , pid := & exec.Cmd {Path : * backend }, 0
177
+ command , pid := & exec.Cmd {Path : * backend , Stderr : os . Stderr }, 0
179
178
if stdin , err := command .StdinPipe (); err == nil {
180
179
if stdout , err := command .StdoutPipe (); err == nil {
181
180
if err := command .Start (); err == nil {
182
181
pid = command .Process .Pid
183
- log .Info (map [string ]interface {}{"event" : "worker-start" , "backend" : * backend , "worker" : pid })
184
- backend := make (chan FRAME )
182
+ logger .Info (map [string ]interface {}{"event" : "worker-start" , "backend" : * backend , "worker" : pid })
183
+ queue := make (chan FRAME )
185
184
go func () {
186
185
reader := bufio .NewReader (stdout )
187
186
for {
188
187
if line , err := reader .ReadString ('\n' ); err != nil {
189
- backend <- nil
188
+ queue <- nil
190
189
break
191
190
} else {
192
191
var frame FRAME
192
+
193
193
if err := json .Unmarshal ([]byte (line ), & frame ); err == nil {
194
194
lock .RLock ()
195
195
if contexts [v4key (frame )] != nil {
196
- backend <- frame
196
+ queue <- frame
197
197
}
198
198
lock .RUnlock ()
199
199
} else {
@@ -209,17 +209,17 @@ func main() {
209
209
if payload , err := json .Marshal (frame ); err == nil {
210
210
payload = append (payload , '\n' )
211
211
if _ , err := stdin .Write (payload ); err == nil {
212
- log .Info (map [string ]interface {}{"event" : "worker-send" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
212
+ logger .Info (map [string ]interface {}{"event" : "worker-send" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
213
213
"txid" : fmt .Sprintf ("%v/%v" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]), "worker" : pid })
214
214
}
215
215
}
216
216
217
- case frame := <- backend :
217
+ case frame := <- queue :
218
218
if frame == nil {
219
219
break loop
220
220
}
221
221
if packet , err := v4build (frame ); err == nil {
222
- log .Info (map [string ]interface {}{"event" : "worker-receive" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
222
+ logger .Info (map [string ]interface {}{"event" : "worker-receive" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
223
223
"txid" : fmt .Sprintf ("%v/%v" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]), "worker" : pid })
224
224
pmux <- PACKET {source : "worker" , client : fmt .Sprintf ("%d" , pid ), data : packet }
225
225
}
@@ -228,7 +228,7 @@ func main() {
228
228
}
229
229
}
230
230
}
231
- log .Warn (map [string ]interface {}{"event" : "worker-stop" , "backend" : * backend , "worker" : pid , "status" : fmt .Sprintf ("%v" , command .Wait ())})
231
+ logger .Warn (map [string ]interface {}{"event" : "worker-stop" , "backend" : * backend , "worker" : pid , "status" : fmt .Sprintf ("%v" , command .Wait ())})
232
232
time .Sleep (5 * time .Second )
233
233
}
234
234
}()
@@ -323,11 +323,11 @@ func main() {
323
323
if name != "" {
324
324
if handle , err := NewRawConn (& RawAddr {Port : * port , Device : name }); err == nil {
325
325
if handle .Local .Addr == nil {
326
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("skipping interface %s: no ip address" , name )})
326
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("skipping interface %s: no ip address" , name )})
327
327
return
328
328
}
329
329
source .rhandle = handle
330
- log .Info (map [string ]interface {}{"event" : "listen" , "listen" : fmt .Sprintf ("%s@%s:%d" , name , * address , * port ),
330
+ logger .Info (map [string ]interface {}{"event" : "listen" , "listen" : fmt .Sprintf ("%s@%s:%d" , name , * address , * port ),
331
331
"source" : fmt .Sprintf ("%s@%s" , handle .Local .HardwareAddr , handle .Local .Addr )})
332
332
} else if mode == "relay" {
333
333
config := net.ListenConfig {
@@ -341,13 +341,13 @@ func main() {
341
341
}}
342
342
if handle , err := config .ListenPacket (context .Background (), "udp" , fmt .Sprintf ("%s:%d" , * address , * port )); err == nil {
343
343
source .handle = handle
344
- log .Info (map [string ]interface {}{"event" : "listen" , "listen" : fmt .Sprintf ("%s@%s:%d" , name , * address , * port )})
344
+ logger .Info (map [string ]interface {}{"event" : "listen" , "listen" : fmt .Sprintf ("%s@%s:%d" , name , * address , * port )})
345
345
} else {
346
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("skipping interface %s: %v" , name , err )})
346
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("skipping interface %s: %v" , name , err )})
347
347
return
348
348
}
349
349
} else {
350
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("skipping interface %s: %v" , name , err )})
350
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("skipping interface %s: %v" , name , err )})
351
351
return
352
352
}
353
353
} else {
@@ -362,9 +362,9 @@ func main() {
362
362
}}
363
363
if handle , err := config .ListenPacket (context .Background (), "udp" , fmt .Sprintf ("%s:%d" , * address , * port )); err == nil {
364
364
source .handle = handle
365
- log .Info (map [string ]interface {}{"event" : "listen" , "listen" : fmt .Sprintf ("%s@%s:%d" , name , * address , * port )})
365
+ logger .Info (map [string ]interface {}{"event" : "listen" , "listen" : fmt .Sprintf ("%s@%s:%d" , name , * address , * port )})
366
366
} else {
367
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
367
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
368
368
return
369
369
}
370
370
}
@@ -406,7 +406,7 @@ func main() {
406
406
select {
407
407
case packet := <- pmux :
408
408
if frame , err := v4parse (packet .data ); err != nil {
409
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err ), "source" : packet .source , "client" : packet .client })
409
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err ), "source" : packet .source , "client" : packet .client })
410
410
} else {
411
411
key := v4key (frame )
412
412
if frame ["bootp-opcode" ] == "request" {
@@ -443,7 +443,7 @@ func main() {
443
443
if value , ok := frame ["hostname" ].(string ); ok {
444
444
hostname = value
445
445
}
446
- log .Info (map [string ]interface {}{"event" : "request" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
446
+ logger .Info (map [string ]interface {}{"event" : "request" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
447
447
"txid" : fmt .Sprintf ("%v/%v" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]),
448
448
"source" : packet .source , "client" : packet .client , "requested-ip-address" : address , "hostname" : hostname ,
449
449
})
@@ -463,7 +463,7 @@ func main() {
463
463
if rpacket , err := v4build (rframe ); err == nil {
464
464
if raddress , err := net .ResolveUDPAddr ("udp" , * relay ); err == nil {
465
465
if _ , err := sources ["-" ].handle .WriteTo (rpacket , raddress ); err == nil {
466
- log .Info (map [string ]interface {}{"event" : "relay-send" , "message" : fmt .Sprintf ("dhcp-%v" , rframe ["dhcp-message-type" ]),
466
+ logger .Info (map [string ]interface {}{"event" : "relay-send" , "message" : fmt .Sprintf ("dhcp-%v" , rframe ["dhcp-message-type" ]),
467
467
"txid" : fmt .Sprintf ("%v/%v" , rframe ["client-hardware-address" ], rframe ["bootp-transaction-id" ]), "relay" : relay })
468
468
}
469
469
}
@@ -500,7 +500,7 @@ func main() {
500
500
break
501
501
}
502
502
if mode == "relay" {
503
- log .Info (map [string ]interface {}{"event" : "relay-receive" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
503
+ logger .Info (map [string ]interface {}{"event" : "relay-receive" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
504
504
"txid" : fmt .Sprintf ("%s/%s" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]), "relay" : relay })
505
505
}
506
506
if sources [context .source ].rhandle != nil && sources [context .source ].rhandle .Local .Addr != nil {
@@ -515,21 +515,21 @@ func main() {
515
515
to .HardwareAddr , _ = net .ParseMAC (frame ["client-hardware-address" ].(string ))
516
516
}
517
517
if _ , err := sources [context .source ].rhandle .WriteTo (nil , to , packet ); err != nil {
518
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
518
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
519
519
break
520
520
}
521
521
} else {
522
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
522
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
523
523
break
524
524
}
525
525
} else {
526
526
if address , err := net .ResolveUDPAddr ("udp" , client ); err == nil {
527
527
if _ , err := sources [context .source ].handle .WriteTo (packet , address ); err != nil {
528
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
528
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
529
529
break
530
530
}
531
531
} else {
532
- log .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
532
+ logger .Warn (map [string ]interface {}{"event" : "error" , "error" : fmt .Sprintf ("%v" , err )})
533
533
break
534
534
}
535
535
}
@@ -543,7 +543,7 @@ func main() {
543
543
hostname += "." + value
544
544
}
545
545
}
546
- log .Info (map [string ]interface {}{"event" : "reply" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
546
+ logger .Info (map [string ]interface {}{"event" : "reply" , "message" : fmt .Sprintf ("dhcp-%v" , frame ["dhcp-message-type" ]),
547
547
"txid" : fmt .Sprintf ("%s/%s" , frame ["client-hardware-address" ], frame ["bootp-transaction-id" ]),
548
548
"source" : context .source , "client" : client , "bootp-assigned-address" : address , "hostname" : hostname ,
549
549
"duration" : fmt .Sprintf ("%.2fms" , float64 (time .Now ().Sub (context .created ))/ float64 (time .Millisecond ))})
0 commit comments