A set of services that will allow you to mockup a networking devices, for testing and such. This works by dumping conversations between a client and a device, and being able to replay these at will.
I created this project, jus because I needed this for some projects I was working on, and there might be some other projects out there that does the same, probably even a better job.
This project will support multiple protocols such as SNMP, SSH, HTTP and perhaps TELNET. I will be implementing
support in the above mentioned order.
The project is able to replay a dump of a OID-tree or just a sub tree. To see how this is configured have a look
at config.yaml. It is quite straight forward.
snapshot-files can be created using the snmp-snapshot tool.
docker run --rm -p 161:1161/udp ghcr.io/thorsager/mockdev
docker run --rm -p 161:1161/udp -v `pwd`/_testdata/snmp-config.yaml:/config/mockdev.yaml ghcr.io/thorsager/mockdev
snmpwalk -v 2c -c public localhost
docker run -v `pwd`:/tmp ghcr.io/thorsager/mockdev snmp-snapshot -v -n -f -o /tmp/snapshot.txt -c $COMMUNITY $HOST
Match-groups found to the path-matcher or body-matcher are available in the response.body and response.headeres[]
using go-tempting. Groups from the path-matcher are available as {{ .p<number> }} {{ .b<number> }} where <number>
is the number of the match-group, and p denotes that it is groups from the path-matcher, b denotes that it is
groups from the body-matcher. Number 0 will contain the entire match.
The match-groups are also available in response.script and after-script where they can be accessed as env-vars named
in the same manor as described above, ex echo $p1 >> the_file.log
Any environment variable prefixed with MOCKDEV_ will be available in conversations, when generating response body.
ex. MOCDEV_FOO will be available using {{ .env.FOO }}. The current bind address, and the bind port is available as:
{{ .cfg.Address }} and {{ .cfg.Port }} (note that the Address will most likely be "" meaning that mockdev is
bound to all addresses)
It is possible to generate the entire http-conversation response using the response.script function. This expects that
a complete raw HTTP response message is written to STDOUT. For further details look at script.yaml
The current time in "local" and in "GMT" is available in the context of templates now and can be accessed using
{{ .currentTime }} and {{ .currentTime_GMT }}. Please note that date formatting is available in template context,
formatting is done using time.Format.
Ex. {{ .currentTime.Format "Mon, 02 Jan 2006 15:04:05 MST" }
It is now possible to make the match, or the failure to match a conversation break the "conversation matching" and
respond with the conversation breaking the matching. This is done by setting the break-on property on a conversation.
Possible values are
no-matchThis will break the conversation-matching if the specific conversation is not matched. Please note that conversation will only break if configured matchers fail.matchWill break the matching if the conversation matches.
An example of usage can be found in config.yaml in the "fake-auth" conversation.
This project builds on slayercat/GoSNMPServer for all the SNMP serving (I have made a fork for maintenance) and the gliderlabs/ssh for SSH serving.