diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 286aa99..abee546 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,13 +22,15 @@ jobs: uses: actions/checkout@v2 - name: Build netconsd run: make -# FIXME disable for now, the markdown docs here need lots of work -# markdown: -# runs-on: ubuntu-latest -# steps: -# - name: Checkout repository -# uses: actions/checkout@v2 -# - name: Lint Markdown -# uses: actionshub/markdownlint@2.0.2 -# - name: Check links -# uses: gaurav-nelson/github-action-markdown-link-check@1.0.13 + - name: Build netconsblaster + run: make -C util + markdown: + name: Markdown + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Lint Markdown + uses: actionshub/markdownlint@2.0.2 + - name: Check links + uses: gaurav-nelson/github-action-markdown-link-check@1.0.13 diff --git a/.mdlrc b/.mdlrc new file mode 100644 index 0000000..5a13449 --- /dev/null +++ b/.mdlrc @@ -0,0 +1 @@ +rules '~MD013', '~MD014', '~MD029', '~MD034' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17484ba..d4ff833 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,18 +1,22 @@ # Contributing to netconsd + We want to make contributing to this project as easy and transparent as possible. ## Our Development Process + This repository is synced from an internal repository. We gladly accept pull requests and will deal with the merging appropriately. ## Contributor License Agreement ("CLA") + In order to accept your pull request, we need you to submit a CLA. You only need to do this once to work on any of Facebook's open source projects. Complete your CLA here: ## Issues + We use GitHub issues to track public bugs. Please ensure your description is clear and has sufficient instructions to be able to reproduce the issue. @@ -21,6 +25,7 @@ safe disclosure of security bugs. In those cases, please go through the process outlined on that page and do not file a public issue. ## Sending a pull request + Have a fix or feature? Awesome! When you send the pull request we suggest you include a build output. @@ -28,5 +33,6 @@ We will hold all contributions to the same quality and style standards as the existing code. ## License + By contributing to this repository, you agree that your contributions will be licensed in accordance to the LICENSE document in the root of this repository. diff --git a/Makefile b/Makefile index 1ff638b..ddb7eb4 100644 --- a/Makefile +++ b/Makefile @@ -4,14 +4,15 @@ LDFLAGS ?= -shared LIBS = -lpthread -lrt -ldl CFLAGS ?= -O2 -fPIC CFLAGS += -D_GNU_SOURCE -fno-strict-aliasing -Wall -Wextra \ - -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations \ - -Wdeclaration-after-statement -Wno-missing-field-initializers \ - -Wno-unused-parameter + -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations \ + -Wdeclaration-after-statement -Wno-missing-field-initializers \ + -Wno-unused-parameter INCLUDES = -Incrx debug debug32: CFLAGS += -O0 -gdwarf-4 -fno-omit-frame-pointer \ - -fstack-protector-all -fsanitize=address -fsanitize=undefined -debug debug32: LDFLAGS := -lasan -lubsan $(LDFLAGS) + -fstack-protector-all -fsanitize=address \ + -fsanitize=undefined +debug debug32: LDFLAGS += -lasan -lubsan $(LDFLAGS) 32bit: CFLAGS += -m32 32bit: LDFLAGS += -m32 diff --git a/README.md b/README.md index 89931d4..7709766 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,8 @@ The Makefile includes a few other handy targets: * `32bit`: Forces 32-bit compilation on x86_64 systems, for easily testing portability to 32-bit CPU architectures. You'll need to install 32-bit libraries if your distro doesn't have them. -* `debug32`: Union of the "32bit" and "debug" targets. -* `disasm`: Emits verbose annotated disassembly in *.s files. +* `debug32`: Union of the `32bit` and `debug` targets. +* `disasm`: Emits verbose annotated disassembly in `*.s` files. If you want to build the daemon with clang, just append `CC="clang"` to your make invocation. All the above targets should build with both clang and gcc. @@ -41,7 +41,7 @@ make invocation. All the above targets should build with both clang and gcc. ### Setting up the server By default, netconsd will use 1 listener and 2 worker threads, and listen on -port 1514 for messages. You can use "-l", "-w", and "-u" respectively to change +port 1514 for messages. You can use `-l`, `-w`, and `-u` respectively to change the defaults. There's no universal wisdom about how many threads to use: just experiment with @@ -66,15 +66,18 @@ no reason to make that configurable: if you care, open an issue and we will. The netconsole module takes a parameter like this: - netconsole=${sport}@${saddr}/${intf},${dport}@${daddr}/${dmac} +``` +netconsole=${sport}@${saddr}/${intf},${dport}@${daddr}/${dmac} +``` The fields are as follows: - 1) sport: Source port for the netconsole UDP packets - 2) saddr: Source address for the netconsole UDP packets - 3) intf: The name of the interface to send the UDP packets from - 4) dport: Destination port for the netconsole UDP packets - 5) daddr: Destination address for the netconsole UDP packets - 6) dmac: Destination L2 MAC address for the netconsole UDP packets + +1. `sport`: Source port for the netconsole UDP packets +2. `saddr`: Source address for the netconsole UDP packets +3. `intf`: The name of the interface to send the UDP packets from +4. `dport`: Destination port for the netconsole UDP packets +5. `daddr`: Destination address for the netconsole UDP packets +6. `dmac`: Destination L2 MAC address for the netconsole UDP packets We need (6) because of how low-level netconsole is: it can't consult the routing table to send the packet, so it must know a priori what MAC address to use in @@ -84,17 +87,19 @@ If you're talking to a server on the same L2 segment as the client, use the MAC address of that server. Otherwise, use the MAC address of your router. You can use the following quick shell one-liners to easily get the MAC of the router: - IPv6: ip -6 neighbor show | grep router - IPv4: sudo arp –a | grep gateway +* IPv6: `ip -6 neighbor show | grep router` +* IPv4: `sudo arp –a | grep gateway` Here are a couple examples for the parameter above: - IPv6: netconsole=+6666@2401:db00:11:801e:face:0:31:0/eth0,1514@2401:db00:11:d0be:face:0:1b:0/c0:8c:60:3d:0d:bc - IPv4: netconsole=6666@192.168.0.22/eth0,1514@192.168.0.1/00:00:0c:9f:f1:90 +``` +IPv6: netconsole=+6666@2401:db00:11:801e:face:0:31:0/eth0,1514@2401:db00:11:d0be:face:0:1b:0/c0:8c:60:3d:0d:bc +IPv4: netconsole=6666@192.168.0.22/eth0,1514@192.168.0.1/00:00:0c:9f:f1:90 +``` -Prepending "+" to the cmdline will cause kernels that support it to use extended +Prepending `+` to the cmdline will cause kernels that support it to use extended netconsole, which you almost certainly want. Kernels too old to support extcon -will silently ignore the "+". +will silently ignore the `+`. Once you have your parameter constructed, just insert the module with it: @@ -113,7 +118,7 @@ $ sudo bash -c 'echo "Hello world!" > /dev/kmsg' $ sudo bash -c 'echo "<0>OMG!" > /dev/kmsg' ``` -The "<0>" tells the kernel what loglevel to use: 0 is `KERN_EMERG`, which ensures +The `<0>` tells the kernel what loglevel to use: 0 is `KERN_EMERG`, which ensures your message will actually get transmitted. ## Writing an output module @@ -123,48 +128,50 @@ your message will actually get transmitted. Output modules are shared object files loaded with `dlopen()` at runtime by netconsd. Netconsd will look for three functions in your module: - 1) int netconsd_output_init(int worker_thread_count) - 2) void netconsd_output_handler(int thread, struct in6_addr *src, struct msgbuf *buf, struct ncrx_msg *msg) - 3) void netconsd_output_exit(void) +1. `int netconsd_output_init(int worker_thread_count)` +2. `void netconsd_output_handler(int thread, struct in6_addr *src, struct msgbuf *buf, struct ncrx_msg *msg)` +3. `void netconsd_output_exit(void)` If (1) exists, it is called when your module is loaded: the argument tells you how many worker threads netconsd is going to call your module from. If you -return non-zero from this function, netconsd will abort() and exit. +return non-zero from this function, netconsd will `abort()` and exit. If (3) exists, it is called when netconsd unloads your module. For every message it receives, netconsd will call (2) in your module. The code must be reentrant: `netconsd_output_handler()` will be called concurrently from -all of the worker threads in netconsd. The "thread" argument tells you which +all of the worker threads in netconsd. The `thread` argument tells you which worker is invoking the function, which makes it easy to have per-thread data. Netconsd uses a consistent hash to decide which worker to pass messages to, so messages from same remote address will always be queued to the same thread. -The "src" argument will always point to an `in6_addr` struct containing the source +The `src` argument will always point to an `in6_addr` struct containing the source address of the netconsole packet. If the source was an IPv4 address, it will be -formatted like "::FFFF:" (see "man ipv6" for details). +formatted like `::FFFF:` (see `man ipv6` for details). -If the message had extended metadata, "msg" will point to the `ncrx_msg` struct -containing that metadata and "buf" will be NULL. Otherwise, "msg" will be NULL -and "buf" will point to a msgbuf struct with the raw message text. +If the message had extended metadata, `msg` will point to the `ncrx_msg` struct +containing that metadata and `buf` will be `NULL`. Otherwise, `msg` will be `NULL` +and `buf` will point to a `msgbuf` struct with the raw message text. Output modules must not modify the structures passed in. The memory backing all the pointers passed in will be freed immediately after the handler returns. ### Building the modules -For modules written in C this is trivial: just compile with "-shared". +For modules written in C this is trivial: just compile with `-shared`. For modules written in C++ it can be a bit trickier: you will probably need to -build with "-static-libstdc++" and/or "-static-libgcc" to make this work. +build with `-static-libstdc++` and/or `-static-libgcc` to make this work. -See the code and Makefile in modules/ for some examples of the above. +See the code and Makefile in `modules/` for some examples of the above. ## Contributing + See the CONTRIBUTING file for how to help out. ## License + netconsd is BSD licensed, see the LICENSE file for more information. netconsd was originally written by Calvin Owens as part of diff --git a/modules/Makefile b/modules/Makefile index 64a0182..02c1df8 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -7,7 +7,7 @@ INCLUDES = -I../ncrx -I../include # Filter out warnings not cpp-applicable that g++ complains about CCFLAGS := -std=c++11 $(filter-out -Wstrict-prototypes -Wmissing-prototypes \ - -Wdeclaration-after-statement,$(CFLAGS)) + -Wdeclaration-after-statement,$(CFLAGS)) mods = printer.so logger.so @@ -19,8 +19,7 @@ all: $(mods) %.so: %.cc $(CXX) $< $(CCFLAGS) $(INCLUDES) $(LDFLAGS) -c -o $(<:.cc=.o) - $(CXX) $(<:.cc=.o) $(LDFLAGS) \ - -o $@ + $(CXX) $(<:.cc=.o) $(LDFLAGS) -o $@ clean: rm -f *.o *.so diff --git a/ncrx/Makefile b/ncrx/Makefile index 6fe51fc..244cd98 100644 --- a/ncrx/Makefile +++ b/ncrx/Makefile @@ -2,9 +2,9 @@ CC ?= gcc CFLAGS ?= -O2 -fPIC CFLAGS += -D_GNU_SOURCE -fno-strict-aliasing -Wall -Wextra \ - -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations \ - -Wdeclaration-after-statement -Wno-missing-field-initializers \ - -Wno-unused-function -Wno-unused-parameter + -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations \ + -Wdeclaration-after-statement -Wno-missing-field-initializers \ + -Wno-unused-function -Wno-unused-parameter obj = libncrx.o