--- /dev/null
+# Submodule in master branch
+/libevent/
+
+*.pyc
+/deploy/
+/.hyde_deps
--- /dev/null
+---
+title: Not found
+---
+
+Sorry, but the page you are looking for has not been found.
+
+{# Local Variables: #}
+{# mode: markdown #}
+{# indent-tabs-mode: nil #}
+{# End: #}
--- /dev/null
+---
+title: Features
+---
+
+`lldpd` supports **several discovery protocols** and is smart enough
+to select the right protocol on each interface:
+
+ - LLDP, of course
+ - CDP (Cisco)
+ - EDP (Extreme)
+ - SONMP (Nortel)
+ - FDP (Foundry)
+
+It is able to advertise the following TLV:
+
+ - System name and description
+ - Port name and description
+ - VLAN ID and names
+ - IPv4/IPv6 management address
+ - MAC/PHY information
+ - MDI power (802.3af and 802.3at)
+ - Link aggregation
+ - Network policies (LLDP-MED)
+ - Location (LLDP-MED)
+ - Inventory (LLDP-MED)
+
+`lldpd` supports many OS:
+
+ - GNU/Linux
+ - FreeBSD
+ - NetBSD
+ - OpenBSD
+ - Mac OS X (sponsored by [Xcloud](http://xcloud.me), Mac cloud server hosting)
+
+Moreover, it can handle correctly VLAN, link aggregates and bridges on
+all those platforms.
+
+Discovered neighbors can be queried through a convenient **command
+line** interface:
+
+ ::console
+ # show neighbors detail
+ -------------------------------------------------------------------------------
+ Interface: eth0, via: LLDP, RID: 1, Time: 0 day, 00:00:10
+ Chassis:
+ ChassisID: mac 00:18:f3:03:4e:06
+ SysName: dev-01.example.com
+ SysDescr: Debian GNU/Linux 7.0 (wheezy) Linux 3.7-trunk-amd64 #1 SMP Debian 3.7.1-1~experimental.1 x86_64
+ MgmtIP: 192.168.20.127
+ Capability: Bridge, on
+ Capability: Router, on
+ Capability: Wlan, off
+ Port:
+ PortID: mac ea:b8:ab:aa:8c:da
+ PortDescr: eth1
+ PMD autoneg: supported: no, enabled: no
+ MAU oper type: 10GigBaseR - R PCS/PMA, unknown PMD.
+ LLDP-MED:
+ Device Type: Media Endpoint (Class II)
+ Capability: Capabilities
+ Capability: Policy
+ Capability: Location
+ Capability: MDI/PSE
+ Capability: MDI/PD
+ Capability: Inventory
+ Inventory:
+ Hardware Revision: System Version
+ Software Revision: 3.7-trunk-amd64
+ Firmware Revision: 2104
+ Serial Number: System Serial Number
+ Manufacturer: System manufacturer
+ Model: System Product Name
+ Asset ID: Asset-1234567890
+ -------------------------------------------------------------------------------
+
+They can also be queried through SNMP with the built-in SNMP
+subagent. Or through a Unix socket with the provided library.
+
+*[LLDP]: Link Layer Discovery Protocol
+*[CDP]: Cisco Discovery Protocol
+*[EDP]: Extreme Discovery Protocol
+*[FDP]: Foundry Discovery Protocol
+*[SONMP]: SynOptics Network Management Protocol
+*[MED]: Media Endpoint Discovery
+
+{# Local Variables: #}
+{# mode: markdown #}
+{# indent-tabs-mode: nil #}
+{# End: #}
--- /dev/null
+# What is lldpd?
+
+
+
+LLDP allows you to know exactly on which port is a server
+(and reciprocally).
+
+[LLDP][] is an industry standard protocol designed to supplant
+proprietary Link-Layer protocols such as EDP or CDP. The goal of LLDP
+is to provide an inter-vendor compatible mechanism to deliver
+Link-Layer notifications to adjacent network devices.
+
+`lldpd` is a pretty complete implementation of LLDP for various
+Unixes. It also supports some proprietary protocols.
+
+# Interested?
+
+ - Download the latest version ([{{ resource.meta.latestversion }}][last]).
+ - Check the [list of features]([[features.html]]).
+ - Learn [how to install _lldpd_]([[install.html]]).
+ - Learn [how to configure and use _lldpd_]([[usage.html]]).
+ - [Get the code on GitHub](https://github.com/vincentbernat/lldpd).
+ - [Add issues and feature requests](https://github.com/vincentbernat/lldpd/issues).
+
+[last]: http://media.luffy.cx/files/lldpd/lldpd-{{ resource.meta.latestversion }}.tar.gz "lldpd {{ resource.meta.latestversion }} version"
+
+[LLDP]: http://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol "Link Layer Discovery Protocol"
+*[LLDP]: Link Layer Discovery Protocol
+*[CDP]: Cisco Discovery Protocol
+*[EDP]: Extreme Discovery Protocol
+*[FDP]: Foundry Discovery Protocol
+*[SONMP]: SynOptics Network Management Protocol
+*[MED]: Media Endpoint Discovery
+
+{# Local Variables: #}
+{# mode: markdown #}
+{# indent-tabs-mode: nil #}
+{# End: #}
--- /dev/null
+---
+title: Installation
+---
+
+`lldpd` supports several OS. You can install it from packages or from
+sources. Once installed, you may want to look
+[how to use and configure it]([[usage.html]]).
+
+[TOC]
+
+# GNU/Linux
+
+## Debian and Ubuntu
+
+`lldpd` is already available in Debian and Ubuntu. You can install it
+with:
+
+ ::console
+ $ sudo apt-get install lldpd
+ Reading package lists... Done
+ Building dependency tree
+ Reading state information... Done
+ The following extra packages will be installed:
+ [...]
+
+It will be installed and configured to start at boot. You can change
+the options of `lldpd` in `/etc/default/lldpd`.
+
+If the package is not recent enough, you can use the
+[Debian backports][] on Debian. Follow the instructions available on
+the website.
+
+If it is still not recent enough, you can grab the appropriate Debian
+package from [openSUSE Build Service][]. Follow the instructions
+available on the website.
+
+The last option is to to [build _lldpd_ from source][]. You can still
+install and uninstall the package to get `_lldpd` user and group, as
+well as a working init script.
+
+## Gentoo
+
+`lldpd` is available in portage. Just issue the command `emerge lldpd`
+to install it. You can also [build _lldpd_ from source][].
+
+## Fedora, RHEL, CentOS & SUSE
+
+You can install the packages from [openSUSE Build Service][]. Follow
+the instructions available on the website. It is also possible to
+[build _lldpd_ from source][].
+
+# BSD
+
+`lldpd` is currently not available in the port tree of any
+BSD. Therefore, you have to [build _lldpd_ from source][]. You can add
+`_lldpd` user with `vipw` and add `_lldpd` group by adding it manually
+in `/etc/group`. The user must not be able to login, have its home as
+`/var/empty` and a disabled shell (like `/bin/false`).
+
+You may want to configure `lldpd` with
+`--with-privsep-chroot=/var/empty` to avoid to create
+`/var/run/lldpd`.
+
+If `lldpcli` is not able to provide completion, you can use the `help`
+command instead or install the GNU Readline library on your system.
+
+# Mac OS X
+
+The easiest way is to use [Homebrew][]. Check the website if you don't
+have it, it is easy to install. Once installed, type in a terminal:
+
+ ::console
+ $ brew install https://raw.github.com/vincentbernat/lldpd/master/osx/lldpd.rb
+ ######################################################################## 100.0%
+ ==> Downloading http://media.luffy.cx/files/lldpd/lldpd-{{ resource.meta.latestversion }}.tar.gz
+ ==> ./configure --prefix=/usr/local/Cellar/lldpd/{{ resource.meta.latestversion }} --with-xml --with-readline
+ [...]
+
+Pay attention at the instructions at the end of the build: they
+explain how to create `_lldpd` user and group and how to run `lldpd`
+when the system starts.
+
+If you don't want to use [Homebrew][], you will need to
+[build _lldpd_ from source][]. To create `_lldpd` user and `_group`, you
+need to use `dscl`. First, locate a free UID and GID:
+
+ ::console
+ $ dscl . list /Users uid
+ $ dscl . list /Groups gid
+
+Let's say that 274 is not used. Let's create the appropriate user:
+
+ ::console
+ $ sudo dscl . -create /Groups/_lldpd
+ $ sudo dscl . -create /Groups/_lldpd PrimaryGroupID 274
+ $ sudo dscl . -create /Groups/_lldpd Password "*"
+ $ sudo dscl . -create /Groups/_lldpd RealName "lldpd privilege separation group"
+ $ sudo dscl . -create /Users/_lldpd
+ $ sudo dscl . -create /Users/_lldpd UserShell /usr/bin/false
+ $ sudo dscl . -create /Users/_lldpd NFSHomeDirectory /var/empty
+ $ sudo dscl . -create /Users/_lldpd PrimaryGroupID 274
+ $ sudo dscl . -create /Users/_lldpd UniqueID 274
+ $ sudo dscl . -create /Users/_lldpd Password "*"
+ $ sudo dscl . -create /Users/_lldpd RealName "lldpd privilege separation user"
+
+You still need to create `/var/run/lldpd` and to integrate `lldpd` in
+`launchd` yourself.
+
+# Install from source
+
+This is the last resort method. Other methods are usually simpler.
+
+You first need to download the latest version
+([{{ resource.meta.latestversion }}][lasttgz]). You need a working build
+environment.
+
+ ::console
+ $ tar zxvf ~/download/lldpd-{{ resource.meta.latestversion }}.tar.gz
+ $ cd lldpd-{{ resource.meta.latestversion }}
+ $ mkdir build
+ $ cd build
+ $ ../configure
+ checking for a BSD-compatible install... /usr/bin/install -c
+ checking whether build environment is sane... yes
+ checking for a thread-safe mkdir -p... /bin/mkdir -p
+ checking for gawk... gawk
+ [...]
+ ------------------ Summary ------------------
+ lldpd version {{ meta.resource.latestversion }}
+ Prefix.........: /usr/local
+ C Compiler.....: gcc -g -O2 -fdiagnostics-show-option -std=gnu99 -pipe -Wall -W -Wextra -Wformat -Wformat-security -Wcast-align -Winline -fstack-protector -D_FORTIFY_SOURCE=2 -Wdeclaration-after-statement -Wno-unused-parameter -Wno-sign-compare
+ Linker.........: /usr/bin/ld -m elf_x86_64 -Wl,-z,relro -Wl,-z,now
+ Libevent.......: system
+ Optional features:
+ SNMP support...: no
+ CDP............: yes
+ FDP............: yes
+ EDP............: yes
+ SONMP..........: yes
+ LLDPMED........: yes
+ DOT1...........: yes
+ DOT3...........: yes
+ XML output.....: no
+ ---------------------------------------------
+
+ Check the above options and compile with:
+ make
+
+If this steps fail, feel free to [file a bug report][]. The content
+of `config.log` should be helpful. Otherwise, check if everything is
+as you except and continue.
+
+ ::console
+ $ make
+ CC strlcpy.lo
+ CCLD libcompat.la
+ CC log.lo
+ [...]
+ make[1]: Leaving directory `/home/bernat/src/lldpd-{{ resource.meta.latestversion }}'
+
+If this steps fail, feel free to [file a bug report][] too with the
+output and some details on your platform. The `config.log` is also
+useful in this case.
+
+You can finish the installation with `make install`. Then, you still
+have to complete the following steps by yourself. They are system
+specifics:
+
+ - Create a `_lldpd` user and a `_lldpd` group. This is needed for
+ privilege seperation (increased security).
+ - Create the chroot (`/var/run/lldpd` by default). It is just an
+ empty directory.
+ - Ensure that `lldpd` is started at boot.
+
+`../configure` accepts several options. You can get them with
+`../configure --help`. The most interesting ones are `--with-snmp` and
+`--with-xml`.
+
+[lasttgz]: http://media.luffy.cx/files/lldpd/lldpd-{{ resource.meta.latestversion }}.tar.gz "lldpd {{ resource.meta.latestversion }} version"
+[file a bug request]: https://github.com/vincentbernat/lldpd/issues "GitHub bug tracker for lldpd"
+[Debian backports]: http://backports.debian.org "Debian Backports"
+[openSUSE Build Service]: http://software.opensuse.org/download.html?project=home:vbernat&package=lldpd "lldpd on OSC"
+[build _lldpd_ from source]: #install-from-source
+[Homebrew]: http://mxcl.github.com/homebrew/ "Homebrew: the missing package manager for OS X"
+
+{# Local Variables: #}
+{# mode: markdown #}
+{# indent-tabs-mode: nil #}
+{# End: #}
--- /dev/null
+/* -*- css -*- */
+
+.inline-block () {
+ display: inline-block;
+ zoom: 1;
+ *display: inline;
+}
+
+.clearfix () {
+ zoom: 1;
+ &:after {
+ display: block;
+ visibility: hidden;
+ height: 0;
+ clear: both;
+ content: ".";
+ }
+}
+
+@font-unicode: 'Lucida Grande','Lucida Sans Unicode','Arial Unicode MS';
+@font-regular: 'Libre Baskerville','Georgia',sans-serif,@font-unicode;
+@font-headings: 'Libre Baskerville','Georgia',sans-serif,@font-unicode;
+@font-console: 'Inconsolata','Droid Sans Mono',monospace,@font-unicode;
+@page-width: 50em;
+@article-width: 42em;
+@line-height: 1.625;
+@theme-color: #B80F28;
+
+.font-size (@factor: 1) {
+ font-size: @factor * 1em;
+ line-height: ~`Math.ceil(@{factor}/@{line-height})*@{line-height}/@{factor}`;
+}
--- /dev/null
+/* -*- css -*- */
+/*! normalize.css 2012-03-06T10:21 UTC - http://github.com/necolas/normalize.css */
+
+/* =============================================================================
+ HTML5 display definitions
+ ========================================================================== */
+
+/*
+ * Corrects block display not defined in IE6/7/8/9 & FF3
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/*
+ * Corrects inline-block display not defined in IE6/7/8/9 & FF3
+ */
+
+audio,
+canvas,
+video {
+ .inline-block;
+}
+
+/*
+ * Prevents modern browsers from displaying 'audio' without controls
+ * Remove excess height in iOS5 devices
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/*
+ * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4
+ * Known issue: no IE6 support
+ */
+
+[hidden] {
+ display: none;
+}
+
+
+/* =============================================================================
+ Base
+ ========================================================================== */
+
+/*
+ * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
+ * http://clagnut.com/blog/348/#c790
+ * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom
+ * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
+ */
+
+html {
+ font-size: 100%; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ -ms-text-size-adjust: 100%; /* 2 */
+}
+
+/*
+ * Addresses font-family inconsistency between 'textarea' and other form elements.
+ */
+
+html,
+button,
+input,
+select,
+textarea {
+ font-family: @font-regular;
+}
+
+/*
+ * Addresses margins handled incorrectly in IE6/7
+ */
+
+body {
+ margin: 0;
+}
+
+
+/* =============================================================================
+ Links
+ ========================================================================== */
+
+/*
+ * Addresses outline displayed oddly in Chrome
+ */
+
+a:focus {
+ outline: thin dotted;
+}
+
+/*
+ * Improves readability when focused and also mouse hovered in all browsers
+ * people.opera.com/patrickl/experiments/keyboard/test
+ */
+
+a:hover,
+a:active {
+ outline: 0;
+}
+
+
+/* =============================================================================
+ Typography
+ ========================================================================== */
+
+small {
+ font-size: 75%;
+}
+
+/*
+ * Prevents sub and sup affecting line-height in all browsers
+ * gist.github.com/413930
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+
+/* =============================================================================
+ Lists
+ ========================================================================== */
+
+/*
+ * Addresses margins set differently in IE6/7
+ */
+
+dl,
+menu,
+ol,
+ul {
+ margin: 1em 0;
+}
+
+dd {
+ margin: 0 0 0 40px;
+}
+
+/*
+ * Addresses paddings set differently in IE6/7
+ */
+
+menu,
+ol,
+ul {
+ padding: 0 0 0 40px;
+}
+
+/*
+ * Corrects list images handled incorrectly in IE7
+ */
+
+nav ul,
+nav ol {
+ list-style: none;
+ list-style-image: none;
+}
+
+
+/* =============================================================================
+ Embedded content
+ ========================================================================== */
+
+/*
+ * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3
+ * 2. Improves image quality when scaled in IE7
+ * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
+ */
+
+img {
+ border: 0; /* 1 */
+ -ms-interpolation-mode: bicubic; /* 2 */
+}
+
+/*
+ * Corrects overflow displayed oddly in IE9
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+
+/* =============================================================================
+ Figures
+ ========================================================================== */
+
+/*
+ * Addresses margin not present in IE6/7/8/9, S5, O11
+ */
+
+figure {
+ margin: 0;
+}
+
+
+/* =============================================================================
+ Forms
+ ========================================================================== */
+
+/*
+ * Corrects margin displayed oddly in IE6/7
+ */
+
+form {
+ margin: 0;
+}
+
+/*
+ * Define consistent border, margin, and padding
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/*
+ * 1. Corrects color not being inherited in IE6/7/8/9
+ * 2. Corrects text not wrapping in FF3
+ * 3. Corrects alignment displayed oddly in IE6/7
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0;
+ white-space: normal; /* 2 */
+ *margin-left: -7px; /* 3 */
+}
+
+/*
+ * 1. Corrects font size not being inherited in all browsers
+ * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome
+ * 3. Improves appearance and consistency in all browsers
+ */
+
+button,
+input,
+select,
+textarea {
+ font-size: 100%; /* 1 */
+ margin: 0; /* 2 */
+ vertical-align: baseline; /* 3 */
+ *vertical-align: middle; /* 3 */
+}
+
+/*
+ * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet
+ */
+
+button,
+input {
+ line-height: normal; /* 1 */
+}
+
+/*
+ * 1. Improves usability and consistency of cursor style between image-type 'input' and others
+ * 2. Corrects inability to style clickable 'input' types in iOS
+ * 3. Removes inner spacing in IE7 without affecting normal text inputs
+ * Known issue: inner spacing remains in IE6
+ */
+
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer; /* 1 */
+ -webkit-appearance: button; /* 2 */
+ *overflow: visible; /* 3 */
+}
+
+/*
+ * Re-set default cursor for disabled elements
+ */
+
+button[disabled],
+input[disabled] {
+ cursor: default;
+}
+
+/*
+ * 1. Addresses box sizing set to content-box in IE8/9
+ * 2. Removes excess padding in IE8/9
+ * 3. Removes excess padding in IE7
+ Known issue: excess padding remains in IE6
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ *height: 13px; /* 3 */
+ *width: 13px; /* 3 */
+}
+
+/*
+ * 1. Addresses appearance set to searchfield in S5, Chrome
+ * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof)
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/*
+ * Removes inner padding and search cancel button in S5, Chrome on OS X
+ */
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+}
+
+/*
+ * Removes inner padding and border in FF3+
+ * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/*
+ * 1. Removes default vertical scrollbar in IE6/7/8/9
+ * 2. Improves readability and alignment in all browsers
+ */
+
+textarea {
+ overflow: auto; /* 1 */
+ vertical-align: top; /* 2 */
+}
+
+
+/* =============================================================================
+ Tables
+ ========================================================================== */
+
+/*
+ * Remove most spacing between table cells
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
--- /dev/null
+/* -*- css -*- */
+
+html {
+ background: white;
+ height: 100%;
+ overflow-x: hidden;
+}
+
+body {
+ min-height: 100%;
+}
+
+p {
+ margin: (@line-height*1em) 0 0 0;
+ word-spacing: 0.25em;
+}
+
+a {
+ text-decoration: none;
+ color: @theme-color;
+ &:hover {
+ color: darken(@theme-color, 5%);
+ }
+}
+
+.github-forkme {
+ position: absolute;
+ top: 0;
+ right: 0;
+ border: 0;
+}
+@media only screen and (max-width: @page-width) {
+ .github-forkme { display: none; }
+}
--- /dev/null
+/* -*- css -*- */
+
+body {
+ font: normal 100% @font-regular;
+}
+article {
+ margin: 0 auto;
+ width: @page-width;
+}
+article > * {
+ margin: 0 2em;
+}
+@media only screen and (max-width: @page-width) {
+ article > * { margin: 0 1em; }
+ article {
+ width: auto;
+ margin: 0;
+ }
+}
+article {
+ padding-bottom: 2em;
+ line-height: @line-height;
+ color: #333;
+ .clearfix;
+ h1, h2, h3, h4, h5, h6 {
+ color: @theme-color;
+ font-family: @font-headings;
+ font-weight: bold;
+ page-break-after: avoid;
+ page-break-inside: avoid;
+ text-shadow: white 0 1px 2px, white 1px 1px 1px;
+ }
+ h1 {
+ .font-size(2.125);
+ margin: (@line-height/2.125*2em) 0 (@line-height/2.125em);
+ header & {
+ .font-size(2.625);
+ margin: (@line-height/2.625*2em) 0 (@line-height/2.625em);
+ }
+ }
+ h2 {
+ .font-size(1.625);
+ margin: (@line-height/1.625*2em) 0 (@line-height/1.625em);
+ }
+ h3 {
+ .font-size(1.312);
+ margin: (@line-height/1.312*2em) 0 (@line-height/1.312em);
+ }
+
+ code {
+ border-radius: 3px;
+ border: 1px solid lighten(@theme-color, 45%);
+ padding: 0 2px;
+ }
+
+ sup {
+ font-size: 0.7em;
+ vertical-align: baseline;
+ position: relative;
+ top: -0.7em;
+ }
+
+ abbr {
+ cursor: help;
+ border-bottom: 1px dashed lighten(@theme-color, 45%);
+ }
+
+ ul {
+ margin: 15px 0;
+ padding: 0;
+ list-style: none;
+ & li:before {
+ content: "\00BB \0020";
+ color: #888;
+ position: absolute;
+ margin-left: -19px;
+ }
+ }
+}
+
+.toc {
+ margin: (@line-height*1em) 0 (@line-height*1em) 3em;
+ padding: 0 2em;
+ max-width: 25em;
+ border-left: 1px dashed lighten(@theme-color, 30%);
+ ul {
+ margin: 0 0.5em;
+ list-style-type: decimal;
+ .font-size(0.875);
+ ul {
+ font-size: 1em;
+ }
+ li {
+ background: none;
+ padding-left: 1em;
+ &:before {
+ content: none;
+ }
+ }
+ }
+}
--- /dev/null
+/* -*- css -*- */
+pre, code, code .amp, pre .amp, .manpage {
+ font-family: @font-console;
+ font-style: normal;
+ line-height: 1.2;
+}
+.manpage {
+ white-space: pre;
+}
+.codehilite, .manpage {
+ border: 1px solid #E0E0E0;
+ margin: 0.4em auto (@line-height*1em);
+ padding: 0.4em 2%;
+ width: 94%;
+ overflow-x: auto;
+ pre { margin: 0; }
+ /* Small scrollbar */
+ &::-webkit-scrollbar {
+ width: 3px;
+ height: 3px;
+ }
+ &::-webkit-scrollbar-track-piece {
+ -webkit-border-radius: 3px;
+ }
+ &::-webkit-scrollbar-thumb:vertical, &::-webkit-scrollbar-thumb:horizontal {
+ height: 5px;
+ background-color: #666;
+ -webkit-border-radius: 3px;
+ }
+}
+.codehilite {
+ /* Output of HtmlFormatter(linenos=True,style='colorful').get_style_defs() */
+ .hll { background-color: #ffffcc }
+ .c { color: #808080 } /* Comment */
+ .k { color: #008000; font-weight: bold } /* Keyword */
+ .o { color: #303030 } /* Operator */
+ .cm { color: #808080 } /* Comment.Multiline */
+ .cp { color: #507090 } /* Comment.Preproc */
+ .c1 { color: #808080 } /* Comment.Single */
+ .cs { color: #cc0000; font-weight: bold } /* Comment.Special */
+ .gd { color: #A00000 } /* Generic.Deleted */
+ .ge { font-style: italic } /* Generic.Emph */
+ .gr { color: #FF0000 } /* Generic.Error */
+ .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+ .gi { color: #00A000 } /* Generic.Inserted */
+ .go { color: #808080 } /* Generic.Output */
+ .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+ .gs { font-weight: bold } /* Generic.Strong */
+ .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+ .gt { color: #0040D0 } /* Generic.Traceback */
+ .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+ .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+ .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+ .kp { color: #003080; font-weight: bold } /* Keyword.Pseudo */
+ .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+ .kt { color: #303090; font-weight: bold } /* Keyword.Type */
+ .m { color: #6000E0; font-weight: bold } /* Literal.Number */
+ .s { background-color: #fff0f0 } /* Literal.String */
+ .na { color: #0000C0 } /* Name.Attribute */
+ .nb { color: #007020 } /* Name.Builtin */
+ .nc { color: #B00060; font-weight: bold } /* Name.Class */
+ .no { color: #003060; font-weight: bold } /* Name.Constant */
+ .nd { color: #505050; font-weight: bold } /* Name.Decorator */
+ .ni { color: #800000; font-weight: bold } /* Name.Entity */
+ .ne { color: #F00000; font-weight: bold } /* Name.Exception */
+ .nf { color: #0060B0; font-weight: bold } /* Name.Function */
+ .nl { color: #907000; font-weight: bold } /* Name.Label */
+ .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+ .nt { color: #007000 } /* Name.Tag */
+ .nv { color: #906030 } /* Name.Variable */
+ .ow { color: #000000; font-weight: bold } /* Operator.Word */
+ .w { color: #bbbbbb } /* Text.Whitespace */
+ .mf { color: #6000E0; font-weight: bold } /* Literal.Number.Float */
+ .mh { color: #005080; font-weight: bold } /* Literal.Number.Hex */
+ .mi { color: #0000D0; font-weight: bold } /* Literal.Number.Integer */
+ .mo { color: #4000E0; font-weight: bold } /* Literal.Number.Oct */
+ .sb { background-color: #fff0f0 } /* Literal.String.Backtick */
+ .sc { color: #0040D0 } /* Literal.String.Char */
+ .sd { color: #D04020 } /* Literal.String.Doc */
+ .s2 { background-color: #fff0f0 } /* Literal.String.Double */
+ .se { color: #606060; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
+ .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */
+ .si { background-color: #e0e0e0 } /* Literal.String.Interpol */
+ .sx { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */
+ .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
+ .s1 { background-color: #fff0f0 } /* Literal.String.Single */
+ .ss { color: #A06000 } /* Literal.String.Symbol */
+ .bp { color: #007020 } /* Name.Builtin.Pseudo */
+ .vc { color: #306090 } /* Name.Variable.Class */
+ .vg { color: #d07000; font-weight: bold } /* Name.Variable.Global */
+ .vi { color: #3030B0 } /* Name.Variable.Instance */
+ .il { color: #0000D0; font-weight: bold } /* Literal.Number.Integer.Long */
+}
--- /dev/null
+/* -*- css -*- */
+
+article {
+ /* Images */
+ img {
+ max-width: 100%;
+ width: auto; height: auto;
+ background-color: white;
+ padding: 1em;
+ vertical-align: bottom;
+ margin: 1em auto;
+ display: block;
+ interpolation-mode: bicubic;
+ }
+}
--- /dev/null
+/* -*- css -*- */
+
+/* Short tagline */
+nav .tagline {
+ font-style: italic;
+ color: #333;
+ max-width: @article-width - 5em;
+ .font-size(1.312);
+ margin: (@line-height/1.312em) auto (@line-height/1.312em);
+ text-align: center;
+ em {
+ font-style: normal;
+ }
+}
+
+nav ul {
+ list-style-type: none;
+ text-align: center;
+ padding: 0;
+ li {
+ display: inline;
+ }
+ a {
+ .inline-block;
+ }
+ li:not(:first-child) {
+ &:before {
+ content: " // ";
+ padding: 0 1em;
+ }
+ }
+}
+
+nav {
+ padding: 2px 0 2px;
+ box-shadow: 0px 5px 10px #333;
+ background: url("../images/bright_squares.png") repeat;
+}
--- /dev/null
+/* -*- css -*- */
+
+/* Beautiful ampersand */
+.amp {
+ font-family: 'Libre Baskerville', Baskerville,
+ 'Goudy Old Style','Goudy Bookletter 1911',
+ Palatino,'Palatino Linotype','URW Palladio L','Cochin',
+ 'Book Antiqua','Apple Chancery','Constantia',
+ @font-regular;
+ font-style: italic;
+ font-weight: normal;
+ line-height: 75%;
+}
--- /dev/null
+---
+combine:
+ files: lldpd.*.less
+ remove: yes
+ where: bottom
+uses_template: true
+---
+
+@import "common";
--- /dev/null
+/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-shiv-cssclasses-load
+ */
+;window.Modernizr=function(a,b,c){function u(a){j.cssText=a}function v(a,b){return u(prefixes.join(a+";")+(b||""))}function w(a,b){return typeof a===b}function x(a,b){return!!~(""+a).indexOf(b)}function y(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:w(f,"function")?f.bind(d||b):f}return!1}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m={},n={},o={},p=[],q=p.slice,r,s={}.hasOwnProperty,t;!w(s,"undefined")&&!w(s.call,"undefined")?t=function(a,b){return s.call(a,b)}:t=function(a,b){return b in a&&w(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=q.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(q.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(q.call(arguments)))};return e});for(var z in m)t(m,z)&&(r=z.toLowerCase(),e[r]=m[z](),p.push((e[r]?"":"no-")+r));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)t(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},u(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+p.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
--- /dev/null
+---
+combine:
+ files:
+ - modernizr.js
+ - prefixfree.js
+ where: top
+ remove: yes
+---
--- /dev/null
+/**
+ * StyleFix 1.0.3 & PrefixFree 1.0.7
+ * @author Lea Verou
+ * MIT license
+ */
+(function(){function j(a,c){return[].slice.call((c||document).querySelectorAll(a))}if(window.addEventListener){var g=window.StyleFix={link:function(a){try{if("stylesheet"!==a.rel||a.hasAttribute("data-noprefix"))return}catch(c){return}var i=a.href||a.getAttribute("data-href"),f=i.replace(/[^\/]+$/,""),j=(/^[a-z]{3,10}:/.exec(f)||[""])[0],k=(/^[a-z]{3,10}:\/\/[^\/]+/.exec(f)||[""])[0],h=/^([^?]*)\??/.exec(i)[1],n=a.parentNode,e=new XMLHttpRequest,b;e.onreadystatechange=function(){4===e.readyState&&
+b()};b=function(){var c=e.responseText;if(c&&a.parentNode&&(!e.status||400>e.status||600<e.status)){c=g.fix(c,!0,a);if(f)var c=c.replace(/url\(\s*?((?:"|')?)(.+?)\1\s*?\)/gi,function(a,c,b){return/^([a-z]{3,10}:|#)/i.test(b)?a:/^\/\//.test(b)?'url("'+j+b+'")':/^\//.test(b)?'url("'+k+b+'")':/^\?/.test(b)?'url("'+h+b+'")':'url("'+f+b+'")'}),b=f.replace(/([\\\^\$*+[\]?{}.=!:(|)])/g,"\\$1"),c=c.replace(RegExp("\\b(behavior:\\s*?url\\('?\"?)"+b,"gi"),"$1");b=document.createElement("style");b.textContent=
+c;b.media=a.media;b.disabled=a.disabled;b.setAttribute("data-href",a.getAttribute("href"));n.insertBefore(b,a);n.removeChild(a);b.media=a.media}};try{e.open("GET",i),e.send(null)}catch(r){"undefined"!=typeof XDomainRequest&&(e=new XDomainRequest,e.onerror=e.onprogress=function(){},e.onload=b,e.open("GET",i),e.send(null))}a.setAttribute("data-inprogress","")},styleElement:function(a){if(!a.hasAttribute("data-noprefix")){var c=a.disabled;a.textContent=g.fix(a.textContent,!0,a);a.disabled=c}},styleAttribute:function(a){var c=
+a.getAttribute("style"),c=g.fix(c,!1,a);a.setAttribute("style",c)},process:function(){j('link[rel="stylesheet"]:not([data-inprogress])').forEach(StyleFix.link);j("style").forEach(StyleFix.styleElement);j("[style]").forEach(StyleFix.styleAttribute)},register:function(a,c){(g.fixers=g.fixers||[]).splice(void 0===c?g.fixers.length:c,0,a)},fix:function(a,c,i){for(var f=0;f<g.fixers.length;f++)a=g.fixers[f](a,c,i)||a;return a},camelCase:function(a){return a.replace(/-([a-z])/g,function(a,g){return g.toUpperCase()}).replace("-",
+"")},deCamelCase:function(a){return a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}};setTimeout(function(){j('link[rel="stylesheet"]').forEach(StyleFix.link)},10);document.addEventListener("DOMContentLoaded",StyleFix.process,!1)}})();
+(function(j){function g(d,b,c,e,f){d=a[d];d.length&&(d=RegExp(b+"("+d.join("|")+")"+c,"gi"),f=f.replace(d,e));return f}if(window.StyleFix&&window.getComputedStyle){var a=window.PrefixFree={prefixCSS:function(d,b){var c=a.prefix;-1<a.functions.indexOf("linear-gradient")&&(d=d.replace(/(\s|:|,)(repeating-)?linear-gradient\(\s*(-?\d*\.?\d*)deg/ig,function(a,d,b,c){return d+(b||"")+"linear-gradient("+(90-c)+"deg"}));d=g("functions","(\\s|:|,)","\\s*\\(","$1"+c+"$2(",d);d=g("keywords","(\\s|:)","(\\s|;|\\}|$)",
+"$1"+c+"$2$3",d);d=g("properties","(^|\\{|\\s|;)","\\s*:","$1"+c+"$2:",d);if(a.properties.length)var e=RegExp("\\b("+a.properties.join("|")+")(?!:)","gi"),d=g("valueProperties","\\b",":(.+?);",function(a){return a.replace(e,c+"$1")},d);b&&(d=g("selectors","","\\b",a.prefixSelector,d),d=g("atrules","@","\\b","@"+c+"$1",d));d=d.replace(RegExp("-"+c,"g"),"-");return d=d.replace(/-\*-(?=[a-z]+)/gi,a.prefix)},property:function(d){return(a.properties.indexOf(d)?a.prefix:"")+d},value:function(d){d=g("functions",
+"(^|\\s|,)","\\s*\\(","$1"+a.prefix+"$2(",d);return d=g("keywords","(^|\\s)","(\\s|$)","$1"+a.prefix+"$2$3",d)},prefixSelector:function(d){return d.replace(/^:{1,2}/,function(d){return d+a.prefix})},prefixProperty:function(d,b){var c=a.prefix+d;return b?StyleFix.camelCase(c):c}},c={},i=[],f=getComputedStyle(document.documentElement,null),p=document.createElement("div").style,k=function(a){if("-"===a.charAt(0)){i.push(a);var a=a.split("-"),b=a[1];for(c[b]=++c[b]||1;3<a.length;)a.pop(),b=a.join("-"),
+StyleFix.camelCase(b)in p&&-1===i.indexOf(b)&&i.push(b)}};if(0<f.length)for(var h=0;h<f.length;h++)k(f[h]);else for(var n in f)k(StyleFix.deCamelCase(n));var h=0,e,b;for(b in c)f=c[b],h<f&&(e=b,h=f);a.prefix="-"+e+"-";a.Prefix=StyleFix.camelCase(a.prefix);a.properties=[];for(h=0;h<i.length;h++)n=i[h],0===n.indexOf(a.prefix)&&(e=n.slice(a.prefix.length),StyleFix.camelCase(e)in p||a.properties.push(e));"Ms"==a.Prefix&&(!("transform"in p)&&!("MsTransform"in p)&&"msTransform"in p)&&a.properties.push("transform",
+"transform-origin");a.properties.sort();e=function(a,b){r[b]="";r[b]=a;return!!r[b]};b={"linear-gradient":{property:"backgroundImage",params:"red, teal"},calc:{property:"width",params:"1px + 5%"},element:{property:"backgroundImage",params:"#foo"},"cross-fade":{property:"backgroundImage",params:"url(a.png), url(b.png), 50%"}};b["repeating-linear-gradient"]=b["repeating-radial-gradient"]=b["radial-gradient"]=b["linear-gradient"];h={initial:"color","zoom-in":"cursor","zoom-out":"cursor",box:"display",
+flexbox:"display","inline-flexbox":"display",flex:"display","inline-flex":"display"};a.functions=[];a.keywords=[];var r=document.createElement("div").style,l;for(l in b)k=b[l],f=k.property,k=l+"("+k.params+")",!e(k,f)&&e(a.prefix+k,f)&&a.functions.push(l);for(var m in h)f=h[m],!e(m,f)&&e(a.prefix+m,f)&&a.keywords.push(m);l=function(a){s.textContent=a+"{}";return!!s.sheet.cssRules.length};m={":read-only":null,":read-write":null,":any-link":null,"::selection":null};e={keyframes:"name",viewport:null,
+document:'regexp(".")'};a.selectors=[];a.atrules=[];var s=j.appendChild(document.createElement("style")),q;for(q in m)b=q+(m[q]?"("+m[q]+")":""),!l(b)&&l(a.prefixSelector(b))&&a.selectors.push(q);for(var t in e)b=t+" "+(e[t]||""),!l("@"+b)&&l("@"+a.prefix+b)&&a.atrules.push(t);j.removeChild(s);a.valueProperties=["transition","transition-property"];j.className+=" "+a.prefix;StyleFix.register(a.prefixCSS)}})(document.documentElement);
--- /dev/null
+extends: false
+uses_template: false
--- /dev/null
+---
+title: Usage
+---
+
+`lldpd` comes with two parts: a daemon (`lldpd`) sending and receiving
+LLDP advertisements and a client (`lldpcli`) to query and configure
+the daemon. Both parts are documented in their manual pages:
+
+[TOC]
+
+# lldpd.8
+
+Here is the manual page for `lldpd` (version {{ resource.meta.latestversion }}):
+
+[[manpage:src/daemon/lldpd.8]]
+
+# lldpcli.8
+
+Here is the manual page for `lldpcli` and `lldpctl` (version
+{{ resource.meta.latestversion }}):
+
+[[manpage:src/client/lldpcli.8]]
+
+{# Local Variables: #}
+{# mode: markdown #}
+{# indent-tabs-mode: nil #}
+{# End: #}
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+Modified combine plugin.
+
+This plugin is like the `combine` plugin except it combines resources
+in the "complete" step.
+"""
+
+from hyde.ext.plugins.combine import CombinePlugin as OrigCombinePlugin
+
+class CombinePlugin(OrigCombinePlugin):
+ def text_resource_complete(self, resource, text):
+ return super(CombinePlugin, self).begin_text_resource(resource, text)
+
+ def begin_text_resource(self, resource, text):
+ pass
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+Textlinks plugin
+"""
+import re
+import subprocess
+import cgi
+
+from hyde.plugin import Plugin
+
+class IncludeManpagePlugin(Plugin):
+ """
+ Include the content of a manual page.
+
+ The syntax is:
+
+ [[manpage:path/to/manualpage#gitversion]]
+ """
+ def __init__(self, site):
+ super(IncludeManpagePlugin, self).__init__(site)
+
+ def begin_text_resource(self, resource, text):
+ if not resource.uses_template:
+ return text
+
+ def replace_content(match):
+ path = match.group(1)
+ version = resource.meta.latestversion
+
+ # execute git show version:path | MAN_KEEP_FORMATTING=1 man -l -
+ git = subprocess.Popen(["git", "show", "%s:%s" % (version, path)], stdout=subprocess.PIPE)
+ man = subprocess.Popen(["man", "-l", "-"], stdin=git.stdout, stdout=subprocess.PIPE,
+ env={"MAN_KEEP_FORMATTING": "1"})
+ git.stdout.close()
+ output = man.communicate()[0]
+
+ return "<div class='manpage'>%s</div>" % self.man(output)
+
+ link = re.compile(r'\[\[manpage:([^\]]+)\]\]', re.UNICODE|re.MULTILINE)
+ text = link.sub(replace_content, text)
+ return text
+
+ def man(self, output):
+ # Escape HTML sequences
+ output = cgi.escape(output)
+
+ # Add <br> for new lines
+ output = output.replace("\n", "<br>")
+
+ # Dots
+ output = re.sub('\\+\b\\+\bo\bo', '»', output)
+
+ # Bold/Italic
+ output = re.sub('(.)\b\\1', r'<b>\1</b>', output)
+ output = re.sub(r'</b><b>', '', output)
+ output = re.sub('_\b(.)', r'<u>\1</u>', output)
+ output = re.sub(r'\</u\>\<u\>', '', output)
+
+ return output.decode('ascii', errors='replace')
--- /dev/null
+<!doctype html>
+<html class="no-js" lang="en">
+<head>
+ <meta charset="utf-8">
+ {% if resource.meta.title %}
+ <title>lldpd » implementation of IEEE 802.1ab | {{ resource.meta.title }}</title>
+ {% else %}
+ <title>lldpd » implementation of IEEE 802.1ab (LLDP)</title>
+ {% endif %}
+ <meta name="keywords" content="lldpd, 802.1ab, network, discovery, cdp, edp, snmp">
+ <meta name="viewport" content="width=device-width,initial-scale=1.0">
+ <link rel="canonical" href="{{base}}{{ content_url(resource.url) }}">
+ <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Inconsolata|Libre+Baskerville:400,400italic,700" type="text/css">
+ <link rel="stylesheet" href="{{ media_url('css/lldpd.css') }}" type="text/css">
+ <script src="{{ media_url('js/mp.js') }}"></script>
+</head>
+<body>
+
+ <a class="github-forkme" href="https://github.com/vincentbernat/lldpd">
+ <img src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png"
+ alt="Fork me on GitHub">
+ </a>
+
+ {% include "menu.j2" %}
+ <article>
+ <div role="main">
+ {% if resource.meta.title %}
+ <header>
+ <h1>{{ resource.meta.title }}</h1>
+ </header>
+ {% endif %}
+
+ {% filter markdown|typogrify -%}
+ {% block article -%}{%- endblock %}
+ {%- endfilter %}
+ </div>
+ </article>
+
+</body>
+</html>
--- /dev/null
+<nav>
+
+ <p class="tagline">
+ <em>lldpd</em> is a 802.1ab implementation (LLDP) to
+ help you locate neighbors of all your equipments.
+ </p>
+
+ <ul>
+ <li><a href="index.html">Overview</a></li>
+ <li><a href="features.html">Features</a></li>
+ <li><a href="installation.html">Installation</a></li>
+ <li><a href="usage.html">Usage</a></li>
+ </ul>
+</nav>
+
+{# Local Variables: #}
+{# mode: html #}
+{# indent-tabs-mode: nil #}
+{# End: #}
--- /dev/null
+mode: development
+media_root: media
+media_url: /media
+base_url: /
+plugins:
+ - hyde.ext.plugins.meta.MetaPlugin
+ - extensions.combine.CombinePlugin
+ - hyde.ext.plugins.auto_extend.AutoExtendPlugin
+ - hyde.ext.plugins.less.LessCSSPlugin
+ - extensions.text.IncludeManpagePlugin
+ - hyde.ext.plugins.textlinks.TextlinksPlugin
+ - hyde.ext.plugins.images.ImageSizerPlugin
+ - hyde.ext.plugins.optipng.OptiPNGPlugin
+context:
+ data:
+ base: https://vincentbernat.github.com/lldpd/
+meta:
+ latestversion: "0.7.0"
+ nodemeta: meta.yaml
+ extends: base.j2
+ default_block: article
+less:
+ app: /usr/bin/lessc
+optipng:
+ app: /usr/bin/optipng
+ args:
+ quiet: ""
+markdown:
+ extensions:
+ - codehilite
+ - extra
+ - toc
+ output_format: html