-
Notifications
You must be signed in to change notification settings - Fork 108
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The `sleep` plugin introduces a delay in the chain of response to a DHCP transaction. Signed-off-by: Andrea Barberio <insomniac@slackware.it>
- Loading branch information
1 parent
4f97fe7
commit 00cc600
Showing
4 changed files
with
93 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Copyright 2018-present the CoreDHCP Authors. All rights reserved | ||
// This source code is licensed under the MIT license found in the | ||
// LICENSE file in the root directory of this source tree. | ||
|
||
package sleep | ||
|
||
// This plugin introduces a delay in the DHCP response. | ||
|
||
import ( | ||
"fmt" | ||
"time" | ||
|
||
"github.com/coredhcp/coredhcp/handler" | ||
"github.com/coredhcp/coredhcp/logger" | ||
"github.com/coredhcp/coredhcp/plugins" | ||
"github.com/insomniacslk/dhcp/dhcpv4" | ||
"github.com/insomniacslk/dhcp/dhcpv6" | ||
) | ||
|
||
var ( | ||
pluginName = "sleep" | ||
log = logger.GetLogger("plugins/" + pluginName) | ||
) | ||
|
||
// Example configuration of the `sleep` plugin: | ||
// | ||
// server4: | ||
// plugins: | ||
// - sleep 300ms | ||
// - file: "leases4.txt" | ||
// | ||
// server6: | ||
// plugins: | ||
// - sleep 1s | ||
// - file: "leases6.txt" | ||
// | ||
// For the duration format, see the documentation of `time.ParseDuration`, | ||
// https://golang.org/pkg/time/#ParseDuration . | ||
|
||
// Plugin contains the `sleep` plugin data. | ||
var Plugin = plugins.Plugin{ | ||
Name: pluginName, | ||
Setup6: setup6, | ||
Setup4: setup4, | ||
} | ||
|
||
func setup6(args ...string) (handler.Handler6, error) { | ||
if len(args) != 1 { | ||
return nil, fmt.Errorf("want exactly one argument, got %d", len(args)) | ||
} | ||
delay, err := time.ParseDuration(args[0]) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to parse duration: %w", err) | ||
} | ||
log.Printf("loaded plugin for DHCPv6.") | ||
return makeSleepHandler6(delay), nil | ||
} | ||
|
||
func setup4(args ...string) (handler.Handler4, error) { | ||
if len(args) != 1 { | ||
return nil, fmt.Errorf("want exactly one argument, got %d", len(args)) | ||
} | ||
delay, err := time.ParseDuration(args[0]) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to parse duration: %w", err) | ||
} | ||
log.Printf("loaded plugin for DHCPv4.") | ||
return makeSleepHandler4(delay), nil | ||
} | ||
|
||
func makeSleepHandler6(delay time.Duration) handler.Handler6 { | ||
return func(req, resp dhcpv6.DHCPv6) (dhcpv6.DHCPv6, bool) { | ||
log.Printf("introducing delay of %s in response", delay) | ||
// return the unmodified response, and instruct coredhcp to continue to | ||
// the next plugin. | ||
time.Sleep(delay) | ||
return resp, false | ||
} | ||
} | ||
|
||
func makeSleepHandler4(delay time.Duration) handler.Handler4 { | ||
return func(req, resp *dhcpv4.DHCPv4) (*dhcpv4.DHCPv4, bool) { | ||
log.Printf("introducing delay of %s in response", delay) | ||
// return the unmodified response, and instruct coredhcp to continue to | ||
// the next plugin. | ||
time.Sleep(delay) | ||
return resp, false | ||
} | ||
} |