aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hesse <mail@eworm.de>2016-05-07 22:58:01 +0200
committerChristian Hesse <mail@eworm.de>2016-05-07 22:58:01 +0200
commit676eb8e92602575c3b17a10b39bf06a5a6b97dbe (patch)
tree5d2b3cc0390642bd9c31983469e8ffb3f9ace52b
parent5125fa4c69d03e001ad4b5213970dfdf02219bd6 (diff)
downloadvis-676eb8e92602575c3b17a10b39bf06a5a6b97dbe.tar.gz
vis-676eb8e92602575c3b17a10b39bf06a5a6b97dbe.tar.xz
lexer: add networkd file LPeg lexer
-rw-r--r--lexers/networkd.lua274
-rw-r--r--vis.lua1
2 files changed, 275 insertions, 0 deletions
diff --git a/lexers/networkd.lua b/lexers/networkd.lua
new file mode 100644
index 0000000..3f27bae
--- /dev/null
+++ b/lexers/networkd.lua
@@ -0,0 +1,274 @@
+-- Copyright 2016 Christian Hesse
+-- systemd networkd file LPeg lexer.
+
+local l = require('lexer')
+local token, word_match = l.token, l.word_match
+local P, R, S = lpeg.P, lpeg.R, lpeg.S
+
+local M = {_NAME = 'networkd'}
+
+-- Whitespace.
+local ws = token(l.WHITESPACE, l.space^1)
+
+-- Comments.
+local comment = token(l.COMMENT, l.starts_line(S(';#')) * l.nonnewline^0)
+
+-- Strings.
+local sq_str = l.delimited_range("'")
+local dq_str = l.delimited_range('"')
+local section_word = word_match{
+ 'Address',
+ 'Link',
+ 'Match',
+ 'Network',
+ 'Route',
+ 'DHCP',
+ 'DHCPServer',
+ 'Bridge',
+ 'BridgeFDB',
+ 'NetDev',
+ 'VLAN',
+ 'MACVLAN',
+ 'MACVTAP',
+ 'IPVLAN',
+ 'VXLAN',
+ 'Tunnel',
+ 'Peer',
+ 'Tun',
+ 'Tap',
+ 'Bond'
+}
+local string = token(l.STRING, sq_str + dq_str + '[' * section_word * ']')
+
+-- Numbers.
+local dec = l.digit^1 * ('_' * l.digit^1)^0
+local oct_num = '0' * S('01234567_')^1
+local integer = S('+-')^-1 * (l.hex_num + oct_num + dec)
+local number = token(l.NUMBER, (l.float + integer))
+
+-- Keywords.
+local keyword = token(l.KEYWORD, word_match{
+ -- boolean values
+ 'true',
+ 'false',
+ 'on',
+ 'off',
+ 'yes',
+ 'no',
+})
+
+-- Options.
+local option_word = word_match{
+ -- match section options
+ 'MACAddress',
+ 'OriginalName',
+ 'Path',
+ 'Driver',
+ 'Type',
+ 'Host',
+ 'Name',
+ 'Virtualization',
+ 'KernelCommandLine',
+ 'Architecture',
+
+ -- link section options
+ 'Description',
+ 'Alias',
+ 'MACAddressPolicy',
+ 'MACAddress',
+ 'NamePolicy',
+ 'Name',
+ 'MTUBytes',
+ 'BitsPerSecond',
+ 'Duplex',
+ 'WakeOnLan',
+
+ -- network section options
+ 'Description',
+ 'DHCP',
+ 'DHCPServer',
+ 'LinkLocalAddressing',
+ 'IPv4LLRoute',
+ 'IPv6Token',
+ 'LLMNR',
+ 'MulticastDNS',
+ 'DNSSEC',
+ 'DNSSECNegativeTrustAnchors',
+ 'LLDP',
+ 'BindCarrier',
+ 'Address',
+ 'Gateway',
+ 'DNS',
+ 'Domains',
+ 'NTP',
+ 'IPForward',
+ 'IPMasquerade',
+ 'IPv6PrivacyExtensions',
+ 'IPv6AcceptRouterAdvertisements',
+ 'IPv6DuplicateAddressDetection',
+ 'IPv6HopLimit',
+ 'Bridge',
+ 'Bond',
+ 'VLAN',
+ 'MACVLAN',
+ 'VXLAN',
+ 'Tunnel',
+
+ -- address section options
+ 'Address',
+ 'Peer',
+ 'Broadcast',
+ 'Label',
+
+ -- route section options
+ 'Gateway',
+ 'Destination',
+ 'Source',
+ 'Metric',
+ 'Scope',
+ 'PreferredSource',
+
+ -- dhcp section options
+ 'UseDNS',
+ 'UseNTP',
+ 'UseMTU',
+ 'SendHostname',
+ 'UseHostname',
+ 'Hostname',
+ 'UseDomains',
+ 'UseRoutes',
+ 'UseTimezone',
+ 'CriticalConnection',
+ 'ClientIdentifier',
+ 'VendorClassIdentifier',
+ 'RequestBroadcast',
+ 'RouteMetric',
+
+ -- dhcpserver section options
+ 'PoolOffset',
+ 'PoolSize',
+ 'DefaultLeaseTimeSec',
+ 'MaxLeaseTimeSec',
+ 'EmitDNS',
+ 'DNS',
+ 'EmitNTP',
+ 'NTP',
+ 'EmitTimezone',
+ 'Timezone',
+
+ -- bridge section options
+ 'UnicastFlood',
+ 'HairPin',
+ 'UseBPDU',
+ 'FastLeave',
+ 'AllowPortToBeRoot',
+ 'Cost',
+
+ -- bridgefdb section options
+ 'MACAddress',
+ 'VLANId',
+
+ -- netdev section options
+ 'Description',
+ 'Name',
+ 'Kind',
+ 'MTUBytes',
+ 'MACAddress',
+
+ -- bridge (netdev) section options
+ 'HelloTimeSec',
+ 'MaxAgeSec',
+ 'ForwardDelaySec',
+
+ -- vlan section options
+ 'Id',
+
+ -- macvlan, macvtap and ipvlan section options
+ 'Mode',
+
+ -- vxlan section options
+ 'Id',
+ 'Group',
+ 'TOS',
+ 'TTL',
+ 'MacLearning',
+ 'FDBAgeingSec',
+ 'MaximumFDBEntries',
+ 'ARPProxy',
+ 'L2MissNotification',
+ 'L3MissNotification',
+ 'RouteShortCircuit',
+ 'UDPCheckSum',
+ 'UDP6ZeroChecksumTx',
+ 'UDP6ZeroCheckSumRx',
+ 'GroupPolicyExtension',
+ 'DestinationPort',
+ 'PortRange',
+
+ -- tunnel section options
+ 'Local',
+ 'Remote',
+ 'TOS',
+ 'TTL',
+ 'DiscoverPathMTU',
+ 'IPv6FlowLabel',
+ 'CopyDSCP',
+ 'EncapsulationLimit',
+ 'Mode',
+
+ -- peer section options
+ 'Name',
+ 'MACAddress',
+
+ -- tun and tap section options
+ 'OneQueue',
+ 'MultiQueue',
+ 'PacketInfo',
+ 'VNetHeader',
+ 'User',
+ 'Group',
+
+ -- bond section options
+ 'Mode',
+ 'TransmitHashPolicy',
+ 'LACPTransmitRate',
+ 'MIIMonitorSec',
+ 'UpDelaySec',
+ 'DownDelaySec',
+ 'LearnPacketIntervalSec',
+ 'AdSelect',
+ 'FailOverMACPolicy',
+ 'ARPValidate',
+ 'ARPIntervalSec',
+ 'ARPIPTargets',
+ 'ARPAllTargets',
+ 'PrimaryReselectPolicy',
+ 'ResendIGMP',
+ 'PacketsPerSlave',
+ 'GratuitousARP',
+ 'AllSlavesActive',
+ 'MinLinks',
+}
+local preproc = token(l.PREPROCESSOR, option_word)
+
+-- Identifiers.
+local word = (l.alpha + '_') * (l.alnum + S('_.'))^0
+local identifier = token(l.IDENTIFIER, word)
+
+-- Operators.
+local operator = token(l.OPERATOR, '=')
+
+M._rules = {
+ {'whitespace', ws},
+ {'keyword', keyword},
+ {'string', string},
+ {'preproc', preproc},
+ {'identifier', identifier},
+ {'comment', comment},
+ {'number', number},
+ {'operator', operator},
+}
+
+M._LEXBYLINE = true
+
+return M
diff --git a/vis.lua b/vis.lua
index 56c9ca7..47be490 100644
--- a/vis.lua
+++ b/vis.lua
@@ -142,6 +142,7 @@ vis.filetypes = {
[".ledger|.journal"] = "ledger",
[".less"] = "less",
[".lily|.ly"] = "lilypond",
+ [".link|.network|.netdev"] = "networkd",
[".litcoffee"] = "litcoffee",
[".lua"] = "lua",
[".md|.markdown"] = "markdown",