brew install libevent
brew install readline
./configure CPPFLAGS="-I$(brew --prefix readline)/include" \
- LDFLAGS="-L$(brew --prefix readline)/lib"
+ LDFLAGS="-L$(brew --prefix readline)/lib" \
+ --with-privsep-chroot=/var/empty
make
sudo make install
dscl . -create /Groups/_lldpd RealName "lldpd privilege separation group"
dscl . -create /Users/_lldpd
dscl . -create /Users/_lldpd UserShell /usr/bin/false
- dscl . -create /Users/_lldpd NFSHomeDirectory /var/run/lldpd
+ dscl . -create /Users/_lldpd NFSHomeDirectory /var/empty
dscl . -create /Users/_lldpd PrimaryGroupID 274
dscl . -create /Users/_lldpd UniqueID 274
dscl . -create /Users/_lldpd Password "*"
dscl . -create /Users/_lldpd RealName "lldpd privilege separation user"
-Also create `/var/run/lldpd`:
+Alternatively, you can use a convenient brew formula:
- mkdir -p /var/run/lldpd/etc
- cp /etc/localtime /var/run/lldpd/etc/.
+ brew install https://raw.github.com/vincentbernat/lldpd/master/osx/lldpd.rb
+
+This formula includes the ability to interface properly with launchd
+to start `lldpd` at boot.
Usage
-----
--- /dev/null
+require 'formula'
+
+class Lldpd < Formula
+ homepage 'https://github.com/vincentbernat/lldpd/wiki'
+ url 'http://media.luffy.cx/files/lldpd/lldpd-0.7.1.tar.gz'
+ md5 '1534a5deb9671afb83be9b01edba9908'
+
+ # Included copy of libevent does not like automake 1.13
+ # head 'git://github.com/vincentbernat/lldpd.git'
+
+ depends_on 'readline'
+ depends_on 'libevent'
+ depends_on 'pkg-config'
+ depends_on 'autoconf' if build.head?
+ depends_on 'automake' if build.head?
+ depends_on 'libtool' if build.head?
+
+ def install
+ readline = Formula.factory 'readline'
+ if build.head?
+ system "env LIBTOOLIZE=glibtoolize ./autogen.sh"
+ end
+ system "./configure", "--prefix=#{prefix}",
+ "--with-xml",
+ "--with-readline",
+ "--with-privsep-chroot=/var/empty",
+ "CPPFLAGS=-I#{readline.include}",
+ "LDFLAGS=-L#{readline.lib}"
+ system "make"
+ system "make install"
+ end
+
+ def dscl(*args)
+ result = `dscl . -#{args.join(' ')} 2> /dev/null`
+ if $? != 0
+ raise ErrorDuringExecution, "Failure while executing dscl: #{args.join(' ')}"
+ end
+ return result
+ end
+
+ # Create user and group if needed
+ def caveats
+ u = "_lldpd"
+ unless Kernel.system "/usr/bin/dscl . -read /Users/#{u} &> /dev/null"
+ # Find a free UID/GID
+ uids = dscl("list /Users uid")
+ gids = dscl("list /Groups gid")
+ uid = 200
+ while uids =~ Regexp.new("#{Regexp.escape(uid.to_s)}\n") || gids =~ Regexp.new("#{Regexp.escape(uid.to_s)}\n")
+ uid += 1
+ end
+ s = <<-EOS.undent
+ You need to create a special user to run lldpd.
+ Just type the following commands:
+ sudo dscl . -create /Groups/#{u}
+ sudo dscl . -create /Groups/#{u} PrimaryGroupID #{uid.to_s}
+ sudo dscl . -create /Groups/#{u} Password "*"
+ sudo dscl . -create /Groups/#{u} RealName "lldpd privilege separation group"
+ sudo dscl . -create /Users/#{u}
+ sudo dscl . -create /Users/#{u} UserShell /usr/bin/false
+ sudo dscl . -create /Users/#{u} NFSHomeDirectory /var/empty
+ sudo dscl . -create /Users/#{u} PrimaryGroupID #{uid.to_s}
+ sudo dscl . -create /Users/#{u} UniqueID #{uid.to_s}
+ sudo dscl . -create /Users/#{u} Password "*"
+ sudo dscl . -create /Users/#{u} RealName "lldpd privilege separation user"
+ EOS
+ return s
+ end
+ end
+
+ plist_options :startup => true
+ def plist; <<-EOS.undent
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+ <plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>#{plist_name}</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>#{opt_prefix}/sbin/lldpd</string>
+ </array>
+ <key>RunAtLoad</key><true/>
+ <key>KeepAlive</key><true/>
+ </dict>
+ </plist>
+ EOS
+ end
+
+end