[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. db94b467fb8abb1e37f717340d439826b8712b6f
Micah Anderson
micah at riseup.net
Sun Mar 9 21:58:54 UTC 2008
The following commit has been merged in the master branch:
commit f703755bbc7fa06a72e8af6dacce900928e51495
Author: Micah Anderson <micah at riseup.net>
Date: Sun Mar 9 13:54:50 2008 -0400
Merged in upstream proposed 0.24.3
diff --git a/CHANGELOG b/CHANGELOG
index b29f768..c7e443e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,108 @@
+ Fixing the rest of #1113: External node commands can specify
+ an environment and Puppet will now use it.
+
+ Partially fixing #1113: LDAP nodes now support environments,
+ and the schema has been updated accordingly.
+
+ Always duplicating resource defaults in the parser, so that
+ stacked metaparameter values do not result in all resources
+ that receive a given default also getting those stacked
+ values.
+
+0.24.2
+ Fixing #1062 by moving the yamldir setting to its own yaml
+ section. This should keep the yamldir from being created
+ on clients.
+
+ Fixed #1047 -- Puppet's parser no longer changes the order
+ in which statements are evaluated, which means that case
+ statements can now set variables that are used by other
+ variables.
+
+ Fixed #1063 -- the master correctly logs syntax errors when
+ reparsing during a single run.
+
+ Removed the loglevels from the valid values for `logoutput`
+ in the Exec resource type -- the log levels are specified
+ using the `loglevel` parameter, not `logoutput`. This never
+ worked, or at least hasn`t for ages, and now the docs are
+ just correct.
+
+ Somewhat refactored fileserving so that it no longer caches
+ any objects, nor does it use Puppet's RAL resources. In the
+ process, I fixed #894 (you can now copy links) and refactored
+ other classes as necessary. Mostly it was fixing tests.
+
+ Hopefully partially fixed #1010 -- clients should now fail
+ to install files whose checksums do not match the checksum
+ from the server.
+
+ Fixed #1018 -- resources now have their namevars added as
+ aliases in the resource catalog, just like they were added
+ in the resource classes.
+
+ Fixed #1037 -- remote unreadable files no longer have the
+ permission denied exceptions caught, thus forbidding them
+ from being replaced with 'nil'.
+
+ Fixed #1043 -- autoloading now searches the plugins directory
+ in each module, in addition to the lib directory. The 'lib'
+ directory is also deprecated, but supported for now to give
+ people a chance to convert.
+
+ Fixed #1003 -- Applying DavidS's patch to fix searching for
+ tags in sql.
+
+ Fixed #992 -- Puppet is now compatible with gems 1.0.1.
+
+ Fixed #968 again, this time with tests -- parseonly works,
+ including not compiling the configurations, and also storeconfigs
+ is no longer required during parse-testing.
+
+ Fixed #1021 -- the problem was that my method of determining
+ the in-degree sometimes resulted in a lower number than the
+ number of in-edges.
+
+ Fixed #997 -- virtual defined types are no longer evaluated.
+ NOTE: This introduces a behaviour change, in that you previously
+ could realize a resource within a virtual defined resource, and now
+ you must realize the entire defined resource, rather than just
+ the contained resource.
+
+ Fixed #1030 - class and definition evaluation has been significantly
+ refactored, fixing this problem and making the whole interplay
+ between the classes, definitions, and nodes, and the Compile class much
+ cleaner.
+
+ Exec resources must now have unique names, although the commands can still
+ be duplicated. This is easily accomplished by just specifying a unique
+ name with whatever (unique or otherwise) command you need.
+
+ Fixed #989 -- missing CRL files are correctly ignored, and the
+ value should be set to 'false' to explicitly not look for these
+ files.
+
+ Fixed #1017 -- environment-specific modulepath is no longer ignored.
+
+ Fixing #794 -- consolidating the gentoo configuration files.
+
+ Fixing #976 -- both the full name of qualified classes and
+ the class parts are now added as tags. I've also
+ created a Tagging module that we should push throughout
+ the rest of the system that uses tags.
+
+ Fixing #995 -- puppetd no longer dies at startup if the server
+ is not running.
+
+ Fixing #977 -- the rundir is again set to 1777.
+
+ Fixed #971 -- classes can once again be included multiple
+ times.
+
+ Added builtin support for Nagios types using
+ Naginator to parse and generate the files.
+
+0.24.1
Updated vim filetype detection. (#900 and #963)
Default resources like schedules no longer conflict with
diff --git a/Rakefile b/Rakefile
index d5b65e4..f67ad92 100644
--- a/Rakefile
+++ b/Rakefile
@@ -83,10 +83,6 @@ rule(/_is_runnable$/) do |t|
end
end
-file "debian" => :bzr_is_runnable do
- system("bzr get http://www.hezmatt.org/~mpalmer/bzr/puppet.debian.svn debian") || exit(1)
-end
-
task :check_build_deps => 'dpkg-checkbuilddeps_is_runnable' do
system("dpkg-checkbuilddeps") || exit(1)
end
diff --git a/conf/freebsd/puppetd b/conf/freebsd/puppetd
index bf718a0..4a5ae59 100644
--- a/conf/freebsd/puppetd
+++ b/conf/freebsd/puppetd
@@ -18,7 +18,7 @@ pidfile="/var/run/$name.pid"
# read configuration and set defaults
load_rc_config "$name"
: ${puppetd_enable="NO"}
-: ${puppetd_config="/usr/local/etc/puppetd.conf"}
+: ${puppetd_config="/usr/local/etc/puppet.conf"}
: ${puppetd_flags=""}
command_args="--config $puppetd_config $puppetd_flags"
diff --git a/conf/freebsd/puppetmasterd b/conf/freebsd/puppetmasterd
index 6f217dc..d41e003 100644
--- a/conf/freebsd/puppetmasterd
+++ b/conf/freebsd/puppetmasterd
@@ -18,7 +18,7 @@ pidfile="/var/run/$name.pid"
# read configuration and set defaults
load_rc_config "$name"
: ${puppetmasterd_enable="NO"}
-: ${puppetmasterd_config="/usr/local/etc/puppetmasterd.conf"}
+: ${puppetmasterd_config="/usr/local/etc/puppet.conf"}
: ${puppetmasterd_flags=""}
command_args="--config $puppetmasterd_config $puppetmasterd_flags"
diff --git a/conf/redhat/puppet.conf b/conf/gentoo/puppet/puppet.conf
similarity index 100%
copy from conf/redhat/puppet.conf
copy to conf/gentoo/puppet/puppet.conf
diff --git a/conf/gentoo/puppet/puppetca.conf b/conf/gentoo/puppet/puppetca.conf
deleted file mode 100755
index 35f4abf..0000000
--- a/conf/gentoo/puppet/puppetca.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-[puppet]
- # Where Puppet stores dynamic and growing data.
- # The default value is '/var/puppet'.
- vardir = /var/lib/puppet
-
- # The Puppet log directory.
- # The default value is '$vardir/log'.
- logdir = /var/log/puppet
-
- # Where Puppet PID files are kept.
- # The default value is '$vardir/run'.
- rundir = /var/run/puppet
-
- # Where SSL certificates are kept.
- # The default value is '$confdir/ssl'.
- ssldir = $vardir/ssl
-
-[puppetd]
- # The file in which puppetd stores a list of the classes
- # associated with the retrieved configuratiion. Can be loaded in
- # the separate ``puppet`` executable using the ``--loadclasses``
- # option.
- # The default value is '$confdir/classes.txt'.
- classfile = $vardir/classes.txt
-
- # Where puppetd caches the local configuration. An
- # extension indicating the cache format is added automatically.
- # The default value is '$confdir/localconfig'.
- localconfig = $vardir/localconfig
diff --git a/conf/gentoo/puppet/puppetd.conf b/conf/gentoo/puppet/puppetd.conf
deleted file mode 100644
index 35f4abf..0000000
--- a/conf/gentoo/puppet/puppetd.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-[puppet]
- # Where Puppet stores dynamic and growing data.
- # The default value is '/var/puppet'.
- vardir = /var/lib/puppet
-
- # The Puppet log directory.
- # The default value is '$vardir/log'.
- logdir = /var/log/puppet
-
- # Where Puppet PID files are kept.
- # The default value is '$vardir/run'.
- rundir = /var/run/puppet
-
- # Where SSL certificates are kept.
- # The default value is '$confdir/ssl'.
- ssldir = $vardir/ssl
-
-[puppetd]
- # The file in which puppetd stores a list of the classes
- # associated with the retrieved configuratiion. Can be loaded in
- # the separate ``puppet`` executable using the ``--loadclasses``
- # option.
- # The default value is '$confdir/classes.txt'.
- classfile = $vardir/classes.txt
-
- # Where puppetd caches the local configuration. An
- # extension indicating the cache format is added automatically.
- # The default value is '$confdir/localconfig'.
- localconfig = $vardir/localconfig
diff --git a/conf/gentoo/puppet/puppetmasterd.conf b/conf/gentoo/puppet/puppetmasterd.conf
deleted file mode 100755
index 35f4abf..0000000
--- a/conf/gentoo/puppet/puppetmasterd.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-[puppet]
- # Where Puppet stores dynamic and growing data.
- # The default value is '/var/puppet'.
- vardir = /var/lib/puppet
-
- # The Puppet log directory.
- # The default value is '$vardir/log'.
- logdir = /var/log/puppet
-
- # Where Puppet PID files are kept.
- # The default value is '$vardir/run'.
- rundir = /var/run/puppet
-
- # Where SSL certificates are kept.
- # The default value is '$confdir/ssl'.
- ssldir = $vardir/ssl
-
-[puppetd]
- # The file in which puppetd stores a list of the classes
- # associated with the retrieved configuratiion. Can be loaded in
- # the separate ``puppet`` executable using the ``--loadclasses``
- # option.
- # The default value is '$confdir/classes.txt'.
- classfile = $vardir/classes.txt
-
- # Where puppetd caches the local configuration. An
- # extension indicating the cache format is added automatically.
- # The default value is '$confdir/localconfig'.
- localconfig = $vardir/localconfig
diff --git a/conf/namespaceauth.conf b/conf/namespaceauth.conf
new file mode 100644
index 0000000..8372357
--- /dev/null
+++ b/conf/namespaceauth.conf
@@ -0,0 +1,20 @@
+# This is an example namespaceauth.conf file,
+# which you'll need if you want to start a client
+# in --listen mode.
+[fileserver]
+ allow *.domain.com
+
+[puppetmaster]
+ allow *.domain.com
+
+[puppetrunner]
+ allow culain.domain.com
+
+[puppetbucket]
+ allow *.domain.com
+
+[puppetreports]
+ allow *.domain.com
+
+[resource]
+ allow server.domain.com
diff --git a/conf/redhat/puppet.spec b/conf/redhat/puppet.spec
index 6f84f54..bca690c 100644
--- a/conf/redhat/puppet.spec
+++ b/conf/redhat/puppet.spec
@@ -7,7 +7,7 @@
Summary: A network tool for managing many disparate systems
Name: puppet
-Version: 0.24.1
+Version: 0.24.2
Release: 1%{?dist}
License: GPLv2+
Group: System Environment/Base
@@ -157,6 +157,9 @@ fi
rm -rf %{buildroot}
%changelog
+* Sat Dec 22 2007 David Lutterkort <dlutter at redhat.com> - 0.24.1-1
+- New version
+
* Mon Dec 17 2007 David Lutterkort <dlutter at redhat.com> - 0.24.0-2
- Use updated upstream tarball that contains yumhelper.py
diff --git a/conf/solaris/smf/puppetd.xml b/conf/solaris/smf/puppetd.xml
index e2a1d89..ad1b452 100644
--- a/conf/solaris/smf/puppetd.xml
+++ b/conf/solaris/smf/puppetd.xml
@@ -18,7 +18,7 @@
grouping='require_all'
restart_on='none'
type='path'>
- <service_fmri value='file:///etc/puppet/puppetd.conf'/>
+ <service_fmri value='file:///etc/puppet/puppet.conf'/>
</dependency>
<dependency name='loopback'
diff --git a/conf/solaris/smf/puppetmasterd.xml b/conf/solaris/smf/puppetmasterd.xml
index e89e832..17c5291 100644
--- a/conf/solaris/smf/puppetmasterd.xml
+++ b/conf/solaris/smf/puppetmasterd.xml
@@ -18,7 +18,7 @@
grouping='require_all'
restart_on='none'
type='path'>
- <service_fmri value='file:///etc/puppet/puppetmasterd.conf'/>
+ <service_fmri value='file:///etc/puppet/puppet.conf'/>
</dependency>
<dependency name='loopback'
diff --git a/conf/suse/puppet.spec b/conf/suse/puppet.spec
index 6d4e9f5..f1fa0ba 100644
--- a/conf/suse/puppet.spec
+++ b/conf/suse/puppet.spec
@@ -5,7 +5,7 @@
Summary: A network tool for managing many disparate systems
Name: puppet
-Version: 0.18.4
+Version: 0.24.1
Release: 3%{?dist}
License: GPL
Group: System Environment/Base
@@ -15,11 +15,11 @@ Source: http://reductivelabs.com/downloads/puppet/%{name}-%{version}.tgz
Patch0: puppet.suse.patch
Patch1: puppet.service.patch
-Requires: ruby >= 1.8.1
-Requires: facter >= 1.1.4
+Requires: ruby >= 1.8.6
+Requires: facter >= 1.3.7
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArchitectures: noarch
-BuildRequires: ruby >= 1.8.1
+BuildRequires: ruby >= 1.8.6
%description
Puppet lets you centrally manage every important aspect of your system using a
@@ -67,9 +67,7 @@ find %{buildroot}%{ruby_sitelibdir} -type f -perm +ugo+x -print0 | xargs -0 -r %
%{__install} -Dp -m0644 %{confdir}/server.sysconfig %{buildroot}%{_sysconfdir}/sysconfig/puppetmaster
%{__install} -Dp -m0755 %{suseconfdir}/server.init %{buildroot}%{_initrddir}/puppetmaster
%{__install} -Dp -m0644 %{confdir}/fileserver.conf %{buildroot}%{_sysconfdir}/puppet/fileserver.conf
-%{__install} -Dp -m0644 %{confdir}/puppetd.conf %{buildroot}%{_sysconfdir}/puppet/puppetd.conf
-%{__ln_s} puppetd.conf %{buildroot}%{_sysconfdir}/puppet/puppetmasterd.conf
-%{__ln_s} puppetd.conf %{buildroot}%{_sysconfdir}/puppet/puppetca.conf
+%{__install} -Dp -m0644 %{confdir}/puppet.conf %{buildroot}%{_sysconfdir}/puppet/puppet.conf
%{__install} -Dp -m0644 %{confdir}/logrotate %{buildroot}%{_sysconfdir}/logrotate.d/puppet
%files
@@ -79,7 +77,7 @@ find %{buildroot}%{ruby_sitelibdir} -type f -perm +ugo+x -print0 | xargs -0 -r %
%{ruby_sitelibdir}/*
%{_initrddir}/puppet
%config(noreplace) %{_sysconfdir}/sysconfig/puppet
-%config(noreplace) %{_sysconfdir}/puppet/puppetd.conf
+%config(noreplace) %{_sysconfdir}/puppet/puppet.conf
%doc CHANGELOG COPYING LICENSE README TODO examples
%exclude %{_sbindir}/puppetdoc
%config(noreplace) %{_sysconfdir}/logrotate.d/puppet
@@ -131,6 +129,10 @@ fi
%{__rm} -rf %{buildroot}
%changelog
+* Sat Feb 16 2008 James Turnbull <james at lovedthanlost.net> - 0.24.1-1
+- Fixed puppet configuation file references to match single puppet.conf file
+- Update versions for 0.24.1 release
+
* Tue Aug 3 2006 Martin Vuk <martin.vuk at fri.uni-lj.si> - 0.18.4-3
- Replaced puppet-bin.patch with %build section from David's spec
diff --git a/debian/changelog b/debian/changelog
index 9870bcd..69984d6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
-puppet (0.24.1-2) UNRELEASED; urgency=low
+puppet (0.24.1-2) unstable; urgency=low
* Set rundir correctly (Closes: #460203, #459579)
+ * Apply patch for puppet#1003 to enable collection of tagged resources
- -- Thom May <thom at debian.org> Fri, 11 Jan 2008 12:00:32 +0100
+ -- Thom May <thom at debian.org> Wed, 16 Jan 2008 11:08:55 +0100
puppet (0.24.1-1) unstable; urgency=low
diff --git a/examples/root/etc/puppet/puppetmasterd.conf b/examples/root/etc/puppet/puppet.conf
similarity index 59%
rename from examples/root/etc/puppet/puppetmasterd.conf
rename to examples/root/etc/puppet/puppet.conf
index b318207..151364e 100644
--- a/examples/root/etc/puppet/puppetmasterd.conf
+++ b/examples/root/etc/puppet/puppet.conf
@@ -1,7 +1,10 @@
+[puppetd]
+report = true
+factsync = true
+pluginsync = true
+
[puppetmasterd]
reports = store,rrdgraph,tagmail,log
-
-[ldap]
-ldapnodes = true
+node_terminus = ldap
ldapserver = culain.madstop.com
ldapbase = dc=madstop,dc=com
diff --git a/examples/root/etc/puppet/puppetd.conf b/examples/root/etc/puppet/puppetd.conf
deleted file mode 100644
index ce988cf..0000000
--- a/examples/root/etc/puppet/puppetd.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-[puppet]
-report = true
-factsync = true
-pluginsync = true
diff --git a/ext/ldap/puppet.schema b/ext/ldap/puppet.schema
index b7c715e..bbad23e 100644
--- a/ext/ldap/puppet.schema
+++ b/ext/ldap/puppet.schema
@@ -12,6 +12,11 @@ attributetype ( 1.1.3.9 NAME 'parentnode'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+attributetype ( 1.1.3.9 NAME 'environment'
+ DESC 'Puppet Node Environment'
+ EQUALITY caseIgnoreIA5Match
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+
objectclass ( 1.1.1.2 NAME 'puppetClient' SUP top AUXILIARY
DESC 'Puppet Client objectclass'
- MAY ( puppetclass $ parentnode ))
+ MAY ( puppetclass $ parentnode $ environment ))
diff --git a/ext/logcheck/puppet b/ext/logcheck/puppet
index ab617e7..449ec70 100644
--- a/ext/logcheck/puppet
+++ b/ext/logcheck/puppet
@@ -13,3 +13,10 @@
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Caught (TERM|INT); shutting down$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Shutting down$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Restarting with .*$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Starting catalog run$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Finished catalog run in [.0-9]+ seconds$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Loading fact .*$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Ignoring cache$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Ignoring --listen on onetime run$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Retrieving plugins$
+
diff --git a/ext/puppet-test b/ext/puppet-test
index 362a439..e18dd1c 100755
--- a/ext/puppet-test
+++ b/ext/puppet-test
@@ -53,6 +53,9 @@
# list::
# List all available tests.
#
+# pause::
+# Pause before starting test (useful for testing with dtrace).
+#
# repeat::
# How many times to perform the test.
#
@@ -88,7 +91,7 @@
# Do an initial trap, so that cancels don't get a stack trace.
trap(:INT) do
$stderr.puts "Cancelling startup"
- exit(0)
+ exit(1)
end
require 'puppet'
@@ -165,6 +168,12 @@ class Suite
puts "Running %s %s test" % [@name, test]
prepare()
+ if $options[:pause]
+ puts "Hit any key to continue"
+ $stdin.readline
+ puts "Continuing with test"
+ end
+
if $options[:fork] > 0
@forking = true
$options[:fork].times {
@@ -200,6 +209,17 @@ class Suite
end
end
+Suite.new :parser, "Manifest parsing" do
+ def prepare
+ end
+
+ newtest :parse, "Parsed files" do
+ @parser = Puppet::Parser::Parser.new(:environment => Puppet[:environment])
+ @parser.file = Puppet[:manifest]
+ @parser.parse
+ end
+end
+
Suite.new :catalog, "Catalog handling" do
def prepare
$args[:cache] = false
@@ -325,12 +345,13 @@ end
$cmdargs = [
[ "--compile", "-c", GetoptLong::NO_ARGUMENT ],
- [ "--describe", "-D", GetoptLong::REQUIRED_ARGUMENT ],
+ [ "--describe", GetoptLong::REQUIRED_ARGUMENT ],
[ "--retrieve", "-R", GetoptLong::REQUIRED_ARGUMENT ],
[ "--fork", GetoptLong::REQUIRED_ARGUMENT ],
[ "--fqdn", "-F", GetoptLong::REQUIRED_ARGUMENT ],
[ "--suite", "-s", GetoptLong::REQUIRED_ARGUMENT ],
[ "--test", "-t", GetoptLong::REQUIRED_ARGUMENT ],
+ [ "--pause", "-p", GetoptLong::NO_ARGUMENT ],
[ "--repeat", "-r", GetoptLong::REQUIRED_ARGUMENT ],
[ "--debug", "-d", GetoptLong::NO_ARGUMENT ],
[ "--help", "-h", GetoptLong::NO_ARGUMENT ],
@@ -340,14 +361,14 @@ $cmdargs = [
]
# Add all of the config parameters as valid $options.
-Puppet.config.addargs($cmdargs)
+Puppet.settings.addargs($cmdargs)
Puppet::Util::Log.newdestination(:console)
result = GetoptLong.new(*$cmdargs)
$args = {}
-$options = {:repeat => 1, :fork => 0}
+$options = {:repeat => 1, :fork => 0, :pause => false}
begin
explicit_waitforcert = false
@@ -399,6 +420,8 @@ begin
$options[:test] = arg.intern
when "--file"
$options[:file] = arg
+ when "--pause"
+ $options[:pause] = true
when "--list"
Suite.suites.sort { |a,b| a.to_s <=> b.to_s }.each do |suite_name|
suite = Suite[suite_name]
@@ -407,7 +430,7 @@ begin
end
exit(0)
else
- Puppet.config.handlearg(opt, arg)
+ Puppet.settings.handlearg(opt, arg)
end
}
rescue GetoptLong::InvalidOption => detail
diff --git a/lib/puppet.rb b/lib/puppet.rb
index 18037cd..a0cd1e7 100644
--- a/lib/puppet.rb
+++ b/lib/puppet.rb
@@ -25,7 +25,7 @@ require 'puppet/util/suidmanager'
# it's also a place to find top-level commands like 'debug'
module Puppet
- PUPPETVERSION = '0.24.1'
+ PUPPETVERSION = '0.24.2'
def Puppet.version
return PUPPETVERSION
@@ -423,6 +423,7 @@ module Puppet
end
require 'puppet/type'
+require 'puppet/network'
require 'puppet/module'
require 'puppet/util/storage'
require 'puppet/parser/interpreter'
diff --git a/lib/puppet/defaults.rb b/lib/puppet/defaults.rb
index a767d29..e022580 100644
--- a/lib/puppet/defaults.rb
+++ b/lib/puppet/defaults.rb
@@ -66,7 +66,11 @@ module Puppet
:owner => "root",
:desc => "Where SSL certificates are kept."
},
- :rundir => { :default => rundir,
+ :rundir => {
+ :default => rundir,
+ :mode => 01777,
+ :owner => "$user",
+ :group => "$group",
:desc => "Where Puppet PID files are kept."
},
:genconfig => [false,
@@ -136,8 +140,6 @@ module Puppet
:show_diff => [false, "Whether to print a contextual diff when files are being replaced. The diff
is printed on stdout, so this option is meaningless unless you are running Puppet interactively.
This feature currently requires the ``diff/lcs`` Ruby library."],
- :yamldir => {:default => "$vardir/yaml", :owner => "$user", :group => "$user", :mode => "750",
- :desc => "The directory in which YAML data is stored, usually in a subdirectory."},
:daemonize => { :default => true,
:desc => "Send the process into the background. This is the default.",
:short => "D"
@@ -228,7 +230,7 @@ module Puppet
:owner => "$user",
:group => "$group",
:mode => 0664,
- :desc => "The certificate revocation list (CRL) for the CA. Set this to 'none' if you do not want to use a CRL."
+ :desc => "The certificate revocation list (CRL) for the CA. Set this to 'false' if you do not want to use a CRL."
},
:caprivatedir => { :default => "$cadir/private",
:owner => "$user",
@@ -256,6 +258,7 @@ module Puppet
:serial => { :default => "$cadir/serial",
:owner => "$user",
:group => "$group",
+ :mode => 0600,
:desc => "Where the serial number for certificates is stored."
},
:autosign => { :default => "$confdir/autosign.conf",
@@ -305,7 +308,7 @@ module Puppet
:manifest => ["$manifestdir/site.pp",
"The entry-point manifest for puppetmasterd."],
:code => ["", "Code to parse directly. This is essentially only used
- by ``puppet`, and should only be set if you're writing your own Puppet
+ by ``puppet``, and should only be set if you're writing your own Puppet
executable"],
:masterlog => { :default => "$logdir/puppetmaster.log",
:owner => "$user",
@@ -668,5 +671,10 @@ module Puppet
:rrdinterval => ["$runinterval", "How often RRD should expect data.
This should match how often the hosts report back to the server."]
)
+
+ Puppet.setdefaults(:yaml,
+ :yamldir => {:default => "$vardir/yaml", :owner => "$user", :group => "$user", :mode => "750",
+ :desc => "The directory in which YAML data is stored, usually in a subdirectory."}
+ )
end
diff --git a/lib/puppet/dsl.rb b/lib/puppet/dsl.rb
index 4fbce55..966feaf 100644
--- a/lib/puppet/dsl.rb
+++ b/lib/puppet/dsl.rb
@@ -46,58 +46,56 @@
#
# apply
-module Puppet
- # Provide the actual commands for acting like a language.
- module DSL
- def aspect(name, options = {}, &block)
- Puppet::Aspect.new(name, options, &block)
- end
+require 'puppet'
- def acquire(*names)
- names.each do |name|
- if aspect = Puppet::Aspect[name]
- unless aspect.evaluated?
- aspect.evaluate
- end
- else
- raise "Could not find aspect %s" % name
+# Provide the actual commands for acting like a language.
+module Puppet::DSL
+ def aspect(name, options = {}, &block)
+ Puppet::DSL::Aspect.new(name, options, &block)
+ end
+
+ def acquire(*names)
+ names.each do |name|
+ if aspect = Puppet::DSL::Aspect[name]
+ unless aspect.evaluated?
+ aspect.evaluate
end
+ else
+ raise "Could not find aspect %s" % name
end
end
+ end
- def apply
- bucket = export()
- catalog = bucket.to_catalog
- catalog.apply
- end
+ def apply
+ bucket = export()
+ catalog = bucket.to_catalog
+ catalog.apply
+ end
- def export
- objects = Puppet::Aspect.collect do |name, aspect|
- if aspect.evaluated?
- aspect.export
- end
- end.reject { |a| a.nil? }.flatten.collect do |obj|
- obj.to_trans
+ def export
+ objects = Puppet::DSL::Aspect.collect do |name, aspect|
+ if aspect.evaluated?
+ aspect.export
end
- bucket = Puppet::TransBucket.new(objects)
- bucket.name = "top"
- bucket.type = "class"
-
- return bucket
+ end.reject { |a| a.nil? }.flatten.collect do |obj|
+ obj.to_trans
end
+ bucket = Puppet::TransBucket.new(objects)
+ bucket.name = "top"
+ bucket.type = "class"
- def init
- unless Process.uid == 0
- Puppet[:confdir] = File.expand_path("~/.puppet")
- Puppet[:vardir] = File.expand_path("~/.puppet/var")
- end
- Puppet[:user] = Process.uid
- Puppet[:group] = Process.gid
- Puppet::Util::Log.newdestination(:console)
- Puppet::Util::Log.level = :info
- end
+ return bucket
+ end
- private
+ def init
+ unless Process.uid == 0
+ Puppet[:confdir] = File.expand_path("~/.puppet")
+ Puppet[:vardir] = File.expand_path("~/.puppet/var")
+ end
+ Puppet[:user] = Process.uid
+ Puppet[:group] = Process.gid
+ Puppet::Util::Log.newdestination(:console)
+ Puppet::Util::Log.level = :info
end
class Aspect
@@ -224,10 +222,10 @@ module Puppet
end
def newresource(type, name, params = {})
- if self.is_a?(Puppet::Aspect)
+ if self.is_a?(Puppet::DSL::Aspect)
source = self
else
- source = Puppet::Aspect[:main]
+ source = Puppet::DSL::Aspect[:main]
end
unless obj = @@objects[type][name]
obj = Resource.new :title => name, :type => type.name,
@@ -262,7 +260,7 @@ module Puppet
env = nil
end
@node.parameters = Facter.to_hash
- @compile = Puppet::Parser::Compile.new(@node, @interp.send(:parser, env))
+ @compile = Puppet::Parser::Compiler.new(@node, @interp.send(:parser, env))
@scope = @compile.topscope
end
@scope
diff --git a/lib/puppet/external/gratr/rdot.rb b/lib/puppet/external/dot.rb
similarity index 100%
rename from lib/puppet/external/gratr/rdot.rb
rename to lib/puppet/external/dot.rb
diff --git a/lib/puppet/external/gratr.rb b/lib/puppet/external/gratr.rb
deleted file mode 100644
index b830cae..0000000
--- a/lib/puppet/external/gratr.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/base'
-require 'puppet/external/gratr/digraph'
-require 'puppet/external/gratr/undirected_graph'
-require 'puppet/external/gratr/common'
diff --git a/lib/puppet/external/gratr/adjacency_graph.rb b/lib/puppet/external/gratr/adjacency_graph.rb
deleted file mode 100644
index b740c47..0000000
--- a/lib/puppet/external/gratr/adjacency_graph.rb
+++ /dev/null
@@ -1,257 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/graph'
-require 'set'
-
-module GRATR
-
- # This provides the basic routines needed to implement the Digraph, UndirectedGraph,
- # PseudoGraph, DirectedPseudoGraph, MultiGraph and DirectedPseudoGraph class.
- module AdjacencyGraph
-
- include Graph
-
- class ArrayWithAdd < Array # :nodoc:
- alias add push
- end
-
- # Initialization parameters can include an Array of edges to add, Graphs to
- # copy (will merge if multiple)
- # :parallel_edges denotes that duplicate edges are allowed
- # :loops denotes that loops are allowed
- def initialize(*params)
- @vertex_dict = Hash.new
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? GRATR::Graph or
- p.kind_of? Array or
- p == :parallel_edges or
- p == :loops)
- end
- clear_all_labels
-
- # Basic configuration of adjacency
- @allow_loops = params.any? {|p| p == :loops}
- @parallel_edges = params.any? {|p| p == :parallel_edges}
- @edgelist_class = @parallel_edges ? ArrayWithAdd : Set
- if @parallel_edges
- @edge_number = Hash.new
- @next_edge_number = 0
- end
-
- # Copy any given graph into this graph
- params.select {|p| p.kind_of? GRATR::Graph}.each do |g|
- g.edges.each do |e|
- add_edge!(e)
- edge_label_set(e, edge_label(e)) if edge_label(e)
- end
- g.vertices.each do |v|
- vertex_label_set(v, vertex_label(v)) if vertex_label(v)
- end
- end
-
- # Add all array edges specified
- params.select {|p| p.kind_of? Array}.each do |a|
- 0.step(a.size-1, 2) {|i| add_edge!(a[i], a[i+1])}
- end
-
- end
-
- # Returns true if v is a vertex of this Graph
- # An O(1) implementation of vertex?
- def vertex?(v) @vertex_dict.has_key?(v); end
-
- # Returns true if [u,v] or u is an Edge
- # An O(1) implementation
- def edge?(u, v=nil)
- u, v = u.source, u.target if u.kind_of? GRATR::Edge
- vertex?(u) and @vertex_dict[u].include?(v)
- end
-
- # Adds a vertex to the graph with an optional label
- def add_vertex!(vertex, label=nil)
- @vertex_dict[vertex] ||= @edgelist_class.new
- self[vertex] = label if label
- self
- end
-
- # Adds an edge to the graph
- # Can be called in two basic ways, label is optional
- # * add_edge!(Edge[source,target], "Label")
- # * add_edge!(source,target, "Label")
- def add_edge!(u, v=nil, l=nil, n=nil)
- if u.class.include? EdgeNumber and n.nil?
- n = u.number
- end
- if u.kind_of? GRATR::Edge
- edge = u
- u, v, l = u.source, u.target, u.label
- end
- if not @allow_loops and u == v
- return self
- end
- if @parallel_edges and ! n
- n = (@next_edge_number+=1)
- end
- add_vertex!(u);
- add_vertex!(v)
- @vertex_dict[u].add(v)
-
- if @parallel_edges
- (@edge_number[u] ||= @edgelist_class.new).add(n)
- end
- unless directed?
- @vertex_dict[v].add(u)
- if @parallel_edges
- (@edge_number[v] ||= @edgelist_class.new).add(n)
- end
- end
-
- if l
- unless edge
- if n
- edge = edge_class[u,v,n]
- else
- edge = edge_class[u,v]
- end
- end
- self[edge] = l
- end
- self
- end
-
- # Removes a given vertex from the graph
- def remove_vertex!(v)
-# FIXME This is broken for multi graphs
- @vertex_dict.delete(v)
- @vertex_dict.each_value { |adjList| adjList.delete(v) }
- @vertex_dict.keys.each do |u|
- delete_label(edge_class[u,v])
- delete_label(edge_class[v,u])
- end
- delete_label(v)
- self
- end
-
- # Removes an edge from the graph, can be called with source and target or with
- # and object of GRATR::Edge derivation
- def remove_edge!(u, v=nil)
- unless u.kind_of? GRATR::Edge
- raise ArgumentError if @parallel_edges
- u = edge_class[u,v]
- end
- raise ArgumentError if @parallel_edges and (u.number || 0) == 0
- return self unless @vertex_dict[u.source] # It doesn't exist
- delete_label(u) # Get rid of label
- if @parallel_edges
- index = @edge_number[u.source].index(u.number)
- raise NoEdgeError unless index
- @vertex_dict[u.source].delete_at(index)
- @edge_number[u.source].delete_at(index)
- else
- @vertex_dict[u.source].delete(u.target)
- end
- self
- end
-
- # Returns an array of vertices that the graph has
- def vertices() @vertex_dict.keys; end
-
- # Returns an array of edges, most likely of class Edge or UndirectedEdge depending
- # upon the type of graph
- def edges
- @vertex_dict.keys.inject(Set.new) do |a,v|
- if @parallel_edges and @edge_number[v]
- @vertex_dict[v].zip(@edge_number[v]).each do |w|
- s,t,n = v,w[0],w[1]
- a.add( edge_class[ s,t,n, edge_label(s,t,n) ] )
- end
- else
- @vertex_dict[v].each do |w|
- a.add(edge_class[v,w,edge_label(v,w)])
- end
- end; a
- end.to_a
- end
-
- alias graph_adjacent adjacent
- def adjacent(x, options={})
- unless @vertex_dict.has_key?(x)
- raise ArgumentError, "%s is not a vertex" % x
- end
- options[:direction] ||= :out
- if !x.kind_of?(GRATR::Edge) and (options[:direction] == :out || !directed?)
- if options[:type] == :edges
- @parallel_edges ?
- @vertex_dict[x].map {|v| e=edge_class[x,v, at edge_number[x][v]]; e.label = self[e]; e} :
- @vertex_dict[x].map {|v| e=edge_class[x,v]; e.label = self[e]; e}
- else
- @vertex_dict[x].to_a
- end
- else
- graph_adjacent(x,options)
- end
- end
-
-
- public
-
- def self.included(cl)
- # Shortcut for creating a Graph
- #
- # Example: GRATR::Digraph[1,2, 2,3, 2,4, 4,5].edges.to_a.to_s =>
- # "(1-2)(2-3)(2-4)(4-5)"
- #
- # Or as a Hash for specifying lables
- # GRATR::Digraph[ [:a,:b] => 3, [:b,:c] => 4 ] (Note: Do not use for Multi or Pseudo graphs)
- def cl.[] (*a)
- result = new
- if a.size == 1 and a[0].kind_of? Hash
- # Convert to edge class
- a[0].each do |k,v|
- if result.edge_class.include? GRATR::EdgeNumber
- result.add_edge!(result.edge_class[k[0],k[1],nil,v])
- else
- result.add_edge!(result.edge_class[k[0],k[1],v])
- end
- end
- elsif a[0].kind_of? GRATR::Edge
- a.each{|e| result.add_edge!(e); result[e] = e.label}
- elsif a.size % 2 == 0
- 0.step(a.size-1, 2) {|i| result.add_edge!(a[i], a[i+1])}
- else
- raise ArgumentError
- end
- result
- end
- end
-
- end # Adjacency Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/base.rb b/lib/puppet/external/gratr/base.rb
deleted file mode 100644
index 72dded7..0000000
--- a/lib/puppet/external/gratr/base.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-GRATR_VERSION = "0.4.1"
-
-module GRATR
- class NoVertexError < IndexError; end
- class NoEdgeError < IndexError; end
-end
diff --git a/lib/puppet/external/gratr/biconnected.rb b/lib/puppet/external/gratr/biconnected.rb
deleted file mode 100644
index c976b2c..0000000
--- a/lib/puppet/external/gratr/biconnected.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'set'
-
-module GRATR
- module Graph
- # Biconnected is a module for adding the biconnected algorithm to
- # UndirectedGraphs
- module Biconnected
-
- # biconnected computes the biconnected subgraphs
- # of a graph using Tarjan's algorithm based on DFS. See: Robert E. Tarjan
- # _Depth_First_Search_and_Linear_Graph_Algorithms_. SIAM Journal on
- # Computing, 1(2):146-160, 1972
- #
- # The output of the algorithm is a pair, the first value is an
- # array of biconnected subgraphs. The second is the set of
- # articulation vertices.
- #
- # A connected graph is biconnected if the removal of any single vertex
- # (and all edges incident on that vertex) cannot disconnect the graph.
- # More generally, the biconnected components of a graph are the maximal
- # subsets of vertices such that the removal of a vertex from a particular
- # component will not disconnect the component. Unlike connected components,
- # vertices may belong to multiple biconnected components: those vertices
- # that belong to more than one biconnected component are called articulation
- # points or, equivalently, cut vertices. Articulation points are vertices
- # whose removal would increase the number of connected components in the graph.
- # Thus, a graph without articulation points is biconnected.
- def biconnected
- dfs_num = 0
- number = {}; predecessor = {}; low_point = {}
- stack = []; result = []; articulation= []
-
- root_vertex = Proc.new {|v| predecessor[v]=v }
- enter_vertex = Proc.new {|u| number[u]=low_point[u]=(dfs_num+=1) }
- tree_edge = Proc.new do |e|
- stack.push(e)
- predecessor[e.target] = e.source
- end
- back_edge = Proc.new do |e|
- if e.target != predecessor[e.source]
- stack.push(e)
- low_point[e.source] = [low_point[e.source], number[e.target]].min
- end
- end
- exit_vertex = Proc.new do |u|
- parent = predecessor[u]
- is_articulation_point = false
- if number[parent] > number[u]
- parent = predecessor[parent]
- is_articulation_point = true
- end
- if parent == u
- is_articulation_point = false if (number[u] + 1) == number[predecessor[u]]
- else
- low_point[parent] = [low_point[parent], low_point[u]].min
- if low_point[u] >= number[parent]
- if number[parent] > number[predecessor[parent]]
- predecessor[u] = predecessor[parent]
- predecessor[parent] = u
- end
- result << (component = self.class.new)
- while number[stack[-1].source] >= number[u]
- component.add_edge!(stack.pop)
- end
- component.add_edge!(stack.pop)
- if stack.empty?
- predecessor[u] = parent
- predecessor[parent] = u
- end
- end
- end
- articulation << u if is_articulation_point
- end
-
- # Execute depth first search
- dfs({:root_vertex => root_vertex,
- :enter_vertex => enter_vertex,
- :tree_edge => tree_edge,
- :back_edge => back_edge,
- :exit_vertex => exit_vertex})
-
- [result, articulation]
- end # biconnected
-
- end # Biconnected
-
- end # Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/chinese_postman.rb b/lib/puppet/external/gratr/chinese_postman.rb
deleted file mode 100644
index 338a88b..0000000
--- a/lib/puppet/external/gratr/chinese_postman.rb
+++ /dev/null
@@ -1,123 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/digraph_distance'
-
-module GRATR
- module Graph
- module ChinesePostman
-
- # Returns the shortest walk that traverses all arcs at least
- # once, returning to the specified start node.
- def closed_chinese_postman_tour(start, weight=nil, zero=0)
- cost, path, delta = floyd_warshall(weight, zero)
- return nil unless cp_valid_least_cost? cost, zero
- positive, negative = cp_unbalanced(delta)
- f = cp_find_feasible(delta, positive, negative, zero)
- while cp_improve(f, positive, negative, cost, zero); end
- cp_euler_circuit(start, f, path)
- end
-
- private
-
- def cp_euler_circuit(start, f, path) # :nodoc:
- circuit = [u=v=start]
- bridge_taken = Hash.new {|h,k| h[k] = Hash.new}
- until v.nil?
- if v=f[u].keys.detect {|k| f[u][k] > 0}
- f[u][v] -= 1
- circuit << (u = path[u][v]) while u != v
- else
- unless bridge_taken[u][bridge = path[u][start]]
- v = vertices.detect {|v1| v1 != bridge && edge?(u,v1) && !bridge_taken[u][v1]} || bridge
- bridge_taken[u][v] = true
- circuit << v
- end
- end
- u=v
- end; circuit
- end
-
- def cp_cancel_cycle(cost, path, f, start, zero) # :nodoc:
- u = start; k = nil
- begin
- v = path[u][start]
- k = f[v][u] if cost[u][v] < zero and (k.nil? || k > f[v][u])
- end until (u=v) != start
- u = start
- begin
- v = path[u][start]
- cost[u][v] < zero ? f[v][u] -= k : f[u][v] += k
- end until (u=v) != start
- true # This routine always returns true to make cp_improve easier
- end
-
- def cp_improve(f, positive, negative, cost, zero) # :nodoc:
- residual = self.class.new
- negative.each do |u|
- positive.each do |v|
- residual.add_edge!(u,v,cost[u][v])
- residual.add_edge!(v,u,-cost[u][v]) if f[u][v] != 0
- end
- end
- r_cost, r_path, r_delta = residual.floyd_warshall(nil, zero)
- i = residual.vertices.detect {|v| r_cost[v][v] and r_cost[v][v] < zero}
- i ? cp_cancel_cycle(r_cost, r_path, f, i) : false
- end
-
- def cp_find_feasible(delta, positive, negative, zero) # :nodoc:
- f = Hash.new {|h,k| h[k] = Hash.new}
- negative.each do |i|
- positive.each do |j|
- f[i][j] = -delta[i] < delta[j] ? -delta[i] : delta[j]
- delta[i] += f[i][j]
- delta[j] -= f[i][j]
- end
- end; f
- end
-
- def cp_valid_least_cost?(c, zero) # :nodoc:
- vertices.each do |i|
- vertices.each do |j|
- return false unless c[i][j] and c[i][j] >= zero
- end
- end; true
- end
-
- def cp_unbalanced(delta) # :nodoc:
- negative = []; positive = []
- vertices.each do |v|
- negative << v if delta[v] < 0
- positive << v if delta[v] > 0
- end; [positive, negative]
- end
-
- end # Chinese Postman
- end # Graph
-end # GRATR
-
diff --git a/lib/puppet/external/gratr/common.rb b/lib/puppet/external/gratr/common.rb
deleted file mode 100644
index 347250e..0000000
--- a/lib/puppet/external/gratr/common.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/graph'
-
-module GRATR
- # This class defines a cycle graph of size n
- # This is easily done by using the base Graph
- # class and implemeting the minimum methods needed to
- # make it work. This is a good example to look
- # at for making one's own graph classes
- class Cycle
-
- def initialize(n) @size = n; end
- def directed?() false; end
- def vertices() (1.. at size).to_a; end
- def vertex?(v) v > 0 and v <= @size; end
- def edge?(u,v=nil)
- u, v = [u.source, v.target] if u.kind_of? GRATR::Edge
- vertex?(u) && vertex?(v) && ((v-u == 1) or (u==@size && v=1))
- end
- def edges() Array.new(@size) {|i| GRATR::UndirectedEdge[i+1, (i+1)==@size ? 1 : i+2]}; end
- end
-
- # This class defines a complete graph of size n
- # This is easily done by using the base Graph
- # class and implemeting the minimum methods needed to
- # make it work. This is a good example to look
- # at for making one's own graph classes
- class Complete < Cycle
- def initialize(n) @size = n; @edges = nil; end
- def edges
- return @edges if @edges # Cache edges
- @edges = []
- @size.times do |u|
- @size.times {|v| @edges << GRATR::UndirectedEdge[u+1, v+1]}
- end; @edges
- end
- def edge?(u,v=nil)
- u, v = [u.source, v.target] if u.kind_of? GRATR::Edge
- vertex?(u) && vertex?(v)
- end
- end # Complete
-
-
-
-end # GRATR
diff --git a/lib/puppet/external/gratr/comparability.rb b/lib/puppet/external/gratr/comparability.rb
deleted file mode 100644
index 1546fbe..0000000
--- a/lib/puppet/external/gratr/comparability.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
- module Graph
- module Comparability
-
- # A comparability graph is an UndirectedGraph that has a transitive
- # orientation. This returns a boolean that says if this graph
- # is a comparability graph.
- def comparability?() gamma_decomposition[1]; end
-
- # Returns an array with two values, the first being a hash of edges
- # with a number containing their class assignment, the second valud
- # is a boolean which states whether or not the graph is a
- # comparability graph
- #
- # Complexity in time O(d*|E|) where d is the maximum degree of a vertex
- # Complexity in space O(|V|+|E|)
- def gamma_decomposition
- k = 0; comparability=true; classification={}
- edges.map {|edge| [edge.source,edge.target]}.each do |e|
- if classification[e].nil?
- k += 1
- classification[e] = k; classification[e.reverse] = -k
- comparability &&= gratr_comparability_explore(e, k, classification)
- end
- end; [classification, comparability]
- end
-
- # Returns one of the possible transitive orientations of
- # the UndirectedGraph as a Digraph
- def transitive_orientation(digraph_class=Digraph)
- raise NotImplementError
- end
-
- private
-
- # Taken from Figure 5.10, on pg. 130 of Martin Golumbic's, _Algorithmic_Graph_
- # _Theory_and_Perfect_Graphs.
- def gratr_comparability_explore(edge, k, classification, space='')
- ret = gratr_comparability_explore_inner(edge, k, classification, :forward, space)
- gratr_comparability_explore_inner(edge.reverse, k, classification, :backward, space) && ret
- end
-
- def gratr_comparability_explore_inner(edge, k, classification, direction,space)
- comparability = true
- adj_target = adjacent(edge[1])
- adjacent(edge[0]).select do |mt|
- (classification[[edge[1],mt]] || k).abs < k or
- not adj_target.any? {|adj_t| adj_t == mt}
- end.each do |m|
- e = (direction == :forward) ? [edge[0], m] : [m,edge[0]]
- if classification[e].nil?
- classification[e] = k
- classification[e.reverse] = -k
- comparability = gratr_comparability_explore(e, k, classification, ' '+space) && comparability
- elsif classification[e] == -k
- classification[e] = k
- gratr_comparability_explore(e, k, classification, ' '+space)
- comparability = false
- end
- end; comparability
- end # gratr_comparability_explore_inner
-
- end # Comparability
- end # Graph
-end # GRATR
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/digraph.rb b/lib/puppet/external/gratr/digraph.rb
deleted file mode 100644
index 1223a65..0000000
--- a/lib/puppet/external/gratr/digraph.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/graph'
-require 'puppet/external/gratr/search'
-require 'puppet/external/gratr/adjacency_graph'
-require 'puppet/external/gratr/strong_components'
-require 'puppet/external/gratr/digraph_distance'
-require 'puppet/external/gratr/chinese_postman'
-
-module GRATR
- #
- # Digraph is a directed graph which is a finite set of vertices
- # and a finite set of edges connecting vertices. It cannot contain parallel
- # edges going from the same source vertex to the same target. It also
- # cannot contain loops, i.e. edges that go have the same vertex for source
- # and target.
- #
- # DirectedPseudoGraph is a class that allows for parallel edges, and a
- # DirectedMultiGraph is a class that allows for parallel edges and loops
- # as well.
- class Digraph
- include AdjacencyGraph
- include Graph::Search
- include Graph::StrongComponents
- include Graph::Distance
- include Graph::ChinesePostman
-
- def initialize(*params)
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? GRATR::Graph or p.kind_of? Array)
- end if self.class == GRATR::Digraph
- super(*params)
- end
-
- # A directed graph is directed by definition
- def directed?() true; end
-
- # A digraph uses the Edge class for edges
- def edge_class() @parallel_edges ? GRATR::MultiEdge : GRATR::Edge; end
-
- # Reverse all edges in a graph
- def reversal
- return new(self) unless directed?
- result = self.class.new
- edges.inject(result) {|a,e| a << e.reverse}
- vertices.each { |v| result.add_vertex!(v) unless result.vertex?(v) }
- result
- end
-
- # Return true if the Graph is oriented.
- def oriented?
- e = edges
- re = e.map {|x| x.reverse}
- not e.any? {|x| re.include?(x)}
- end
-
- # Balanced is when the out edge count is equal to the in edge count
- def balanced?(v) out_degree(v) == in_degree(v); end
-
- # Returns out_degree(v) - in_degree(v)
- def delta(v) out_degree(v) - in_degree(v); end
-
- end
-
- # DirectedGraph is just an alias for Digraph should one desire
- DirectedGraph = Digraph
-
- # This is a Digraph that allows for parallel edges, but does not
- # allow loops
- class DirectedPseudoGraph < Digraph
- def initialize(*params)
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? GRATR::Graph or p.kind_of? Array)
- end
- super(:parallel_edges, *params)
- end
- end
-
- # This is a Digraph that allows for parallel edges and loops
- class DirectedMultiGraph < Digraph
- def initialize(*params)
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? GRATR::Graph or p.kind_of? Array)
- end
- super(:parallel_edges, :loops, *params)
- end
- end
-
-end
diff --git a/lib/puppet/external/gratr/digraph_distance.rb b/lib/puppet/external/gratr/digraph_distance.rb
deleted file mode 100644
index 6f90384..0000000
--- a/lib/puppet/external/gratr/digraph_distance.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
- module Graph
- module Distance
-
- # Shortest path from Jorgen Band-Jensen and Gregory Gutin,
- # _DIGRAPHS:_Theory,_Algorithms_and_Applications, pg 53-54
- #
- # Requires that the graph be acyclic. If the graph is not
- # acyclic, then see dijkstras_algorithm or bellman_ford_moore
- # for possible solutions.
- #
- # start is the starting vertex
- # weight can be a Proc, or anything else is accessed using the [] for the
- # the label or it defaults to using
- # the value stored in the label for the Edge. If it is a Proc it will
- # pass the edge to the proc and use the resulting value.
- # zero is used for math system with a different definition of zero
- #
- # Returns a hash with the key being a vertex and the value being the
- # distance. A missing vertex from the hash is an infinite distance
- #
- # Complexity O(n+m)
- def shortest_path(start, weight=nil, zero=0)
- dist = {start => zero}; path = {}
- topsort(start) do |vi|
- next if vi == start
- dist[vi],path[vi] = adjacent(vi, :direction => :in).map do |vj|
- [dist[vj] + cost(vj,vi,weight), vj]
- end.min {|a,b| a[0] <=> b[0]}
- end;
- dist.keys.size == vertices.size ? [dist,path] : nil
- end # shortest_path
-
- # Algorithm from Jorgen Band-Jensen and Gregory Gutin,
- # _DIGRAPHS:_Theory,_Algorithms_and_Applications, pg 53-54
- #
- # Finds the distances from a given vertex s in a weighted digraph
- # to the rest of the vertices, provided all the weights of arcs
- # are non-negative. If negative arcs exist in the graph, two
- # basic options exist, 1) modify all weights to be positive by
- # using an offset, or 2) use the bellman_ford_moore algorithm.
- # Also if the graph is acyclic, use the shortest_path algorithm.
- #
- # weight can be a Proc, or anything else is accessed using the [] for the
- # the label or it defaults to using
- # the value stored in the label for the Edge. If it is a Proc it will
- # pass the edge to the proc and use the resulting value.
- #
- # zero is used for math system with a different definition of zero
- #
- # Returns a hash with the key being a vertex and the value being the
- # distance. A missing vertex from the hash is an infinite distance
- #
- # O(n*log(n) + m) complexity
- def dijkstras_algorithm(s, weight = nil, zero = 0)
- q = vertices; distance = { s => zero }; path = {}
- while not q.empty?
- v = (q & distance.keys).inject(nil) {|a,k| (!a.nil?) && (distance[a] < distance[k]) ? a : k}
- q.delete(v)
- (q & adjacent(v)).each do |u|
- c = cost(v,u,weight)
- if distance[u].nil? or distance[u] > (c+distance[v])
- distance[u] = c + distance[v]
- path[u] = v
- end
- end
- end; [distance, path]
- end # dijkstras_algorithm
-
- # Algorithm from Jorgen Band-Jensen and Gregory Gutin,
- # _DIGRAPHS:_Theory,_Algorithms_and_Applications, pg 56-58
- #
- # Finds the distances from a given vertex s in a weighted digraph
- # to the rest of the vertices, provided the graph has no negative cycle.
- # If no negative weights exist, then dijkstras_algorithm is more
- # efficient in time and space. Also if the graph is acyclic, use the
- # shortest_path algorithm.
- #
- # weight can be a Proc, or anything else is accessed using the [] for the
- # the label or it defaults to using
- # the value stored in the label for the Edge. If it is a Proc it will
- # pass the edge to the proc and use the resulting value.
- #
- # zero is used for math system with a different definition of zero
- #
- # Returns a hash with the key being a vertex and the value being the
- # distance. A missing vertex from the hash is an infinite distance
- #
- # O(nm) complexity
- def bellman_ford_moore(start, weight = nil, zero = 0)
- distance = { start => zero }; path = {}
- 2.upto(vertices.size) do
- edges.each do |e|
- u,v = e[0],e[1]
- unless distance[u].nil?
- c = cost(u, v, weight)+distance[u]
- if distance[v].nil? or c < distance[v]
- distance[v] = c
- path[v] = u
- end
- end
- end
- end; [distance, path]
- end # bellman_ford_moore
-
- # This uses the Floyd-Warshall algorithm to efficiently find
- # and record shortest paths at the same time as establishing
- # the costs for all vertices in a graph.
- # See, S.Skiena, "The Algorithm Design Manual",
- # Springer Verlag, 1998 for more details.
- #
- # Returns a pair of matrices and a hash of delta values.
- # The matrices will be indexed by two vertices and are
- # implemented as a Hash of Hashes. The first matrix is the cost, the second
- # matrix is the shortest path spanning tree. The delta (difference of number
- # of in edges and out edges) is indexed by vertex.
- #
- # weight specifies how an edge weight is determined, if it's a
- # Proc the Edge is passed to it, if it's nil it will just use
- # the value in the label for the Edge, otherwise the weight is
- # determined by applying the [] operator to the value in the
- # label for the Edge
- #
- # zero defines the zero value in the math system used. Defaults
- # of course, to 0. This allows for no assumptions to be made
- # about the math system and fully functional duck typing.
- #
- # O(n^3) complexity in time.
- def floyd_warshall(weight=nil, zero=0)
- c = Hash.new {|h,k| h[k] = Hash.new}
- path = Hash.new {|h,k| h[k] = Hash.new}
- delta = Hash.new {|h,k| h[k] = 0}
- edges.each do |e|
- delta[e.source] += 1
- delta[e.target] -= 1
- path[e.source][e.target] = e.target
- c[e.source][e.target] = cost(e, weight)
- end
- vertices.each do |k|
- vertices.each do |i|
- if c[i][k]
- vertices.each do |j|
- if c[k][j] &&
- (c[i][j].nil? or c[i][j] > (c[i][k] + c[k][j]))
- path[i][j] = path[i][k]
- c[i][j] = c[i][k] + c[k][j]
- return nil if i == j and c[i][j] < zero
- end
- end
- end
- end
- end
- [c, path, delta]
- end # floyd_warshall
-
- end # Distance
- end # Graph
-end # GRATR
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/dot.rb b/lib/puppet/external/gratr/dot.rb
deleted file mode 100644
index 5b74776..0000000
--- a/lib/puppet/external/gratr/dot.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-#
-# Minimal Dot support, based on Dave Thomas's dot module (included in rdoc).
-# rdot.rb is a modified version which also contains support for undirected
-# graphs.
-
-require 'puppet/external/gratr/rdot'
-
-module GRATR
- module Graph
-
- # Return a DOT::DOTDigraph for directed graphs or a DOT::DOTSubgraph for an
- # undirected Graph. _params_ can contain any graph property specified in
- # rdot.rb. If an edge or vertex label is a kind of Hash then the keys
- # which match +dot+ properties will be used as well.
- def to_dot_graph (params = {})
- params['name'] ||= self.class.name.gsub(/:/,'_')
- fontsize = params['fontsize'] ? params['fontsize'] : '8'
- graph = (directed? ? DOT::DOTDigraph : DOT::DOTSubgraph).new(params)
- edge_klass = directed? ? DOT::DOTDirectedEdge : DOT::DOTEdge
- vertices.each do |v|
- name = v.to_s
- params = {'name' => '"'+name+'"',
- 'fontsize' => fontsize,
- 'label' => name}
- v_label = vertex_label(v)
- params.merge!(v_label) if v_label and v_label.kind_of? Hash
- graph << DOT::DOTNode.new(params)
- end
- edges.each do |e|
- params = {'from' => '"'+ e.source.to_s + '"',
- 'to' => '"'+ e.target.to_s + '"',
- 'fontsize' => fontsize }
- e_label = edge_label(e)
- params.merge!(e_label) if e_label and e_label.kind_of? Hash
- graph << edge_klass.new(params)
- end
- graph
- end
-
- # Output the dot format as a string
- def to_dot (params={}) to_dot_graph(params).to_s; end
-
- # Call +dotty+ for the graph which is written to the file 'graph.dot'
- # in the # current directory.
- def dotty (params = {}, dotfile = 'graph.dot')
- File.open(dotfile, 'w') {|f| f << to_dot(params) }
- system('dotty', dotfile)
- end
-
- # Use +dot+ to create a graphical representation of the graph. Returns the
- # filename of the graphics file.
- def write_to_graphic_file (fmt='png', dotfile='graph')
- src = dotfile + '.dot'
- dot = dotfile + '.' + fmt
-
- File.open(src, 'w') {|f| f << self.to_dot << "\n"}
-
- system( "dot -T#{fmt} #{src} -o #{dot}" )
- dot
- end
-
- end # module Graph
-end # module GRATR
diff --git a/lib/puppet/external/gratr/edge.rb b/lib/puppet/external/gratr/edge.rb
deleted file mode 100644
index 8470e54..0000000
--- a/lib/puppet/external/gratr/edge.rb
+++ /dev/null
@@ -1,145 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-module GRATR
-
- # Edge includes classes for representing egdes of directed and
- # undirected graphs. There is no need for a Vertex class, because any ruby
- # object can be a vertex of a graph.
- #
- # Edge's base is a Struct with a :source, a :target and a :label
- Struct.new("EdgeBase",:source, :target, :label)
-
- class Edge < Struct::EdgeBase
-
- def initialize(p_source,p_target,p_label=nil)
- super(p_source, p_target, p_label)
- end
-
- # Ignore labels for equality
- def eql?(other) self.class == other.class and target==other.target and source==other.source; end
-
- # Alias for eql?
- alias == eql?
-
- # Returns (v,u) if self == (u,v).
- def reverse() self.class.new(target, source, label); end
-
- # Sort support
- def <=>(rhs) [source,target] <=> [rhs.source,rhs.target]; end
-
- # Edge.new[1,2].to_s => "(1-2 'label')"
- def to_s
- l = label ? " '#{label.to_s}'" : ''
- "(#{source}-#{target}#{l})"
- end
-
- # Hash is defined in such a way that label is not
- # part of the hash value
- def hash() source.hash ^ (target.hash+1); end
-
- # Shortcut constructor. Instead of Edge.new(1,2) one can use Edge[1,2]
- def self.[](p_source, p_target, p_label=nil)
- new(p_source, p_target, p_label)
- end
-
- def inspect() "#{self.class.to_s}[#{source.inspect},#{target.inspect},#{label.inspect}]"; end
-
- end
-
- # An undirected edge is simply an undirected pair (source, target) used in
- # undirected graphs. UndirectedEdge[u,v] == UndirectedEdge[v,u]
- class UndirectedEdge < Edge
-
- # Equality allows for the swapping of source and target
- def eql?(other) super or (self.class == other.class and target==other.source and source==other.target); end
-
- # Alias for eql?
- alias == eql?
-
- # Hash is defined such that source and target can be reversed and the
- # hash value will be the same
- #
- # This will cause problems with self loops
- def hash() source.hash ^ target.hash; end
-
- # Sort support
- def <=>(rhs)
- [[source,target].max,[source,target].min] <=>
- [[rhs.source,rhs.target].max,[rhs.source,rhs.target].min]
- end
-
- # UndirectedEdge[1,2].to_s == "(1=2 'label)"
- def to_s
- l = label ? " '#{label.to_s}'" : ''
- s = source.to_s
- t = target.to_s
- "(#{[s,t].min}=#{[s,t].max}#{l})"
- end
-
- end
-
- # This module provides for internal numbering of edges for differentiating between mutliple edges
- module EdgeNumber
-
- attr_accessor :number # Used to differentiate between mutli-edges
-
- def initialize(p_source,p_target,p_number,p_label=nil)
- self.number = p_number
- super(p_source, p_target, p_label)
- end
-
- # Returns (v,u) if self == (u,v).
- def reverse() self.class.new(target, source, number, label); end
- def hash() super ^ number.hash; end
- def to_s() super + "[#{number}]"; end
- def <=>(rhs) (result = super(rhs)) == 0 ? number <=> rhs.number : result; end
- def inspect() "#{self.class.to_s}[#{source.inspect},#{target.inspect},#{number.inspect},#{label.inspect}]"; end
- def eql?(rhs) super(rhs) and (rhs.number.nil? or number.nil? or number == rhs.number); end
- def ==(rhs) eql?(rhs); end
-
- # Shortcut constructor. Instead of Edge.new(1,2) one can use Edge[1,2]
- def self.included(cl)
-
- def cl.[](p_source, p_target, p_number=nil, p_label=nil)
- new(p_source, p_target, p_number, p_label)
- end
- end
-
- end
-
- class MultiEdge < Edge
- include EdgeNumber
- end
-
- class MultiUndirectedEdge < UndirectedEdge
- include EdgeNumber
- end
-
-end
diff --git a/lib/puppet/external/gratr/graph.rb b/lib/puppet/external/gratr/graph.rb
deleted file mode 100644
index 7b73afc..0000000
--- a/lib/puppet/external/gratr/graph.rb
+++ /dev/null
@@ -1,303 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/labels'
-require 'puppet/external/gratr/graph_api'
-
-module GRATR
-
- # Using the functions required by the GraphAPI, it implements all the
- # basic functions of a Graph class by using only functions in GraphAPI.
- # An actual implementation still needs to be done, as in Digraph or
- # UndirectedGraph.
- module Graph
- include Enumerable
- include Labels
- include GraphAPI
-
- # Non destructive version of add_vertex!, returns modified copy of Graph
- def add_vertex(v, l=nil) x=self.class.new(self); x.add_vertex!(v,l); end
-
- # Non destructive version add_edge!, returns modified copy of Graph
- def add_edge(u, v=nil, l=nil) x=self.class.new(self); x.add_edge!(u,v,l); end
-
- # Non destructive version of remove_vertex!, returns modified copy of Graph
- def remove_vertex(v) x=self.class.new(self); x.remove_vertex!(v); end
-
- # Non destructive version of remove_edge!, returns modified copy of Graph
- def remove_edge(u,v=nil) x=self.class.new(self); x.remove_edge!(u,v); end
-
- # Return Array of adjacent portions of the Graph
- # x can either be a vertex an edge.
- # options specifies parameters about the adjacency search
- # :type can be either :edges or :vertices (default).
- # :direction can be :in, :out(default) or :all.
- #
- # Note: It is probably more efficently done in implementation.
- def adjacent(x, options={})
- d = directed? ? (options[:direction] || :out) : :all
-
- # Discharge the easy ones first
- return [x.source] if x.kind_of? Edge and options[:type] == :vertices and d == :in
- return [x.target] if x.kind_of? Edge and options[:type] == :vertices and d == :out
- return [x.source, x.target] if x.kind_of? Edge and options[:type] != :edges and d == :all
-
- (options[:type] == :edges ? edges : to_a).select {|u| adjacent?(x,u,d)}
- end
-
- # Add all objects in _a_ to the vertex set.
- def add_vertices!(*a) a.each {|v| add_vertex! v}; self; end
-
- # See add_vertices!
-
- def add_vertices(*a) x=self.class.new(self); x.add_vertices(*a); self; end
-
- # Add all edges in the _edges_ Enumerable to the edge set. Elements of the
- # Enumerable can be both two-element arrays or instances of DirectedEdge or
- # UnDirectedEdge.
- def add_edges!(*args) args.each { |edge| add_edge!(edge) }; self; end
-
- # See add_edge!
- def add_edges(*a) x=self.class.new(self); x.add_edges!(*a); self; end
-
- # Remove all vertices specified by the Enumerable a from the graph by
- # calling remove_vertex!.
- def remove_vertices!(*a) a.each { |v| remove_vertex! v }; end
-
- # See remove_vertices!
- def remove_vertices(*a) x=self.class.new(self); x.remove_vertices(*a); end
-
- # Remove all vertices edges by the Enumerable a from the graph by
- # calling remove_edge!
- def remove_edges!(*a) a.each { |e| remove_edges! e }; end
-
- # See remove_edges
- def remove_edges(*a) x=self.class.new(self); x.remove_edges(*a); end
-
- # Execute given block for each vertex, provides for methods in Enumerable
- def each(&block) vertices.each(&block); end
-
- # Returns true if _v_ is a vertex of the graph.
- # This is a default implementation that is of O(n) average complexity.
- # If a subclass uses a hash to store vertices, then this can be
- # made into an O(1) average complexity operation.
- def vertex?(v) vertices.include?(v); end
-
- # Returns true if u or (u,v) is an Edge of the graph.
- def edge?(*arg) edges.include?(edge_convert(*args)); end
-
- # Tests two objects to see if they are adjacent.
- # direction parameter specifies direction of adjacency, :in, :out, or :all(default)
- # All denotes that if there is any adjacency, then it will return true.
- # Note that the default is different than adjacent where one is primarily concerned with finding
- # all adjacent objects in a graph to a given object. Here the concern is primarily on seeing
- # if two objects touch. For vertexes, any edge between the two will usually do, but the direction
- # can be specified if need be.
- def adjacent?(source, target, direction=:all)
- if source.kind_of? GRATR::Edge
- raise NoEdgeError unless edge? source
- if target.kind_of? GRATR::Edge
- raise NoEdgeError unless edge? target
- (direction != :out and source.source == target.target) or (direction != :in and source.target == target.source)
- else
- raise NoVertexError unless vertex? target
- (direction != :out and source.source == target) or (direction != :in and source.target == target)
- end
- else
- raise NoVertexError unless vertex? source
- if target.kind_of? GRATR::Edge
- raise NoEdgeError unless edge? target
- (direction != :out and source == target.target) or (direction != :in and source == target.source)
- else
- raise NoVertexError unless vertex? target
- (direction != :out and edge?(target,source)) or (direction != :in and edge?(source,target))
- end
- end
- end
-
- # Returns true if the graph has no vertex, i.e. num_vertices == 0.
- def empty?() vertices.size.zero?; end
-
- # Returns true if the given object is a vertex or Edge in the Graph.
- #
- def include?(x) x.kind_of?(GRATR::Edge) ? edge?(x) : vertex?(x); end
-
- # Returns the neighboorhood of the given vertex (or Edge)
- # This is equivalent to adjacent, but bases type on the type of object.
- # direction can be :all, :in, or :out
- def neighborhood(x, direction = :all)
- adjacent(x, :direction => direction, :type => ((x.kind_of? GRATR::Edge) ? :edges : :vertices ))
- end
-
- # Union of all neighborhoods of vertices (or edges) in the Enumerable x minus the contents of x
- # Definition taken from Jorgen Bang-Jensen, Gregory Gutin, _Digraphs: Theory, Algorithms and Applications_, pg 4
- def set_neighborhood(x, direction = :all)
- x.inject(Set.new) {|a,v| a.merge(neighborhood(v,direction))}.reject {|v2| x.include?(v2)}
- end
-
- # Union of all set_neighborhoods reachable in p edges
- # Definition taken from Jorgen Bang-Jensen, Gregory Gutin, _Digraphs: Theory, Algorithms and Applications_, pg 46
- def closed_pth_neighborhood(w,p,direction=:all)
- if p <= 0
- w
- elsif p == 1
- (w + set_neighborhood(w,direction)).uniq
- else
- n = set_neighborhood(w, direction)
- (w + n + closed_pth_neighborhood(n,p-1,direction)).uniq
- end
- end
-
- # Returns the neighboorhoods reachable in p steps from every vertex (or edge)
- # in the Enumerable x
- # Definition taken from Jorgen Bang-Jensen, Gregory Gutin, _Digraphs: Theory, Algorithms and Applications_, pg 46
- def open_pth_neighborhood(x, p, direction=:all)
- if p <= 0
- x
- elsif p == 1
- set_neighborhood(x,direction)
- else
- set_neighborhood(open_pth_neighborhood(x, p-1, direction),direction) - closed_pth_neighborhood(x,p-1,direction)
- end
- end
-
- # Returns the number of out-edges (for directed graphs) or the number of
- # incident edges (for undirected graphs) of vertex _v_.
- def out_degree(v) adjacent(v, :direction => :out).size; end
-
- # Returns the number of in-edges (for directed graphs) or the number of
- # incident edges (for undirected graphs) of vertex _v_.
- def in_degree(v) adjacent(v, :direction => :in ).size; end
-
- # Returns the sum of the number in and out edges for a vertex
- def degree(v) in_degree(v) + out_degree(v); end
-
- # Minimum in-degree
- def min_in_degree() to_a.map {|v| in_degree(v)}.min; end
-
- # Minimum out-degree
- def min_out_degree() to_a.map {|v| out_degree(v)}.min; end
-
- # Minimum degree of all vertexes
- def min_degree() [min_in_degree, min_out_degree].min; end
-
- # Maximum in-degree
- def max_in_degree() vertices.map {|v| in_degree(v)}.max; end
-
- # Maximum out-degree
- def max_out_degree() vertices.map {|v| out_degree(v)}.max; end
-
- # Minimum degree of all vertexes
- def max_degree() [max_in_degree, max_out_degree].max; end
-
- # Regular
- def regular?() min_degree == max_degree; end
-
- # Returns the number of vertices.
- def size() vertices.size; end
-
- # Synonym for size.
- def num_vertices() vertices.size; end
-
- # Returns the number of edges.
- def num_edges() edges.size; end
-
- # Utility method to show a string representation of the edges of the graph.
- def to_s() edges.to_s; end
-
- # Equality is defined to be same set of edges and directed?
- def eql?(g)
- return false unless g.kind_of? GRATR::Graph
-
- (g.directed? == self.directed?) and
- (vertices.sort == g.vertices.sort) and
- (g.edges.sort == edges.sort)
- end
-
- # Synonym for eql?
- def ==(rhs) eql?(rhs); end
-
- # Merge another graph into this one
- def merge(other)
- other.vertices.each {|v| add_vertex!(v) }
- other.edges.each {|e| add_edge!(e) }
- other.edges.each {|e| add_edge!(e.reverse) } if directed? and !other.directed?
- self
- end
-
- # A synonym for merge, that doesn't modify the current graph
- def +(other)
- result = self.class.new(self)
- case other
- when GRATR::Graph : result.merge(other)
- when GRATR::Edge : result.add_edge!(other)
- else result.add_vertex!(other)
- end
- end
-
- # Remove all vertices in the specified right hand side graph
- def -(other)
- case other
- when GRATR::Graph : induced_subgraph(vertices - other.vertices)
- when GRATR::Edge : self.class.new(self).remove_edge!(other)
- else self.class.new(self).remove_vertex!(other)
- end
- end
-
- # A synonym for add_edge!
- def <<(edge) add_edge!(edge); end
-
- # Return the complement of the current graph
- def complement
- vertices.inject(self.class.new) do |a,v|
- a.add_vertex!(v)
- vertices.each {|v2| a.add_edge!(v,v2) unless edge?(v,v2) }; a
- end
- end
-
- # Given an array of vertices return the induced subgraph
- def induced_subgraph(v)
- edges.inject(self.class.new) do |a,e|
- ( v.include?(e.source) and v.include?(e.target) ) ? (a << e) : a
- end;
- end
-
- def inspect
- l = vertices.select {|v| self[v]}.map {|u| "vertex_label_set(#{u.inspect},#{self[u].inspect})"}.join('.')
- self.class.to_s + '[' + edges.map {|e| e.inspect}.join(', ') + ']' + (l ? '.'+l : '')
- end
-
- private
- def edge_convert(*args) args[0].kind_of?(GRATR::Edge) ? args[0] : edge_class[*args]; end
-
-
- end # Graph
-
-end # GRATR
diff --git a/lib/puppet/external/gratr/graph_api.rb b/lib/puppet/external/gratr/graph_api.rb
deleted file mode 100644
index 26d1895..0000000
--- a/lib/puppet/external/gratr/graph_api.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-module GRATR
-
- # This defines the minimum set of functions required to make a graph class that can
- # use the algorithms defined by this library
- module GraphAPI
-
- # Is the graph directed?
- #
- # This method must be implemented by the specific graph class
- def directed?() raise NotImplementedError; end
-
- # Add a vertex to the Graph and return the Graph
- # An additional label l can be specified as well
- #
- # This method must be implemented by the specific graph class
- def add_vertex!(v,l=nil) raise NotImplementedError; end
-
- # Add an edge to the Graph and return the Graph
- # u can be an object of type GRATR::Edge or u,v specifies
- # a source, target pair. The last parameter is an optional label
- #
- # This method must be implemented by the specific graph class
- def add_edge!(u,v=nil,l=nil) raise NotImplementedError; end
-
- # Remove a vertex to the Graph and return the Graph
- #
- # This method must be implemented by the specific graph class
- def remove_vertex!(v) raise NotImplementedError; end
-
- # Remove an edge from the Graph and return the Graph
- #
- # Can be a type of GRATR::Edge or a source and target
- # This method must be implemented by the specific graph class
- def remove_edge!(u,v=nil) raise NotImplementedError; end
-
- # Return the array of vertices.
- #
- # This method must be implemented by the specific graph class
- def vertices() raise NotImplementedError; end
-
- # Return the array of edges.
- #
- # This method must be implemented by the specific graph class
- def edges() raise NotImplementedError; end
-
- # Returns the edge class
- def edge_class() raise NotImplementedError; end
-
- # Return the chromatic number for this graph
- # This is currently incomplete and in some cases will be NP-complete
- # FIXME: Should this even be here? My gut feeling is no...
- def chromatic_number() raise NotImplementedError; end
- end
-end
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/import.rb b/lib/puppet/external/gratr/import.rb
deleted file mode 100644
index d3678d8..0000000
--- a/lib/puppet/external/gratr/import.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr'
-
-# Pull all GRATR classes up into the current namespace
-Edge = GRATR::Edge
-UndirectedEdge = GRATR::UndirectedEdge
-MultiEdge = GRATR::MultiEdge
-MultiUndirectedEdge = GRATR::MultiUndirectedEdge
-Graph = GRATR::Graph
-Digraph = GRATR::Digraph
-DirectedGraph = GRATR::DirectedGraph
-DirectedPseudoGraph = GRATR::DirectedPseudoGraph
-DirectedMultiGraph = GRATR::DirectedMultiGraph
-UndirectedGraph = GRATR::UndirectedGraph
-UndirectedPseudoGraph = GRATR::UndirectedPseudoGraph
-UndirectedMultiGraph = GRATR::UndirectedMultiGraph
-Complete = GRATR::Complete
diff --git a/lib/puppet/external/gratr/labels.rb b/lib/puppet/external/gratr/labels.rb
deleted file mode 100644
index 7e53df4..0000000
--- a/lib/puppet/external/gratr/labels.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
- module Labels
- # Return a label for an edge or vertex
- def [](u) (u.kind_of? GRATR::Edge) ? edge_label(u) : vertex_label(u); end
-
- # Set a label for an edge or vertex
- def []= (u, value) (u.kind_of? GRATR::Edge) ? edge_label_set(u,value) : vertex_label_set(u, value); end
-
- # Delete a label entirely
- def delete_label(u) (u.kind_of? GRATR::Edge) ? edge_label_delete(u) : vertex_label_delete(u); end
-
- # Get the label for an edge
- def vertex_label(v) vertex_label_dict[v]; end
-
- # Set the label for an edge
- def vertex_label_set(v, l) vertex_label_dict[v] = l; self; end
-
- # Get the label for an edge
- def edge_label(u,v=nil,n=nil)
- u = edge_convert(u,v,n)
- edge_label_dict[u]
- end
-
- # Set the label for an edge
- def edge_label_set(u, v=nil, l=nil, n=nil)
- u.kind_of?(GRATR::Edge) ? l = v : u = edge_convert(u,v,n)
- edge_label_dict[u] = l; self
- end
-
- # Delete all graph labels
- def clear_all_labels() @vertex_labels = {}; @edge_labels = {}; end
-
- # Delete an edge label
- def edge_label_delete(u, v=nil, n=nil)
- u = edge_convert(u,v,n)
- edge_label_dict.delete(u)
- end
-
- # Delete a vertex label
- def vertex_label_delete(v) vertex_label_dict.delete(v); end
-
- protected
-
- def vertex_label_dict() @vertex_labels ||= {}; end
- def edge_label_dict() @edge_labels ||= {}; end
-
- # A generic cost function. It either calls the weight function with and edge
- # constructed from the two nodes, or calls the [] operator of the label
- # when given a value. If no weight value is specified, the label itself is
- # treated as the cost value.
- #
- # Note: This function will not work for Pseudo or Multi graphs at present.
- def cost(u,v=nil,weight=nil)
- u.kind_of?(Edge) ? weight = v : u = edge_class[u,v]
- case weight
- when Proc : weight.call(u)
- when nil : self[u]
- else self[u][weight]
- end
- end
-
- end
-end
diff --git a/lib/puppet/external/gratr/maximum_flow.rb b/lib/puppet/external/gratr/maximum_flow.rb
deleted file mode 100644
index 7b3ef9b..0000000
--- a/lib/puppet/external/gratr/maximum_flow.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
-
- module Graph
-
- module MaximumFlow
-
- # Maximum flow, it returns an array with the maximum flow and a hash of flow per edge
- # Currently a highly inefficient implementation, FIXME, This should use Goldberg and Tarjan's method.
- def maximum_flow(s, t, capacity = nil, zero = 0)
- flow = Hash.new(zero)
- available = Hash.new(zero)
- total = zero
- edges.each {|e| available[e] = cost(e,capacity)}
- adj_positive = Proc.new do |u|
- adjacent(u).select {|r| available[edge_class[u,r]] > zero}
- end
- while (tree = bfs_tree_from_vertex(start))[t]
- route = [t]
- while route[-1] != s
- route << tree[route[route[-1]]]
- raise ArgumentError, "No route from #{s} to #{t} possible"
- end; route.reverse
- amt = route.map {|e| available[e]}.min
- route.each do |e|
- flow[e] += amt
- available[e] -= amt
- end
- total += amt
- end
-
- [total, flow]
- end
-
- end # MaximumFlow
- end # Graph
-end # GRATR
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/search.rb b/lib/puppet/external/gratr/search.rb
deleted file mode 100644
index 3206ec5..0000000
--- a/lib/puppet/external/gratr/search.rb
+++ /dev/null
@@ -1,409 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-module GRATR
- module Graph
- module Search
-
- # Options are mostly callbacks passed in as a hash.
- # The following are valid, anything else is ignored
- # :enter_vertex => Proc Called upon entry of a vertex
- # :exit_vertex => Proc Called upon exit of a vertex
- # :root_vertex => Proc Called when a vertex the a root of a tree
- # :start_vertex => Proc Called for the first vertex of the search
- # :examine_edge => Proc Called when an edge is examined
- # :tree_edge => Proc Called when the edge is a member of the tree
- # :back_edge => Proc Called when the edge is a back edge
- # :forward_edge => Proc Called when the edge is a forward edge
- # :adjacent => Proc that given a vertex returns adjacent nodes, defaults to adjacent call of graph useful for changing the definition of adjacent in some algorithms
- #
- # :start => Vertex Specifies the vertex to start search from
- #
- # If a &block is specified it defaults to :enter_vertex
- #
- # Returns the list of vertexes as reached by enter_vertex
- # This allows for calls like, g.bfs.each {|v| ...}
- #
- # Can also be called like bfs_examine_edge {|e| ... } or
- # dfs_back_edge {|e| ... } for any of the callbacks
- #
- # A full example usage is as follows:
- #
- # ev = Proc.new {|x| puts "Enter Vertex #{x}"}
- # xv = Proc.new {|x| puts "Exit Vertex #{x}"}
- # sv = Proc.new {|x| puts "Start Vertex #{x}"}
- # ee = Proc.new {|x| puts "Examine Edge #{x}"}
- # te = Proc.new {|x| puts "Tree Edge #{x}"}
- # be = Proc.new {|x| puts "Back Edge #{x}"}
- # fe = Proc.new {|x| puts "Forward Edge #{x}"}
- # Digraph[1,2,2,3,3,4].dfs({
- # :enter_vertex => ev,
- # :exit_vertex => xv,
- # :start_vertex => sv,
- # :examine_edge => ee,
- # :tree_edge => te,
- # :back_edge => be,
- # :forward_edge => fe })
- #
- # Which outputs:
- #
- # Start Vertex 1
- # Enter Vertex 1
- # Examine Edge (1=2)
- # Tree Edge (1=2)
- # Enter Vertex 2
- # Examine Edge (2=3)
- # Tree Edge (2=3)
- # Enter Vertex 3
- # Examine Edge (3=4)
- # Tree Edge (3=4)
- # Enter Vertex 4
- # Examine Edge (1=4)
- # Back Edge (1=4)
- # Exit Vertex 4
- # Exit Vertex 3
- # Exit Vertex 2
- # Exit Vertex 1
- def bfs(options={}, &block) gratr_search_helper(:shift, options, &block); end
-
- # See options for bfs method
- def dfs(options={}, &block) gratr_search_helper(:pop, options, &block); end
-
- # Routine to compute a spanning forest for the given search method
- # Returns two values, first is a hash of predecessors and second an array of root nodes
- def spanning_forest(start, routine)
- predecessor = {}
- roots = []
- te = Proc.new {|e| predecessor[e.target] = e.source}
- rv = Proc.new {|v| roots << v}
- method(routine).call :start => start, :tree_edge => te, :root_vertex => rv
- [predecessor, roots]
- end
-
- # Return the dfs spanning forest for the given start node, see spanning_forest
- def dfs_spanning_forest(start) spanning_forest(start, :dfs); end
-
- # Return the bfs spanning forest for the given start node, see spanning_forest
- def bfs_spanning_forest(start) spanning_forest(start, :bfs); end
-
- # Returns a hash of predecessors in a tree rooted at the start node. If this is a connected graph
- # then it will be a spanning tree and contain all vertices. An easier way to tell if it's a spanning tree is to
- # use a spanning_forest call and check if there is a single root node.
- def tree_from_vertex(start, routine)
- predecessor={}
- correct_tree = false
- te = Proc.new {|e| predecessor[e.target] = e.source if correct_tree}
- rv = Proc.new {|v| correct_tree = (v == start)}
- method(routine).call :start => start, :tree_edge => te, :root_vertex => rv
- predecessor
- end
-
- # Returns a hash of predecessors for the depth first search tree rooted at the given node
- def dfs_tree_from_vertex(start) tree_from_vertex(start, :dfs); end
-
- # Returns a hash of predecessors for the depth first search tree rooted at the given node
- def bfs_tree_from_vertex(start) tree_from_vertex(start, :bfs); end
-
- # An inner class used for greater efficiency in lexicograph_bfs
- #
- # Original desgn taken from Golumbic's, "Algorithmic Graph Theory and
- # Perfect Graphs" pg, 87-89
- class LexicographicQueue
-
- # Called with the initial values (array)
- def initialize(values)
- @node = Struct.new(:back, :forward, :data)
- @node.class_eval { def hash() @hash; end; @@cnt=0 }
- @set = {}
- @tail = @node.new(nil, nil, Array.new(values))
- @tail.instance_eval { @hash = (@@cnt+=1) }
- values.each {|a| @set[a] = @tail}
- end
-
- # Pop an entry with maximum lexical value from queue
- def pop()
- return nil unless @tail
- value = @tail[:data].pop
- @tail = @tail[:forward] while @tail and @tail[:data].size == 0
- @set.delete(value); value
- end
-
- # Increase lexical value of given values (array)
- def add_lexeme(values)
- fix = {}
- values.select {|v| @set[v]}.each do |w|
- sw = @set[w]
- if fix[sw]
- s_prime = sw[:back]
- else
- s_prime = @node.new(sw[:back], sw, [])
- s_prime.instance_eval { @hash = (@@cnt+=1) }
- @tail = s_prime if @tail == sw
- sw[:back][:forward] = s_prime if sw[:back]
- sw[:back] = s_prime
- fix[sw] = true
- end
- s_prime[:data] << w
- sw[:data].delete(w)
- @set[w] = s_prime
- end
- fix.keys.select {|n| n[:data].size == 0}.each do |e|
- e[:forward][:back] = e[:back] if e[:forward]
- e[:back][:forward] = e[:forward] if e[:back]
- end
- end
-
- end
-
- # Lexicographic breadth-first search, the usual queue of vertices
- # is replaced by a queue of unordered subsets of the vertices,
- # which is sometimes refined but never reordered.
- #
- # Originally developed by Rose, Tarjan, and Leuker, "Algorithmic
- # aspects of vertex elimination on graphs", SIAM J. Comput. 5, 266-283
- # MR53 #12077
- #
- # Implementation taken from Golumbic's, "Algorithmic Graph Theory and
- # Perfect Graphs" pg, 84-90
- def lexicograph_bfs(&block)
- lex_q = GRATR::Graph::Search::LexicographicQueue.new(vertices)
- result = []
- num_vertices.times do
- v = lex_q.pop
- result.unshift(v)
- lex_q.add_lexeme(adjacent(v))
- end
- result.each {|r| block.call(r)} if block
- result
- end
-
-
- # A* Heuristic best first search
- #
- # start is the starting vertex for the search
- #
- # func is a Proc that when passed a vertex returns the heuristic
- # weight of sending the path through that node. It must always
- # be equal to or less than the true cost
- #
- # options are mostly callbacks passed in as a hash, the default block is
- # :discover_vertex and weight is assumed to be the label for the Edge.
- # The following options are valid, anything else is ignored.
- #
- # * :weight => can be a Proc, or anything else is accessed using the [] for the
- # the label or it defaults to using
- # the value stored in the label for the Edge. If it is a Proc it will
- # pass the edge to the proc and use the resulting value.
- # * :discover_vertex => Proc invoked when a vertex is first discovered
- # and is added to the open list.
- # * :examine_vertex => Proc invoked when a vertex is popped from the
- # queue (i.e., it has the lowest cost on the open list).
- # * :examine_edge => Proc invoked on each out-edge of a vertex
- # immediately after it is examined.
- # * :edge_relaxed => Proc invoked on edge (u,v) if d[u] + w(u,v) < d[v].
- # * :edge_not_relaxed=> Proc invoked if the edge is not relaxed (see above).
- # * :black_target => Proc invoked when a vertex that is on the closed
- # list is "rediscovered" via a more efficient path, and is re-added
- # to the OPEN list.
- # * :finish_vertex => Proc invoked on a vertex when it is added to the
- # closed list, which happens after all of its out edges have been
- # examined.
- #
- # Returns array of nodes in path, or calls block on all nodes,
- # upon failure returns nil
- #
- # Can also be called like astar_examine_edge {|e| ... } or
- # astar_edge_relaxed {|e| ... } for any of the callbacks
- #
- # The criteria for expanding a vertex on the open list is that it has the
- # lowest f(v) = g(v) + h(v) value of all vertices on open.
- #
- # The time complexity of A* depends on the heuristic. It is exponential
- # in the worst case, but is polynomial when the heuristic function h
- # meets the following condition: |h(x) - h*(x)| < O(log h*(x)) where h*
- # is the optimal heuristic, i.e. the exact cost to get from x to the goal.
- #
- # Also see: http://en.wikipedia.org/wiki/A-star_search_algorithm
- #
- def astar(start, goal, func, options, &block)
- options.instance_eval "def handle_vertex(sym,u) self[sym].call(u) if self[sym]; end"
- options.instance_eval "def handle_edge(sym,u,v) self[sym].call(#{edge_class}[u,v]) if self[sym]; end"
-
- d = { start => 0 }
- f = { start => func.call(start) }
- color = {start => :gray}
- p = Hash.new {|k| p[k] = k}
- queue = [start]
- block.call(start) if block
- until queue.empty?
- u = queue.pop
- options.handle_vertex(:examine_vertex, u)
- adjacent(u).each do |v|
- e = edge_class[u,v]
- options.handle_edge(:examine_edge, u, v)
- w = cost(e, options[:weight])
- raise ArgumentError unless w
- if d[v].nil? or (w + d[u]) < d[v]
- options.handle_edge(:edge_relaxed, u, v)
- d[v] = w + d[u]
- f[v] = d[v] + func.call(u)
- p[v] = u
- unless color[v] == :gray
- options.handle_vertex(:black_target, v) if color[v] == :black
- color[v] = :gray
- options.handle_vertex(:discover_vertex, v)
- queue << v
- block.call(v) if block
- return [start]+queue if v == goal
- end
- else
- options.handle_edge(:edge_not_relaxed, u, v)
- end
- end # adjacent(u)
- color[u] = :black
- options.handle_vertex(:finish_vertex,u)
- end # queue.empty?
- nil # failure, on fall through
- end # astar
-
- # Best first has all the same options as astar with func set to h(v) = 0.
- # There is an additional option zero which should be defined to zero
- # for the operation '+' on the objects used in the computation of cost.
- # The parameter zero defaults to 0.
- def best_first(start, goal, options, zero=0, &block)
- func = Proc.new {|v| zero}
- astar(start, goal, func, options, &block)
- end
-
- alias_method :pre_search_method_missing, :method_missing # :nodoc:
- def method_missing(sym,*args, &block) # :nodoc:
- m1=/^dfs_(\w+)$/.match(sym.to_s)
- dfs((args[0] || {}).merge({m1.captures[0].to_sym => block})) if m1
- m2=/^bfs_(\w+)$/.match(sym.to_s)
- bfs((args[0] || {}).merge({m2.captures[0].to_sym => block})) if m2
- pre_search_method_missing(sym, *args, &block) unless m1 or m2
- end
-
- private
-
- def gratr_search_helper(op, options={}, &block) # :nodoc:
- return nil if size == 0
- result = []
- # Create options hash that handles callbacks
- options = {:enter_vertex => block, :start => to_a[0]}.merge(options)
- options.instance_eval "def handle_vertex(sym,u) self[sym].call(u) if self[sym]; end"
- options.instance_eval "def handle_edge(sym,e) self[sym].call(e) if self[sym]; end"
- # Create waiting list that is a queue or stack depending on op specified.
- # First entry is the start vertex.
- waiting = [options[:start]]
- waiting.instance_eval "def next() #{op.to_s}; end"
- # Create color map with all set to unvisited except for start vertex
- # will be set to waiting
- color_map = vertices.inject({}) {|a,v| a[v] = :unvisited; a}
- color_map.merge!(waiting[0] => :waiting)
- options.handle_vertex(:start_vertex, waiting[0])
- options.handle_vertex(:root_vertex, waiting[0])
- # Perform the actual search until nothing is waiting
- until waiting.empty?
- # Loop till the search iterator exhausts the waiting list
- visited_edges={} # This prevents retraversing edges in undirected graphs
- until waiting.empty?
- gratr_search_iteration(options, waiting, color_map, visited_edges, result, op == :pop)
- end
- # Waiting list is exhausted, see if a new root vertex is available
- u=color_map.detect {|key,value| value == :unvisited}
- waiting.push(u[0]) if u
- options.handle_vertex(:root_vertex, u[0]) if u
- end; result
- end
-
- def gratr_search_iteration(options, waiting, color_map, visited_edges, result, recursive=false) # :nodoc:
- # Get the next waiting vertex in the list
- u = waiting.next
- options.handle_vertex(:enter_vertex,u)
- result << u
- # Examine all adjacent outgoing edges, not previously traversed
- adj_proc = options[:adjacent] || self.method(:adjacent).to_proc
- adj_proc.call(u,:type => :edges, :direction => :out).reject {|w| visited_edges[w]}.each do |e|
- e = e.reverse unless directed? or e.source == u # Preserves directionality where required
- v = e.target
- options.handle_edge(:examine_edge, e)
- visited_edges[e]=true
- case color_map[v]
- # If it's unvisited it goes into the waiting list
- when :unvisited
- options.handle_edge(:tree_edge, e)
- color_map[v] = :waiting
- waiting.push(v)
- # If it's recursive (i.e. dfs) then call self
- gratr_search_iteration(options, waiting, color_map, visited_edges, result, true) if recursive
- when :waiting
- options.handle_edge(:back_edge, e)
- else
- options.handle_edge(:forward_edge, e)
- end
- end
- # Finished with this vertex
- options.handle_vertex(:exit_vertex, u)
- color_map[u] = :visited
- end
-
- public
- # Topological Sort Iterator
- #
- # The topological sort algorithm creates a linear ordering of the vertices
- # such that if edge (u,v) appears in the graph, then u comes before v in
- # the ordering. The graph must be a directed acyclic graph (DAG).
- #
- # The iterator can also be applied to undirected graph or to a DG graph
- # which contains a cycle. In this case, the Iterator does not reach all
- # vertices. The implementation of acyclic? and cyclic? uses this fact.
- #
- # Can be called with a block as a standard Ruby iterator, or it can
- # be used directly as it will return the result as an Array
- def topsort(start = nil, &block)
- result = []
- go = true
- back = Proc.new {|e| go = false }
- push = Proc.new {|v| result.unshift(v) if go}
- start ||= vertices[0]
- dfs({:exit_vertex => push, :back_edge => back, :start => start})
- result.each {|v| block.call(v)} if block; result
- end
-
- # Returns true if a graph contains no cycles, false otherwise
- def acyclic?() topsort.size == size; end
-
- # Returns false if a graph contains no cycles, true otherwise
- def cyclic?() not acyclic?; end
-
-
- end # Search
- end # Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/strong_components.rb b/lib/puppet/external/gratr/strong_components.rb
deleted file mode 100644
index 796ae16..0000000
--- a/lib/puppet/external/gratr/strong_components.rb
+++ /dev/null
@@ -1,127 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'set'
-
-module GRATR
- module Graph
- module StrongComponents
- # strong_components computes the strongly connected components
- # of a graph using Tarjan's algorithm based on DFS. See: Robert E. Tarjan
- # _Depth_First_Search_and_Linear_Graph_Algorithms_. SIAM Journal on
- # Computing, 1(2):146-160, 1972
- #
- # The output of the algorithm is an array of components where is
- # component is an array of vertices
- #
- # A strongly connected component of a directed graph G=(V,E) is a maximal
- # set of vertices U which is in V such that for every pair of
- # vertices u and v in U, we have both a path from u to v
- # and path from v to u. That is to say that u and v are reachable
- # from each other.
- #
- def strong_components
-
- dfs_num = 0
- stack = []; result = []; root = {}; comp = {}; number = {}
-
- # Enter vertex callback
- enter = Proc.new do |v|
- root[v] = v
- comp[v] = :new
- number[v] = (dfs_num += 1)
- stack.push(v)
- end
-
- # Exit vertex callback
- exit = Proc.new do |v|
- adjacent(v).each do |w|
- if comp[w] == :new
- root[v] = (number[root[v]] < number[root[w]] ? root[v] : root[w])
- end
- end
- if root[v] == v
- component = []
- begin
- w = stack.pop
- comp[w] = :assigned
- component << w
- end until w == v
- result << component
- end
- end
-
- # Execute depth first search
- dfs({:enter_vertex => enter, :exit_vertex => exit}); result
-
- end # strong_components
-
- # Returns a condensation graph of the strongly connected components
- # Each node is an array of nodes from the original graph
- def condensation
- sc = strong_components
- cg = self.class.new
- map = sc.inject({}) do |a,c|
- c.each {|v| a[v] = c }; a
- end
- sc.each do |c|
- c.each do |v|
- adjacent(v).each {|v| cg.add_edge!(c, map[v]) unless c == map[v]}
- end
- end; cg
- end
-
- # Compute transitive closure of a graph. That is any node that is reachable
- # along a path is added as a directed edge.
- def transitive_closure!
- cgtc = condensation.gratr_inner_transitive_closure!
- cgtc.each do |cgv|
- cgtc.adjacent(cgv).each do |adj|
- cgv.each do |u|
- adj.each {|v| add_edge!(u,v)}
- end
- end
- end; self
- end
-
- # This returns the transitive closure of a graph. The original graph
- # is not changed.
- def transitive_closure() self.class.new(self).transitive_closure!; end
-
- private
- def gratr_inner_transitive_closure! # :nodoc:
- topsort.reverse.each do |u|
- adjacent(u).each do |v|
- adjacent(v).each {|w| add_edge!(u,w) unless edge?(u,w)}
- end
- end; self
- end
- end # StrongComponens
-
- end # Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/undirected_graph.rb b/lib/puppet/external/gratr/undirected_graph.rb
deleted file mode 100644
index 86963d2..0000000
--- a/lib/puppet/external/gratr/undirected_graph.rb
+++ /dev/null
@@ -1,153 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-#
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice(s),
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
-# * Neither the name of the Shawn Garbett nor the names of its contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/adjacency_graph'
-require 'puppet/external/gratr/search'
-require 'puppet/external/gratr/biconnected'
-require 'puppet/external/gratr/comparability'
-require 'set'
-
-module GRATR
- class UndirectedGraph
- include AdjacencyGraph
- include Graph::Search
- include Graph::Biconnected
- include Graph::Comparability
-
- def initialize(*params)
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? GRATR::Graph or p.kind_of? Array)
- end if self.class == GRATR::UndirectedGraph
- super(*params)
- end
-
- # UndirectedGraph is by definition undirected, always returns false
- def directed?() false; end
-
- # Redefine degree (default was sum)
- def degree(v) in_degree(v); end
-
- # A vertex of an undirected graph is balanced by definition
- def balanced?(v) true; end
-
- # UndirectedGraph uses UndirectedEdge for the edge class.
- def edge_class() @parallel_edges ? GRATR::MultiUndirectedEdge : GRATR::UndirectedEdge; end
-
- def remove_edge!(u, v=nil)
- unless u.kind_of? GRATR::Edge
- raise ArgumentError if @parallel_edges
- u = edge_class[u,v]
- end
- super(u.reverse) unless u.source == u.target
- super(u)
- end
-
- # A triangulated graph is an undirected perfect graph that every cycle of length greater than
- # three possesses a chord. They have also been called chordal, rigid circuit, monotone transitive,
- # and perfect elimination graphs.
- #
- # Implementation taken from Golumbic's, "Algorithmic Graph Theory and
- # Perfect Graphs" pg. 90
- def triangulated?
- a = Hash.new {|h,k| h[k]=Set.new}; sigma=lexicograph_bfs
- inv_sigma = sigma.inject({}) {|acc,val| acc[val] = sigma.index(val); acc}
- sigma[0..-2].each do |v|
- x = adjacent(v).select {|w| inv_sigma[v] < inv_sigma[w] }
- unless x.empty?
- u = sigma[x.map {|y| inv_sigma[y]}.min]
- a[u].merge(x - [u])
- end
- return false unless a[v].all? {|z| adjacent?(v,z)}
- end
- true
- end
-
- def chromatic_number
- return triangulated_chromatic_number if triangulated?
- raise NotImplementedError
- end
-
- # An interval graph can have its vertices into one-to-one
- # correspondence with a set of intervals F of a linearly ordered
- # set (like the real line) such that two vertices are connected
- # by an edge of G if and only if their corresponding intervals
- # have nonempty intersection.
- def interval?() triangulated? and complement.comparability?; end
-
- # A permutation diagram consists of n points on each of two parallel
- # lines and n straight line segments matchin the points. The intersection
- # graph of the line segments is called a permutation graph.
- def permutation?() comparability? and complement.comparability?; end
-
- # An undirected graph is defined to be split if there is a partition
- # V = S + K of its vertex set into a stable set S and a complete set K.
- def split?() triangulated? and complement.triangulated?; end
-
- private
- # Implementation taken from Golumbic's, "Algorithmic Graph Theory and
- # Perfect Graphs" pg. 99
- def triangulated_chromatic_number
- chi = 1; s= Hash.new {|h,k| h[k]=0}
- sigma=lexicograph_bfs
- inv_sigma = sigma.inject({}) {|acc,val| acc[val] = sigma.index(val); acc}
- sigma.each do |v|
- x = adjacent(v).select {|w| inv_sigma[v] < inv_sigma[w] }
- unless x.empty?
- u = sigma[x.map {|y| inv_sigma[y]}.min]
- s[u] = [s[u], x.size-1].max
- chi = [chi, x.size+1].max if s[v] < x.size
- end
- end; chi
- end
-
- end # UndirectedGraph
-
- # This is a UndirectedGraph that allows for parallel edges, but does not
- # allow loops
- class UndirectedPseudoGraph < UndirectedGraph
- def initialize(*params)
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? Graph or p.kind_of? Array)
- end
- super(:parallel_edges, *params)
- end
- end
-
- # This is a UndirectedGraph that allows for parallel edges and loops
- class UndirectedMultiGraph < UndirectedGraph
- def initialize(*params)
- raise ArgumentError if params.any? do |p|
- !(p.kind_of? Graph or p.kind_of? Array)
- end
- super(:parallel_edges, :loops, *params)
- end
- end
-
-
-end # GRATR
diff --git a/lib/puppet/external/nagios.rb b/lib/puppet/external/nagios.rb
new file mode 100755
index 0000000..78459fc
--- /dev/null
+++ b/lib/puppet/external/nagios.rb
@@ -0,0 +1,50 @@
+#!/usr/local/bin/ruby -w
+
+#--------------------
+# A script to retrieve hosts from ldap and create an importable
+# cfservd file from them
+#
+# $Id: nagios.rb,v 1.3 2004/06/09 20:32:46 luke Exp $
+
+require 'digest/md5'
+#require 'ldap'
+require 'puppet/external/nagios/parser.rb'
+require 'puppet/external/nagios/base.rb'
+
+module Nagios
+ NAGIOSVERSION = '1.1'
+ # yay colors
+ PINK = "[0;31m"
+ GREEN = "[0;32m"
+ YELLOW = "[0;33m"
+ SLATE = "[0;34m"
+ ORANGE = "[0;35m"
+ BLUE = "[0;36m"
+ NOCOLOR = "[0m"
+ RESET = "[0m"
+
+ def self.version
+ NAGIOSVERSION
+ end
+
+ class Config
+ def Config.import(config)
+
+ text = String.new
+
+ File.open(config) { |file|
+ file.each { |line|
+ text += line
+ }
+ }
+ parser = Nagios::Parser.new
+ return parser.parse(text)
+ end
+
+ def Config.each
+ Nagios::Object.objects.each { |object|
+ yield object
+ }
+ end
+ end
+end
diff --git a/lib/puppet/external/nagios/base.rb b/lib/puppet/external/nagios/base.rb
new file mode 100755
index 0000000..efc3982
--- /dev/null
+++ b/lib/puppet/external/nagios/base.rb
@@ -0,0 +1,421 @@
+# The base class for all of our Nagios object types. Everything else
+# is mostly just data.
+class Nagios::Base
+
+ class UnknownNagiosType < RuntimeError # When an unknown type is asked for by name.
+ end
+
+ include Enumerable
+
+ class << self
+ attr_accessor :parameters, :derivatives, :ocs, :name, :att
+ attr_accessor :ldapbase
+
+ attr_writer :namevar
+
+ attr_reader :superior
+ end
+
+ # Attach one class to another.
+ def self.attach(hash)
+ @attach ||= {}
+ hash.each do |n, v| @attach[n] = v end
+ end
+
+ # Convert a parameter to camelcase
+ def self.camelcase(param)
+ param.gsub(/_./) do |match|
+ match.sub(/_/,'').capitalize
+ end
+ end
+
+ # Uncamelcase a parameter.
+ def self.decamelcase(param)
+ param.gsub(/[A-Z]/) do |match|
+ "_" + match.downcase
+ end
+ end
+
+ # Create a new instance of a given class.
+ def self.create(name, args = {})
+ name = name.intern if name.is_a? String
+
+ if @types.include?(name)
+ @types[name].new(args)
+ else
+ raise UnknownNagiosType, "Unknown type %s" % name
+ end
+ end
+
+ # Yield each type in turn.
+ def self.eachtype
+ @types.each do |name, type|
+ yield [name, type]
+ end
+ end
+
+ # Create a mapping.
+ def self.map(hash)
+ @map ||= {}
+ hash.each do |n, v| @map[n] = v end
+ end
+
+ # Return a mapping (or nil) for a param
+ def self.mapping(name)
+ name = name.intern if name.is_a? String
+ if defined? @map
+ @map[name]
+ else
+ nil
+ end
+ end
+
+ # Return the namevar for the canonical name.
+ def self.namevar
+ if defined? @namevar
+ return @namevar
+ else
+ if parameter?(:name)
+ return :name
+ elsif tmp = (self.name.to_s + "_name").intern and parameter?(tmp)
+ @namevar = tmp
+ return @namevar
+ else
+ raise "Type %s has no name var" % self.name
+ end
+ end
+ end
+
+ # Create a new type.
+ def self.newtype(name, &block)
+ name = name.intern if name.is_a? String
+
+ @types ||= {}
+
+ # Create the class, with the correct name.
+ t = Class.new(self)
+ t.name = name
+
+ # Everyone gets this. There should probably be a better way, and I
+ # should probably hack the attribute system to look things up based on
+ # this "use" setting, but, eh.
+ t.parameters = [:use]
+
+ const_set(name.to_s.capitalize,t)
+
+ # Evaluate the passed block. This should usually define all of the work.
+ t.class_eval(&block)
+
+ @types[name] = t
+ end
+
+ # Define both the normal case and camelcase method for a parameter
+ def self.paramattr(name)
+ camel = camelcase(name)
+ param = name
+
+ [name, camel].each do |method|
+ define_method(method) do
+ @parameters[param]
+ end
+
+ define_method(method.to_s + "=") do |value|
+ @parameters[param] = value
+ end
+ end
+
+ end
+
+ # Is the specified name a valid parameter?
+ def self.parameter?(name)
+ name = name.intern if name.is_a? String
+ return @parameters.include?(name)
+ end
+
+ # Manually set the namevar
+ def self.setnamevar(name)
+ name = name.intern if name.is_a? String
+ @namevar = name
+ end
+
+ # Set the valid parameters for this class
+ def self.setparameters(*array)
+ @parameters += array
+ end
+
+ # Set the superior ldap object class. Seems silly to include this
+ # in this class, but, eh.
+ def self.setsuperior(name)
+ @superior = name
+ end
+
+ # Parameters to suppress in output.
+ def self.suppress(name)
+ @suppress ||= []
+ @suppress << name
+ end
+
+ # Whether a given parameter is suppressed.
+ def self.suppress?(name)
+ defined? @suppress and @suppress.include?(name)
+ end
+
+ # Return our name as the string.
+ def self.to_s
+ self.name.to_s
+ end
+
+ # Return a type by name.
+ def self.type(name)
+ name = name.intern if name.is_a? String
+
+ @types[name]
+ end
+
+ # Convenience methods.
+ def [](param)
+ send(param)
+ end
+
+ # Convenience methods.
+ def []=(param,value)
+ send(param.to_s + "=", value)
+ end
+
+ # Iterate across all ofour set parameters.
+ def each
+ @parameters.each { |param,value|
+ yield(param,value)
+ }
+ end
+
+ # Initialize our object, optionally with a list of parameters.
+ def initialize(args = {})
+ @parameters = {}
+
+ args.each { |param,value|
+ self[param] = value
+ }
+ end
+
+ # Handle parameters like attributes.
+ def method_missing(mname, *args)
+ pname = mname.to_s
+ pname.sub!(/=/, '')
+
+ if self.class.parameter?(pname)
+ if pname =~ /A-Z/
+ pname = self.class.decamelcase(pname)
+ end
+ self.class.paramattr(pname)
+
+ # Now access the parameters directly, to make it at least less
+ # likely we'll end up in an infinite recursion.
+ if mname.to_s =~ /=$/
+ @parameters[pname] = *args
+ else
+ return @parameters[mname]
+ end
+ else
+ super
+ end
+ end
+
+ # Retrieve our name, through a bit of redirection.
+ def name
+ send(self.class.namevar)
+ end
+
+ # This is probably a bad idea.
+ def name=(value)
+ send(self.class.namevar.to_s + "=", value)
+ end
+
+ def namevar
+ return (self.type + "_name").intern
+ end
+
+ def parammap(param)
+ unless defined? @map
+ map = {
+ self.namevar => "cn"
+ }
+ if self.class.map
+ map.update(self.class.map)
+ end
+ end
+ if map.include?(param)
+ return map[param]
+ else
+ return "nagios-" + param.id2name.gsub(/_/,'-')
+ end
+ end
+
+ def parent
+ unless defined? self.class.attached
+ puts "Duh, you called parent on an unattached class"
+ return
+ end
+
+ klass,param = self.class.attached
+ unless @parameters.include?(param)
+ puts "Huh, no attachment param"
+ return
+ end
+ klass[@parameters[param]]
+ end
+
+ # okay, this sucks
+ # how do i get my list of ocs?
+ def to_ldif
+ base = self.class.ldapbase
+ str = self.dn + "\n"
+ ocs = Array.new
+ if self.class.ocs
+ # i'm storing an array, so i have to flatten it and stuff
+ kocs = self.class.ocs
+ ocs.push(*kocs)
+ end
+ ocs.push "top"
+ oc = self.class.to_s
+ oc.sub!(/Nagios/,'nagios')
+ oc.sub!(/::/,'')
+ ocs.push oc
+ ocs.each { |oc|
+ str += "objectclass: " + oc + "\n"
+ }
+ @parameters.each { |name,value|
+ if self.class.suppress.include?(name)
+ next
+ end
+ ldapname = self.parammap(name)
+ str += ldapname + ": " + value + "\n"
+ }
+ str += "\n"
+ str
+ end
+
+ def to_s
+ str = "define #{self.type} {\n"
+
+ self.each { |param,value|
+ str += %{\t%-30s %s\n} % [ param,
+ if value.is_a? Array
+ value.join(",")
+ else
+ value
+ end
+ ]
+ }
+
+ str += "}\n"
+
+ str
+ end
+
+ # The type of object we are.
+ def type
+ self.class.name
+ end
+
+ # object types
+ newtype :command do
+ setparameters :command_name, :command_line
+ end
+
+ newtype :contact do
+ setparameters :contact_name, :alias, :host_notification_period,
+ :host_notification_commands, :service_notification_period,
+ :service_notification_commands,
+ :email, :pager, :service_notification_options, :host_notification_options
+
+ setsuperior "person"
+ end
+
+ newtype :contactgroup do
+ setparameters :contactgroup_name, :alias, :members
+ end
+
+ newtype :host do
+ setparameters :host_name, :notifications_enabled, :event_handler_enabled,
+ :flap_detection_enabled, :process_perf_data, :retain_status_information,
+ :retain_nonstatus_information, :register, :use, :alias,
+ :address, :check_command, :max_check_attempts, :notification_interval,
+ :notification_period, :notification_options, :checks_enabled,
+ :failure_prediction_enabled, :parents
+
+ setsuperior "person"
+
+ map :address => "ipHostNumber"
+ end
+
+ newtype :hostextinfo do
+ auxiliary = true
+
+ setparameters :host_name, :notes_url, :icon_image, :icon_image_alt, :vrml_image,
+ "2d_coords".intern, "3d_coords".intern
+
+ setnamevar :host_name
+ end
+
+ newtype :hostgroup do
+ setparameters :hostgroup_name, :alias, :contact_groups, :members
+ end
+
+ newtype :hostgroupescalation do
+ auxiliary = true
+ setparameters :hostgroup_name, :first_notification, :last_notification,
+ :contact_groups, :notification_interval
+
+ setnamevar :hostgroup_name
+ end
+
+ newtype :service do
+ attach :host => :host_name
+ setparameters :name, :active_checks_enabled, :passive_checks_enabled,
+ :parallelize_check, :obsess_over_service, :check_freshness,
+ :notifications_enabled, :event_handler_enabled,
+ :flap_detection_enabled, :process_perf_data,
+ :retain_status_information, :retain_nonstatus_information, :register,
+ :is_volatile, :check_period, :max_check_attempts,
+ :normal_check_interval, :retry_check_interval, :contact_groups,
+ :notification_interval, :notification_period, :notification_options,
+ :service_description, :host_name, :freshness_threshold,
+ :check_command
+
+ suppress :host_name
+
+ setnamevar :service_description
+ end
+
+ newtype :servicedependency do
+ auxiliary = true
+ setparameters :host_name, :service_description, :dependent_host_name,
+ :dependent_service_description, :execution_failure_criteria,
+ :notification_failure_criteria
+
+ setnamevar :host_name
+ end
+
+ newtype :serviceescalation do
+ setparameters :host_name, :service_description, :first_notification,
+ :last_notification, :contact_groups, :notification_interval
+
+ setnamevar :host_name
+ end
+
+ newtype :serviceextinfo do
+ auxiliary = true
+
+ setparameters :host_name, :service_description, :icon_image, :icon_image_alt
+
+ setnamevar :host_name
+ end
+
+ newtype :timeperiod do
+ setparameters :timeperiod_name, :alias, :sunday, :monday, :tuesday, :wednesday,
+ :thursday, :friday, :saturday
+ end
+end
+
+# $Id$
diff --git a/lib/puppet/external/nagios/grammar.ry b/lib/puppet/external/nagios/grammar.ry
new file mode 100644
index 0000000..f50818f
--- /dev/null
+++ b/lib/puppet/external/nagios/grammar.ry
@@ -0,0 +1,188 @@
+# vim: syntax=ruby
+class Nagios::Parser
+
+token DEFINE NAME STRING PARAM LCURLY RCURLY VALUE RETURN COMMENT INLINECOMMENT
+
+rule
+decls: decl { return val[0] if val[0] }
+ | decls decl {
+ if val[1].nil?
+ result = val[0]
+ else
+ if val[0].nil?
+ result = val[1]
+ else
+ result = [ val[0], val[1] ].flatten
+ end
+ end
+ }
+ ;
+
+decl: object { result = [val[0]] }
+ | RETURN { result = nil }
+ | comment
+ ;
+
+comment: COMMENT RETURN { result = nil }
+ ;
+
+object: DEFINE NAME LCURLY RETURN vars RCURLY {
+ result = Nagios::Base.create(val[1],val[4])
+ }
+ ;
+
+vars: var
+ | vars var {
+ val[1].each {|p,v|
+ val[0][p] = v
+ }
+ result = val[0]
+ }
+ ;
+
+var: PARAM VALUE icomment returns { result = {val[0],val[1]} }
+ ;
+
+returns: RETURN
+ | returns RETURN
+ ;
+
+icomment: # nothing
+ | INLINECOMMENT
+ ;
+
+end
+
+----inner
+
+def parse(src)
+ @src = src
+
+ # state variables
+ @invar = false
+ @inobject = false
+ @done = false
+
+ @line = 0
+ @yydebug = true
+
+ begin
+ do_parse
+ rescue SyntaxError
+ $stderr.print "#{$!}\n"
+ exit
+ end
+end
+
+# The lexer. Very simple.
+def token
+ @src.sub!(/\A\n/,'')
+ if $&
+ @line += 1
+ return [ :RETURN, "\n" ]
+ end
+
+ if @done
+ return nil
+ end
+ yytext = String.new
+
+
+ # remove comments from this line
+ @src.sub!(/\A[ \t]*;.*\n/,"\n")
+ if $&
+ return [:INLINECOMMENT, ""]
+ end
+
+ @src.sub!(/\A#.*\n/,"\n")
+ if $&
+ return [:COMMENT, ""]
+ end
+
+ @src.sub!(/#.*/,'')
+
+ if @src.length == 0
+ @done = true
+ return [false, '$']
+ end
+
+ if @invar
+ @src.sub!(/\A[ \t]+/,'')
+ @src.sub!(/\A([^;\n]+)(\n|;)/,'\2')
+ if $1
+ yytext += $1
+ end
+ @invar = false
+ return [:VALUE, yytext]
+ else
+ @src.sub!(/\A[\t ]*(\S+)([\t ]*|$)/,'')
+ if $1
+ yytext = $1
+ case yytext
+ when 'define'
+ #puts "got define"
+ return [:DEFINE, yytext]
+ when '{'
+ #puts "got {"
+ @inobject = true
+ return [:LCURLY, yytext]
+ else
+ unless @inobject
+ #puts "got type: #{yytext}"
+ if yytext =~ /\W/
+ giveback = yytext.dup
+ giveback.sub!(/^\w+/,'')
+ #puts "giveback " + giveback
+ #puts "yytext " + yytext
+ yytext.sub!(/\W.*$/,'')
+ #puts "yytext " + yytext
+ #puts "all [#{giveback} #{yytext} #{orig}]"
+ @src = giveback + @src
+ end
+ return [:NAME, yytext]
+ else
+ if yytext == '}'
+ #puts "got closure: #{yytext}"
+ @inobject = false
+ return [:RCURLY, '}']
+ end
+
+ unless @invar
+ @invar = true
+ return [:PARAM, $1]
+ else
+ end
+ end
+ end
+ end
+ end
+end
+
+def next_token
+ token
+end
+
+def yydebug
+ 1
+end
+
+def yywrap
+ 0
+end
+
+def on_error(token, value, vstack )
+ msg = ""
+ unless value.nil?
+ msg = "line #{@line}: syntax error at '#{value}'"
+ else
+ msg = "line #{@line}: syntax error at '#{token}'"
+ end
+ unless @src.size > 0
+ msg = "line #{@line}: Unexpected end of file"
+ end
+ if token == '$end'.intern
+ puts "okay, this is silly"
+ else
+ raise SyntaxError, msg
+ end
+end
diff --git a/lib/puppet/external/nagios/makefile b/lib/puppet/external/nagios/makefile
new file mode 100644
index 0000000..fc14564
--- /dev/null
+++ b/lib/puppet/external/nagios/makefile
@@ -0,0 +1,9 @@
+all: parser.rb
+
+debug: parser.rb setdebug
+
+parser.rb: grammar.ry
+ racc -E -oparser.rb grammar.ry
+
+setdebug:
+ perl -pi -e 's{\@yydebug =.*$$}{\@yydebug = true}' parser.rb
diff --git a/lib/puppet/external/nagios/parser.rb b/lib/puppet/external/nagios/parser.rb
new file mode 100644
index 0000000..b7e2c21
--- /dev/null
+++ b/lib/puppet/external/nagios/parser.rb
@@ -0,0 +1,816 @@
+#
+# DO NOT MODIFY!!!!
+# This file is automatically generated by racc 1.4.4
+# from racc grammer file "grammar.ry".
+#
+#
+# parser.rb: generated by racc (runtime embedded)
+#
+
+###### racc/parser.rb
+
+unless $".index 'racc/parser.rb'
+$".push 'racc/parser.rb'
+
+self.class.module_eval <<'..end /usr/lib/ruby/1.8/racc/parser.rb modeval..id1306b79176', '/usr/lib/ruby/1.8/racc/parser.rb', 1
+#
+# parser.rb
+#
+# Copyright (c) 1999-2003 Minero Aoki <aamine at loveruby.net>
+#
+# This program is free software.
+# You can distribute/modify this program under the same terms of ruby.
+#
+# As a special exception, when this code is copied by Racc
+# into a Racc output file, you may use that output file
+# without restriction.
+#
+# $raccId: parser.rb,v 1.4 2003/11/03 13:41:47 aamine Exp $
+#
+
+unless defined?(NotImplementedError)
+ NotImplementedError = NotImplementError
+end
+
+module Racc
+ class ParseError < StandardError; end
+end
+unless defined?(::ParseError)
+ ParseError = Racc::ParseError
+end
+
+
+module Racc
+
+ unless defined?(Racc_No_Extentions)
+ Racc_No_Extentions = false
+ end
+
+ class Parser
+
+ Racc_Runtime_Version = '1.4.4'
+ Racc_Runtime_Revision = '$raccRevision: 1.4 $'.split[1]
+
+ Racc_Runtime_Core_Version_R = '1.4.4'
+ Racc_Runtime_Core_Revision_R = '$raccRevision: 1.4 $'.split[1]
+ begin
+ require 'racc/cparse'
+ # Racc_Runtime_Core_Version_C = (defined in extension)
+ Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
+ unless new.respond_to?(:_racc_do_parse_c, true)
+ raise LoadError, 'old cparse.so'
+ end
+ if Racc_No_Extentions
+ raise LoadError, 'selecting ruby version of racc runtime core'
+ end
+
+ Racc_Main_Parsing_Routine = :_racc_do_parse_c
+ Racc_YY_Parse_Method = :_racc_yyparse_c
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_C
+ Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_C
+ Racc_Runtime_Type = 'c'
+ rescue LoadError
+ Racc_Main_Parsing_Routine = :_racc_do_parse_rb
+ Racc_YY_Parse_Method = :_racc_yyparse_rb
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R
+ Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_R
+ Racc_Runtime_Type = 'ruby'
+ end
+
+ def Parser.racc_runtime_type
+ Racc_Runtime_Type
+ end
+
+ private
+
+ def _racc_setup
+ @yydebug = false unless self.class::Racc_debug_parser
+ @yydebug = false unless defined?(@yydebug)
+ if @yydebug
+ @racc_debug_out = $stderr unless defined?(@racc_debug_out)
+ @racc_debug_out ||= $stderr
+ end
+ arg = self.class::Racc_arg
+ arg[13] = true if arg.size < 14
+ arg
+ end
+
+ def _racc_init_sysvars
+ @racc_state = [0]
+ @racc_tstack = []
+ @racc_vstack = []
+
+ @racc_t = nil
+ @racc_val = nil
+
+ @racc_read_next = true
+
+ @racc_user_yyerror = false
+ @racc_error_status = 0
+ end
+
+ ###
+ ### do_parse
+ ###
+
+ def do_parse
+ __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
+ end
+
+ def next_token
+ raise NotImplementedError, "#{self.class}\#next_token is not defined"
+ end
+
+ def _racc_do_parse_rb( arg, in_debug )
+ action_table, action_check, action_default, action_pointer,
+ goto_table, goto_check, goto_default, goto_pointer,
+ nt_base, reduce_table, token_table, shift_n,
+ reduce_n, use_result, * = arg
+
+ _racc_init_sysvars
+ tok = act = i = nil
+ nerr = 0
+
+ catch(:racc_end_parse) {
+ while true
+ if i = action_pointer[@racc_state[-1]]
+ if @racc_read_next
+ if @racc_t != 0 # not EOF
+ tok, @racc_val = next_token()
+ unless tok # EOF
+ @racc_t = 0
+ else
+ @racc_t = (token_table[tok] or 1) # error token
+ end
+ racc_read_token(@racc_t, tok, @racc_val) if @yydebug
+ @racc_read_next = false
+ end
+ end
+ i += @racc_t
+ unless i >= 0 and
+ act = action_table[i] and
+ action_check[i] == @racc_state[-1]
+ act = action_default[@racc_state[-1]]
+ end
+ else
+ act = action_default[@racc_state[-1]]
+ end
+ while act = _racc_evalact(act, arg)
+ ;
+ end
+ end
+ }
+ end
+
+ ###
+ ### yyparse
+ ###
+
+ def yyparse( recv, mid )
+ __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
+ end
+
+ def _racc_yyparse_rb( recv, mid, arg, c_debug )
+ action_table, action_check, action_default, action_pointer,
+ goto_table, goto_check, goto_default, goto_pointer,
+ nt_base, reduce_table, token_table, shift_n,
+ reduce_n, use_result, * = arg
+
+ _racc_init_sysvars
+ tok = nil
+ act = nil
+ i = nil
+ nerr = 0
+
+ catch(:racc_end_parse) {
+ until i = action_pointer[@racc_state[-1]]
+ while act = _racc_evalact(action_default[@racc_state[-1]], arg)
+ ;
+ end
+ end
+ recv.__send__(mid) do |tok, val|
+# $stderr.puts "rd: tok=#{tok}, val=#{val}"
+ unless tok
+ @racc_t = 0
+ else
+ @racc_t = (token_table[tok] or 1) # error token
+ end
+ @racc_val = val
+ @racc_read_next = false
+
+ i += @racc_t
+ unless i >= 0 and
+ act = action_table[i] and
+ action_check[i] == @racc_state[-1]
+ act = action_default[@racc_state[-1]]
+# $stderr.puts "02: act=#{act}"
+# $stderr.puts "curstate=#{@racc_state[-1]}"
+ else
+# $stderr.puts "01: act=#{act}"
+ end
+
+ while act = _racc_evalact(act, arg)
+ ;
+ end
+
+ while not (i = action_pointer[@racc_state[-1]]) or
+ not @racc_read_next or
+ @racc_t == 0 # $
+ unless i and i += @racc_t and
+ i >= 0 and
+ act = action_table[i] and
+ action_check[i] == @racc_state[-1]
+ act = action_default[@racc_state[-1]]
+# $stderr.puts "04: act=#{act}"
+ else
+# $stderr.puts "03: act=#{act}"
+ end
+ while act = _racc_evalact(act, arg)
+ ;
+ end
+ end
+ end
+ }
+ end
+
+ ###
+ ### common
+ ###
+
+ def _racc_evalact( act, arg )
+# $stderr.puts "ea: act=#{act}"
+ action_table, action_check, action_default, action_pointer,
+ goto_table, goto_check, goto_default, goto_pointer,
+ nt_base, reduce_table, token_table, shift_n,
+ reduce_n, use_result, * = arg
+nerr = 0 # tmp
+
+ if act > 0 and act < shift_n
+ #
+ # shift
+ #
+ if @racc_error_status > 0
+ @racc_error_status -= 1 unless @racc_t == 1 # error token
+ end
+ @racc_vstack.push @racc_val
+ @racc_state.push act
+ @racc_read_next = true
+ if @yydebug
+ @racc_tstack.push @racc_t
+ racc_shift @racc_t, @racc_tstack, @racc_vstack
+ end
+
+ elsif act < 0 and act > -reduce_n
+ #
+ # reduce
+ #
+ code = catch(:racc_jump) {
+ @racc_state.push _racc_do_reduce(arg, act)
+ false
+ }
+ if code
+ case code
+ when 1 # yyerror
+ @racc_user_yyerror = true # user_yyerror
+ return -reduce_n
+ when 2 # yyaccept
+ return shift_n
+ else
+ raise RuntimeError, '[Racc Bug] unknown jump code'
+ end
+ end
+
+ elsif act == shift_n
+ #
+ # accept
+ #
+ racc_accept if @yydebug
+ throw :racc_end_parse, @racc_vstack[0]
+
+ elsif act == -reduce_n
+ #
+ # error
+ #
+ case @racc_error_status
+ when 0
+ unless arg[21] # user_yyerror
+ nerr += 1
+ on_error @racc_t, @racc_val, @racc_vstack
+ end
+ when 3
+ if @racc_t == 0 # is $
+ throw :racc_end_parse, nil
+ end
+ @racc_read_next = true
+ end
+ @racc_user_yyerror = false
+ @racc_error_status = 3
+ while true
+ if i = action_pointer[@racc_state[-1]]
+ i += 1 # error token
+ if i >= 0 and
+ (act = action_table[i]) and
+ action_check[i] == @racc_state[-1]
+ break
+ end
+ end
+
+ throw :racc_end_parse, nil if @racc_state.size <= 1
+ @racc_state.pop
+ @racc_vstack.pop
+ if @yydebug
+ @racc_tstack.pop
+ racc_e_pop @racc_state, @racc_tstack, @racc_vstack
+ end
+ end
+ return act
+
+ else
+ raise RuntimeError, "[Racc Bug] unknown action #{act.inspect}"
+ end
+
+ racc_next_state(@racc_state[-1], @racc_state) if @yydebug
+
+ nil
+ end
+
+ def _racc_do_reduce( arg, act )
+ action_table, action_check, action_default, action_pointer,
+ goto_table, goto_check, goto_default, goto_pointer,
+ nt_base, reduce_table, token_table, shift_n,
+ reduce_n, use_result, * = arg
+ state = @racc_state
+ vstack = @racc_vstack
+ tstack = @racc_tstack
+
+ i = act * -3
+ len = reduce_table[i]
+ reduce_to = reduce_table[i+1]
+ method_id = reduce_table[i+2]
+ void_array = []
+
+ tmp_t = tstack[-len, len] if @yydebug
+ tmp_v = vstack[-len, len]
+ tstack[-len, len] = void_array if @yydebug
+ vstack[-len, len] = void_array
+ state[-len, len] = void_array
+
+ # tstack must be updated AFTER method call
+ if use_result
+ vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
+ else
+ vstack.push __send__(method_id, tmp_v, vstack)
+ end
+ tstack.push reduce_to
+
+ racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
+
+ k1 = reduce_to - nt_base
+ if i = goto_pointer[k1]
+ i += state[-1]
+ if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
+ return curstate
+ end
+ end
+ goto_default[k1]
+ end
+
+ def on_error( t, val, vstack )
+ raise ParseError, sprintf("\nparse error on value %s (%s)",
+ val.inspect, token_to_str(t) || '?')
+ end
+
+ def yyerror
+ throw :racc_jump, 1
+ end
+
+ def yyaccept
+ throw :racc_jump, 2
+ end
+
+ def yyerrok
+ @racc_error_status = 0
+ end
+
+ #
+ # for debugging output
+ #
+
+ def racc_read_token( t, tok, val )
+ @racc_debug_out.print 'read '
+ @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
+ @racc_debug_out.puts val.inspect
+ @racc_debug_out.puts
+ end
+
+ def racc_shift( tok, tstack, vstack )
+ @racc_debug_out.puts "shift #{racc_token2str tok}"
+ racc_print_stacks tstack, vstack
+ @racc_debug_out.puts
+ end
+
+ def racc_reduce( toks, sim, tstack, vstack )
+ out = @racc_debug_out
+ out.print 'reduce '
+ if toks.empty?
+ out.print ' <none>'
+ else
+ toks.each {|t| out.print ' ', racc_token2str(t) }
+ end
+ out.puts " --> #{racc_token2str(sim)}"
+
+ racc_print_stacks tstack, vstack
+ @racc_debug_out.puts
+ end
+
+ def racc_accept
+ @racc_debug_out.puts 'accept'
+ @racc_debug_out.puts
+ end
+
+ def racc_e_pop( state, tstack, vstack )
+ @racc_debug_out.puts 'error recovering mode: pop token'
+ racc_print_states state
+ racc_print_stacks tstack, vstack
+ @racc_debug_out.puts
+ end
+
+ def racc_next_state( curstate, state )
+ @racc_debug_out.puts "goto #{curstate}"
+ racc_print_states state
+ @racc_debug_out.puts
+ end
+
+ def racc_print_stacks( t, v )
+ out = @racc_debug_out
+ out.print ' ['
+ t.each_index do |i|
+ out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
+ end
+ out.puts ' ]'
+ end
+
+ def racc_print_states( s )
+ out = @racc_debug_out
+ out.print ' ['
+ s.each {|st| out.print ' ', st }
+ out.puts ' ]'
+ end
+
+ def racc_token2str( tok )
+ self.class::Racc_token_to_s_table[tok] or
+ raise RuntimeError, "[Racc Bug] can't convert token #{tok} to string"
+ end
+
+ def token_to_str( t )
+ self.class::Racc_token_to_s_table[t]
+ end
+
+ end
+
+end
+..end /usr/lib/ruby/1.8/racc/parser.rb modeval..id1306b79176
+end # end of racc/parser.rb
+
+
+module Nagios
+
+ class Parser < Racc::Parser
+
+module_eval <<'..end grammar.ry modeval..id458299781d', 'grammar.ry', 57
+
+def parse(src)
+ @src = src
+
+ # state variables
+ @invar = false
+ @inobject = false
+ @done = false
+
+ @line = 0
+ @yydebug = true
+
+ begin
+ do_parse
+ rescue SyntaxError
+ $stderr.print "#{$!}\n"
+ exit
+ end
+end
+
+# The lexer. Very simple.
+def token
+ @src.sub!(/\A\n/,'')
+ if $&
+ @line += 1
+ return [ :RETURN, "\n" ]
+ end
+
+ if @done
+ return nil
+ end
+ yytext = String.new
+
+
+ # remove comments from this line
+ @src.sub!(/\A[ \t]*;.*\n/,"\n")
+ if $&
+ return [:INLINECOMMENT, ""]
+ end
+
+ @src.sub!(/\A#.*\n/,"\n")
+ if $&
+ return [:COMMENT, ""]
+ end
+
+ @src.sub!(/#.*/,'')
+
+ if @src.length == 0
+ @done = true
+ return [false, '$']
+ end
+
+ if @invar
+ @src.sub!(/\A[ \t]+/,'')
+ @src.sub!(/\A([^;\n]+)(\n|;)/,'\2')
+ if $1
+ yytext += $1
+ end
+ @invar = false
+ return [:VALUE, yytext]
+ else
+ @src.sub!(/\A[\t ]*(\S+)([\t ]*|$)/,'')
+ if $1
+ yytext = $1
+ case yytext
+ when 'define'
+ #puts "got define"
+ return [:DEFINE, yytext]
+ when '{'
+ #puts "got {"
+ @inobject = true
+ return [:LCURLY, yytext]
+ else
+ unless @inobject
+ #puts "got type: #{yytext}"
+ if yytext =~ /\W/
+ giveback = yytext.dup
+ giveback.sub!(/^\w+/,'')
+ #puts "giveback " + giveback
+ #puts "yytext " + yytext
+ yytext.sub!(/\W.*$/,'')
+ #puts "yytext " + yytext
+ #puts "all [#{giveback} #{yytext} #{orig}]"
+ @src = giveback + @src
+ end
+ return [:NAME, yytext]
+ else
+ if yytext == '}'
+ #puts "got closure: #{yytext}"
+ @inobject = false
+ return [:RCURLY, '}']
+ end
+
+ unless @invar
+ @invar = true
+ return [:PARAM, $1]
+ else
+ end
+ end
+ end
+ end
+ end
+end
+
+def next_token
+ token
+end
+
+def yydebug
+ 1
+end
+
+def yywrap
+ 0
+end
+
+def on_error(token, value, vstack )
+ msg = ""
+ unless value.nil?
+ msg = "line #{@line}: syntax error at '#{value}'"
+ else
+ msg = "line #{@line}: syntax error at '#{token}'"
+ end
+ unless @src.size > 0
+ msg = "line #{@line}: Unexpected end of file"
+ end
+ if token == '$end'.intern
+ puts "okay, this is silly"
+ else
+ raise SyntaxError, msg
+ end
+end
+..end grammar.ry modeval..id458299781d
+
+##### racc 1.4.4 generates ###
+
+racc_reduce_table = [
+ 0, 0, :racc_error,
+ 1, 13, :_reduce_1,
+ 2, 13, :_reduce_2,
+ 1, 14, :_reduce_3,
+ 1, 14, :_reduce_4,
+ 1, 14, :_reduce_none,
+ 2, 16, :_reduce_6,
+ 6, 15, :_reduce_7,
+ 1, 17, :_reduce_none,
+ 2, 17, :_reduce_9,
+ 4, 18, :_reduce_10,
+ 1, 20, :_reduce_none,
+ 2, 20, :_reduce_none,
+ 0, 19, :_reduce_none,
+ 1, 19, :_reduce_none ]
+
+racc_reduce_n = 15
+
+racc_shift_n = 26
+
+racc_action_table = [
+ 9, 15, 1, 20, 1, 14, 12, 13, 11, 6,
+ 7, 6, 7, 15, 18, 8, 21, 23, 25 ]
+
+racc_action_check = [
+ 2, 16, 2, 16, 0, 12, 8, 9, 7, 2,
+ 2, 0, 0, 14, 15, 1, 18, 22, 24 ]
+
+racc_action_pointer = [
+ 2, 12, 0, nil, nil, nil, nil, -1, 0, 7,
+ nil, nil, -4, nil, 8, 6, -4, nil, 5, nil,
+ nil, nil, 8, nil, 9, nil ]
+
+racc_action_default = [
+ -15, -15, -15, -1, -3, -5, -4, -15, -15, -15,
+ -2, -6, -15, 26, -15, -15, -15, -8, -13, -9,
+ -7, -14, -15, -11, -10, -12 ]
+
+racc_goto_table = [
+ 17, 3, 19, 10, 2, 16, 22, 24 ]
+
+racc_goto_check = [
+ 6, 2, 6, 2, 1, 5, 7, 8 ]
+
+racc_goto_pointer = [
+ nil, 4, 1, nil, nil, -9, -14, -12, -15 ]
+
+racc_goto_default = [
+ nil, nil, nil, 4, 5, nil, nil, nil, nil ]
+
+racc_token_table = {
+ false => 0,
+ Object.new => 1,
+ :DEFINE => 2,
+ :NAME => 3,
+ :STRING => 4,
+ :PARAM => 5,
+ :LCURLY => 6,
+ :RCURLY => 7,
+ :VALUE => 8,
+ :RETURN => 9,
+ :COMMENT => 10,
+ :INLINECOMMENT => 11 }
+
+racc_use_result_var = true
+
+racc_nt_base = 12
+
+Racc_arg = [
+ racc_action_table,
+ racc_action_check,
+ racc_action_default,
+ racc_action_pointer,
+ racc_goto_table,
+ racc_goto_check,
+ racc_goto_default,
+ racc_goto_pointer,
+ racc_nt_base,
+ racc_reduce_table,
+ racc_token_table,
+ racc_shift_n,
+ racc_reduce_n,
+ racc_use_result_var ]
+
+Racc_token_to_s_table = [
+'$end',
+'error',
+'DEFINE',
+'NAME',
+'STRING',
+'PARAM',
+'LCURLY',
+'RCURLY',
+'VALUE',
+'RETURN',
+'COMMENT',
+'INLINECOMMENT',
+'$start',
+'decls',
+'decl',
+'object',
+'comment',
+'vars',
+'var',
+'icomment',
+'returns']
+
+Racc_debug_parser = false
+
+##### racc system variables end #####
+
+ # reduce 0 omitted
+
+module_eval <<'.,.,', 'grammar.ry', 6
+ def _reduce_1( val, _values, result )
+ return val[0] if val[0]
+ result
+ end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 18
+ def _reduce_2( val, _values, result )
+ if val[1].nil?
+ result = val[0]
+ else
+ if val[0].nil?
+ result = val[1]
+ else
+ result = [ val[0], val[1] ].flatten
+ end
+ end
+ result
+ end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 20
+ def _reduce_3( val, _values, result )
+ result = [val[0]]
+ result
+ end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 21
+ def _reduce_4( val, _values, result )
+ result = nil
+ result
+ end
+.,.,
+
+ # reduce 5 omitted
+
+module_eval <<'.,.,', 'grammar.ry', 25
+ def _reduce_6( val, _values, result )
+ result = nil
+ result
+ end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 31
+ def _reduce_7( val, _values, result )
+ result = Nagios::Base.create(val[1],val[4])
+ result
+ end
+.,.,
+
+ # reduce 8 omitted
+
+module_eval <<'.,.,', 'grammar.ry', 40
+ def _reduce_9( val, _values, result )
+ val[1].each {|p,v|
+ val[0][p] = v
+ }
+ result = val[0]
+ result
+ end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 42
+ def _reduce_10( val, _values, result )
+ result = {val[0],val[1]}
+ result
+ end
+.,.,
+
+ # reduce 11 omitted
+
+ # reduce 12 omitted
+
+ # reduce 13 omitted
+
+ # reduce 14 omitted
+
+ def _reduce_none( val, _values, result )
+ result
+ end
+
+ end # class Parser
+
+end # module Nagios
diff --git a/lib/puppet/file_serving/file_base.rb b/lib/puppet/file_serving/file_base.rb
index 7f169d1..e87d683 100644
--- a/lib/puppet/file_serving/file_base.rb
+++ b/lib/puppet/file_serving/file_base.rb
@@ -9,16 +9,28 @@ require 'puppet/file_serving'
class Puppet::FileServing::FileBase
attr_accessor :key
+ # Does our file exist?
+ def exist?
+ begin
+ stat
+ return true
+ rescue => detail
+ return false
+ end
+ end
+
# Return the full path to our file. Fails if there's no path set.
def full_path
raise(ArgumentError, "You must set a path to get a file's path") unless self.path
- relative_path ? File.join(path, relative_path) : path
+ if relative_path.nil? or relative_path == ""
+ path
+ else
+ File.join(path, relative_path)
+ end
end
def initialize(key, options = {})
- raise ArgumentError.new("Files must not be fully qualified") if path =~ /^#{::File::SEPARATOR}/
-
@key = key
@links = :manage
@@ -34,6 +46,7 @@ class Puppet::FileServing::FileBase
# Determine how we deal with links.
attr_reader :links
def links=(value)
+ value = :manage if value == :ignore
raise(ArgumentError, ":links can only be set to :manage or :follow") unless [:manage, :follow].include?(value)
@links = value
end
diff --git a/lib/puppet/file_serving/metadata.rb b/lib/puppet/file_serving/metadata.rb
index e26e758..5671212 100644
--- a/lib/puppet/file_serving/metadata.rb
+++ b/lib/puppet/file_serving/metadata.rb
@@ -28,6 +28,25 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination
+ PARAM_ORDER = [:mode, :ftype, :owner, :group]
+
+ def attributes_with_tabs
+ desc = []
+ PARAM_ORDER.each { |check|
+ check = :ftype if check == :type
+ desc << send(check)
+ }
+
+ case ftype
+ when "file", "directory": desc << checksum
+ when "link": desc << @destination
+ else
+ raise ArgumentError, "Cannot manage files of type %s" % ftype
+ end
+
+ return desc.join("\t")
+ end
+
def checksum_type=(type)
raise(ArgumentError, "Unsupported checksum type %s" % type) unless respond_to?("%s_file" % type)
@@ -45,13 +64,19 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
@ftype = stat.ftype
- # Set the octal mode, but as a string.
- @mode = "%o" % (stat.mode & 007777)
+ # We have to mask the mode, yay.
+ @mode = stat.mode & 007777
- if stat.ftype == "symlink"
+ case stat.ftype
+ when "file":
+ @checksum = ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, real_path)
+ when "directory": # Always just timestamp the directory.
+ sumtype = @checksum_type.to_s =~ /time/ ? @checksum_type : "ctime"
+ @checksum = ("{%s}" % sumtype) + send("%s_file" % sumtype, path).to_s
+ when "link":
@destination = File.readlink(real_path)
else
- @checksum = get_checksum(real_path)
+ raise ArgumentError, "Cannot manage files of type %s" % stat.ftype
end
end
@@ -59,11 +84,4 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
@checksum_type = "md5"
super
end
-
- private
-
- # Retrieve our checksum.
- def get_checksum(path)
- ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, path)
- end
end
diff --git a/lib/puppet/indirector/node/exec.rb b/lib/puppet/indirector/node/exec.rb
index ed76bce..71f4fa8 100644
--- a/lib/puppet/indirector/node/exec.rb
+++ b/lib/puppet/indirector/node/exec.rb
@@ -30,7 +30,7 @@ class Puppet::Node::Exec < Puppet::Indirector::Exec
def create_node(name, result)
node = Puppet::Node.new(name)
set = false
- [:parameters, :classes].each do |param|
+ [:parameters, :classes, :environment].each do |param|
if value = result[param]
node.send(param.to_s + "=", value)
set = true
diff --git a/lib/puppet/indirector/node/ldap.rb b/lib/puppet/indirector/node/ldap.rb
index dd11f4e..9320f3b 100644
--- a/lib/puppet/indirector/node/ldap.rb
+++ b/lib/puppet/indirector/node/ldap.rb
@@ -36,11 +36,14 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
information[:parameters][param] = value unless information[:parameters].include?(param)
end
+ information[:environment] ||= parent_info[:environment]
+
parent = parent_info[:parent]
end
node.classes = information[:classes].uniq unless information[:classes].empty?
node.parameters = information[:parameters] unless information[:parameters].empty?
+ node.environment = information[:environment] if information[:environment]
node.fact_merge
return node
@@ -87,6 +90,8 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
hash
end
+ result[:environment] = result[:parameters]["environment"] if result[:parameters]["environment"]
+
return result
end
diff --git a/lib/puppet/indirector/terminus.rb b/lib/puppet/indirector/terminus.rb
index a0623b2..3015c8a 100644
--- a/lib/puppet/indirector/terminus.rb
+++ b/lib/puppet/indirector/terminus.rb
@@ -66,6 +66,7 @@ class Puppet::Indirector::Terminus
subclass.terminus_type = self.name
# Our subclass is specifically associated with an indirection.
+ raise("Invalid name %s" % longname) unless names.length > 0
indirection_name = names.pop.sub(/^[A-Z]/) { |i| i.downcase }.gsub(/[A-Z]/) { |i| "_" + i.downcase }.intern
if indirection_name == "" or indirection_name.nil?
diff --git a/lib/puppet/metatype/closure.rb b/lib/puppet/metatype/closure.rb
index 2598544..673a235 100644
--- a/lib/puppet/metatype/closure.rb
+++ b/lib/puppet/metatype/closure.rb
@@ -20,6 +20,10 @@ class Puppet::Type
end
end
+ def isomorphic?
+ self.class.isomorphic?
+ end
+
# is the instance a managed instance? A 'yes' here means that
# the instance was created from the language, vs. being created
# in order resolve other questions, such as finding a package
diff --git a/lib/puppet/metatype/evaluation.rb b/lib/puppet/metatype/evaluation.rb
index b3b6570..08756e9 100644
--- a/lib/puppet/metatype/evaluation.rb
+++ b/lib/puppet/metatype/evaluation.rb
@@ -125,26 +125,14 @@ class Puppet::Type
raise Puppet::DevError, "Parameter ensure defined but missing from current values"
end
if @parameters.include?(:ensure) and ! ensureparam.insync?(currentvalues[ensureparam])
-# self.info "ensuring %s from %s" %
-# [@parameters[:ensure].should, @parameters[:ensure].is]
changes << Puppet::PropertyChange.new(ensureparam, currentvalues[ensureparam])
# Else, if the 'ensure' property is correctly absent, then do
# nothing
elsif @parameters.include?(:ensure) and currentvalues[ensureparam] == :absent
- # self.info "Object is correctly absent"
return []
else
-# if @parameters.include?(:ensure)
-# self.info "ensure: Is: %s, Should: %s" %
-# [@parameters[:ensure].is, @parameters[:ensure].should]
-# else
-# self.info "no ensure property"
-# end
changes = properties().find_all { |property|
- unless currentvalues.include?(property)
- raise Puppet::DevError, "Property %s does not have a current value",
- [property.name]
- end
+ currentvalues[property] ||= :absent
! property.insync?(currentvalues[property])
}.collect { |property|
Puppet::PropertyChange.new(property, currentvalues[property])
@@ -152,10 +140,7 @@ class Puppet::Type
end
if Puppet[:debug] and changes.length > 0
- self.debug("Changing " + changes.collect { |ch|
- ch.property.name
- }.join(",")
- )
+ self.debug("Changing " + changes.collect { |ch| ch.property.name }.join(","))
end
changes
diff --git a/lib/puppet/metatype/metaparams.rb b/lib/puppet/metatype/metaparams.rb
index b35adae..9983c34 100644
--- a/lib/puppet/metatype/metaparams.rb
+++ b/lib/puppet/metatype/metaparams.rb
@@ -258,7 +258,7 @@ class Puppet::Type
@value.each do |value|
unless @resource.catalog.resource(*value)
description = self.class.direction == :in ? "dependency" : "dependent"
- raise Puppet::Error, "Could not find #{description} %s[%s]" % [value[0].to_s.capitalize, value[1]]
+ fail Puppet::Error, "Could not find #{description} %s[%s] for %s" % [value[0].to_s.capitalize, value[1], resource.ref]
end
end
end
diff --git a/lib/puppet/network/http_server.rb b/lib/puppet/network.rb
similarity index 57%
copy from lib/puppet/network/http_server.rb
copy to lib/puppet/network.rb
index e3826a6..8993b88 100644
--- a/lib/puppet/network/http_server.rb
+++ b/lib/puppet/network.rb
@@ -1,3 +1,3 @@
# Just a stub, so we can correctly scope other classes.
-module Puppet::Network::HTTPServer # :nodoc:
+module Puppet::Network # :nodoc:
end
diff --git a/lib/puppet/network/client.rb b/lib/puppet/network/client.rb
index 283436e..cf1782f 100644
--- a/lib/puppet/network/client.rb
+++ b/lib/puppet/network/client.rb
@@ -7,6 +7,8 @@ require 'puppet/util/subclass_loader'
require 'puppet/util/methodhelper'
require 'puppet/sslcertificates/support'
+require 'puppet/network/handler'
+
require 'net/http'
# Some versions of ruby don't have this method defined, which basically causes
@@ -95,9 +97,7 @@ class Puppet::Network::Client
# We have to start the HTTP connection manually before we start
# sending it requests or keep-alive won't work.
- if @driver.respond_to? :start
- @driver.start
- end
+ @driver.start if @driver.respond_to? :start
@local = false
elsif hash.include?(driverparam)
@@ -107,8 +107,7 @@ class Puppet::Network::Client
end
@local = true
else
- raise Puppet::Network::ClientError, "%s must be passed a Server or %s" %
- [self.class, driverparam]
+ raise Puppet::Network::ClientError, "%s must be passed a Server or %s" % [self.class, driverparam]
end
end
diff --git a/lib/puppet/network/client/master.rb b/lib/puppet/network/client/master.rb
index 6d1a023..913c51b 100644
--- a/lib/puppet/network/client/master.rb
+++ b/lib/puppet/network/client/master.rb
@@ -26,22 +26,25 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
down = Puppet[:downcasefacts]
- facts = {}
- Facter.each { |name,fact|
+ facts = Facter.to_hash.inject({}) do |newhash, array|
+ name, fact = array
if down
- facts[name] = fact.to_s.downcase
+ newhash[name] = fact.to_s.downcase
else
- facts[name] = fact.to_s
+ newhash[name] = fact.to_s
end
- }
+ newhash
+ end
# Add our client version to the list of facts, so people can use it
# in their manifests
facts["clientversion"] = Puppet.version.to_s
# And add our environment as a fact.
- facts["environment"] = Puppet[:environment]
-
+ unless facts.include?("environment")
+ facts["environment"] = Puppet[:environment]
+ end
+
facts
end
diff --git a/lib/puppet/network/handler/fileserver.rb b/lib/puppet/network/handler/fileserver.rb
index e6378bf..751a772 100755
--- a/lib/puppet/network/handler/fileserver.rb
+++ b/lib/puppet/network/handler/fileserver.rb
@@ -5,6 +5,9 @@ require 'cgi'
require 'delegate'
require 'sync'
+require 'puppet/file_serving'
+require 'puppet/file_serving/metadata'
+
class Puppet::Network::Handler
AuthStoreError = Puppet::AuthStoreError
class FileServerError < Puppet::Error; end
@@ -59,40 +62,27 @@ class Puppet::Network::Handler
# Describe a given file. This returns all of the manageable aspects
# of that file.
- def describe(url, links = :ignore, client = nil, clientip = nil)
+ def describe(url, links = :follow, client = nil, clientip = nil)
links = links.intern if links.is_a? String
- if links == :manage
- raise Puppet::Network::Handler::FileServerError, "Cannot currently copy links"
- end
-
mount, path = convert(url, client, clientip)
- if client
- mount.debug "Describing %s for %s" % [url, client]
- end
+ mount.debug("Describing %s for %s" % [url, client]) if client
+
+ # use the mount to resolve the path for us.
+ metadata = Puppet::FileServing::Metadata.new(url, :path => mount.file_path(path, client), :links => links)
- obj = nil
- unless obj = mount.getfileobject(path, links, client)
+ return "" unless metadata.exist?
+
+ begin
+ metadata.collect_attributes
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ Puppet.err detail
return ""
end
- currentvalues = mount.check(obj)
-
- desc = []
- CHECKPARAMS.each { |check|
- if value = currentvalues[check]
- desc << value
- else
- if check == "checksum" and currentvalues[:type] == "file"
- mount.notice "File %s does not have data for %s" %
- [obj.name, check]
- end
- desc << nil
- end
- }
-
- return desc.join("\t")
+ return metadata.attributes_with_tabs
end
# Create a new fileserving module.
@@ -140,26 +130,18 @@ class Puppet::Network::Handler
def list(url, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
mount, path = convert(url, client, clientip)
- if client
- mount.debug "Listing %s for %s" % [url, client]
- end
+ mount.debug "Listing %s for %s" % [url, client] if client
- obj = nil
- unless mount.path_exists?(path, client)
- return ""
- end
+ return "" unless mount.path_exists?(path, client)
desc = mount.list(path, recurse, ignore, client)
if desc.length == 0
- mount.notice "Got no information on //%s/%s" %
- [mount, path]
+ mount.notice "Got no information on //%s/%s" % [mount, path]
return ""
end
-
- desc.collect { |sub|
- sub.join("\t")
- }.join("\n")
+
+ desc.collect { |sub| sub.join("\t") }.join("\n")
end
def local?
@@ -213,12 +195,7 @@ class Puppet::Network::Handler
return ""
end
- str = nil
- if links == :manage
- raise Puppet::Error, "Cannot copy links yet."
- else
- str = mount.read_file(path, client)
- end
+ str = mount.read_file(path, client)
if @local
return str
diff --git a/lib/puppet/network/http_pool.rb b/lib/puppet/network/http_pool.rb
index 99f09a9..69574d8 100644
--- a/lib/puppet/network/http_pool.rb
+++ b/lib/puppet/network/http_pool.rb
@@ -1,6 +1,9 @@
require 'puppet/sslcertificates/support'
require 'net/https'
+module Puppet::Network
+end
+
# Manage Net::HTTP instances for keep-alive.
module Puppet::Network::HttpPool
# This handles reading in the key and such-like.
diff --git a/lib/puppet/network/http_server/mongrel.rb b/lib/puppet/network/http_server/mongrel.rb
index d6e21b1..6b2325d 100644
--- a/lib/puppet/network/http_server/mongrel.rb
+++ b/lib/puppet/network/http_server/mongrel.rb
@@ -33,6 +33,7 @@ require 'xmlrpc/server'
require 'puppet/network/xmlrpc/server'
require 'puppet/network/http_server'
require 'puppet/network/client_request'
+require 'puppet/network/handler'
require 'puppet/daemon'
require 'resolv'
@@ -127,7 +128,12 @@ module Puppet::Network
client = dn_matchdata[1].to_str
valid = (params[Puppet[:ssl_client_verify_header]] == 'SUCCESS')
else
- client = Resolv.getname(ip)
+ begin
+ client = Resolv.getname(ip)
+ rescue => detail
+ Puppet.err "Could not resolve %s: %s" % [ip, detail]
+ client = "unknown"
+ end
valid = false
end
diff --git a/lib/puppet/network/http_server/webrick.rb b/lib/puppet/network/http_server/webrick.rb
index 3c9f72e..568b4e7 100644
--- a/lib/puppet/network/http_server/webrick.rb
+++ b/lib/puppet/network/http_server/webrick.rb
@@ -8,6 +8,7 @@ require 'puppet/sslcertificates/support'
require 'puppet/network/xmlrpc/webrick_servlet'
require 'puppet/network/http_server'
require 'puppet/network/client'
+require 'puppet/network/handler'
module Puppet
class ServerError < RuntimeError; end
@@ -22,12 +23,12 @@ module Puppet
# with them, with flags appropriate for checking client
# certificates for revocation
def x509store
- if Puppet[:cacrl] == 'none'
+ if Puppet[:cacrl] == 'false'
# No CRL, no store needed
return nil
end
unless File.exist?(Puppet[:cacrl])
- raise Puppet::Error, "Could not find CRL; set 'cacrl' to 'none' to disable CRL usage"
+ raise Puppet::Error, "Could not find CRL; set 'cacrl' to 'false' to disable CRL usage"
end
crl = OpenSSL::X509::CRL.new(File.read(Puppet[:cacrl]))
store = OpenSSL::X509::Store.new
@@ -133,7 +134,7 @@ module Puppet
handlers.collect { |handler, args|
hclass = nil
- unless hclass = Handler.handler(handler)
+ unless hclass = Puppet::Network::Handler.handler(handler)
raise ServerError, "Invalid handler %s" % handler
end
hclass.new(args)
diff --git a/lib/puppet/network/xmlrpc/client.rb b/lib/puppet/network/xmlrpc/client.rb
index 27bb3dc..f6a5e8d 100644
--- a/lib/puppet/network/xmlrpc/client.rb
+++ b/lib/puppet/network/xmlrpc/client.rb
@@ -90,6 +90,13 @@ module Puppet::Network
@clients[handler] || self.mkclient(handler)
end
+ def http
+ unless @http
+ @http = Puppet::Network::HttpPool.http_instance(@host, @port, true)
+ end
+ @http
+ end
+
def initialize(hash = {})
hash[:Path] ||= "/RPC2"
hash[:Server] ||= Puppet[:server]
@@ -125,7 +132,11 @@ module Puppet::Network
end
def start
- @http.start unless @http.started?
+ begin
+ @http.start unless @http.started?
+ rescue => detail
+ Puppet.err "Could not connect to server: %s" % detail
+ end
end
def local
diff --git a/lib/puppet/node/catalog.rb b/lib/puppet/node/catalog.rb
index c9de201..f885a41 100644
--- a/lib/puppet/node/catalog.rb
+++ b/lib/puppet/node/catalog.rb
@@ -1,5 +1,8 @@
require 'puppet/indirector'
-require 'puppet/external/gratr/digraph'
+require 'puppet/pgraph'
+require 'puppet/transaction'
+
+require 'puppet/util/tagging'
# This class models a node catalog. It is the thing
# meant to be passed from server to client, and it contains all
@@ -9,6 +12,8 @@ class Puppet::Node::Catalog < Puppet::PGraph
extend Puppet::Indirector
indirects :catalog, :terminus_class => :compiler
+ include Puppet::Util::Tagging
+
# The host name this is a catalog for.
attr_accessor :name
@@ -59,14 +64,21 @@ class Puppet::Node::Catalog < Puppet::PGraph
raise ArgumentError, "Can only add objects that respond to :ref"
end
+ fail_unless_unique(resource)
+
ref = resource.ref
- if @resource_table.include?(ref)
- raise ArgumentError, "Resource %s is already defined" % ref
- else
- @resource_table[ref] = resource
+
+ @resource_table[ref] = resource
+
+ # If the name and title differ, set up an alias
+ #self.alias(resource, resource.name) if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+ if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+ self.alias(resource, resource.name) if resource.isomorphic?
end
- resource.catalog = self unless is_relationship_graph
- add_vertex!(resource)
+
+ resource.catalog = self if resource.respond_to?(:catalog=) and ! is_relationship_graph
+
+ add_vertex(resource)
end
end
@@ -75,7 +87,10 @@ class Puppet::Node::Catalog < Puppet::PGraph
resource.ref =~ /^(.+)\[/
newref = "%s[%s]" % [$1 || resource.class.name, name]
- raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref]) if @resource_table[newref]
+ if existing = @resource_table[newref]
+ return if existing == resource
+ raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref])
+ end
@resource_table[newref] = resource
@aliases[resource.ref] << newref
end
@@ -212,9 +227,8 @@ class Puppet::Node::Catalog < Puppet::PGraph
# Create a proc for examining edges, which we'll use to build our tree
# of TransBuckets and TransObjects.
bucket = nil
- edges = proc do |edge|
+ walk(main, :out) do |source, target|
# The sources are always non-builtins.
- source, target = edge.source, edge.target
unless tmp = buckets[source.to_s]
if tmp = buckets[source.to_s] = source.to_trans
bucket = tmp
@@ -239,11 +253,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
end
end
end
- dfs(:start => main, :examine_edge => edges)
-
- unless main
- raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
- end
# Retrieve the bucket for the top-level scope and set the appropriate metadata.
unless result = buckets[main.to_s]
@@ -275,7 +284,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
super()
@name = name if name
@extraction_format ||= :transportable
- @tags = []
@classes = []
@resource_table = {}
@transient_resources = []
@@ -320,9 +328,9 @@ class Puppet::Node::Catalog < Puppet::PGraph
# First create the dependency graph
self.vertices.each do |vertex|
- @relationship_graph.add_vertex! vertex
+ @relationship_graph.add_vertex vertex
vertex.builddepends.each do |edge|
- @relationship_graph.add_edge!(edge)
+ @relationship_graph.add_edge(edge)
end
end
@@ -332,7 +340,7 @@ class Puppet::Node::Catalog < Puppet::PGraph
unless @relationship_graph.edge?(edge.source, edge.target) # don't let automatic relationships conflict with manual ones.
unless @relationship_graph.edge?(edge.target, edge.source)
vertex.debug "Autorequiring %s" % [edge.source]
- @relationship_graph.add_edge!(edge)
+ @relationship_graph.add_edge(edge)
else
vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
end
@@ -388,25 +396,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
@resource_table.keys
end
- # Add a tag.
- def tag(*names)
- names.each do |name|
- name = name.to_s
- @tags << name unless @tags.include?(name)
- if name.include?("::")
- name.split("::").each do |sub|
- @tags << sub unless @tags.include?(sub)
- end
- end
- end
- nil
- end
-
- # Return the list of tags.
- def tags
- @tags.dup
- end
-
# Convert our catalog into a RAL catalog.
def to_ral
to_catalog :to_type
@@ -454,6 +443,28 @@ class Puppet::Node::Catalog < Puppet::PGraph
end
end
+ # Verify that the given resource isn't defined elsewhere.
+ def fail_unless_unique(resource)
+ # Short-curcuit the common case,
+ return unless existing_resource = @resource_table[resource.ref]
+
+ # Either it's a defined type, which are never
+ # isomorphic, or it's a non-isomorphic type, so
+ # we should throw an exception.
+ msg = "Duplicate definition: %s is already defined" % resource.ref
+
+ if existing_resource.file and existing_resource.line
+ msg << " in file %s at line %s" %
+ [existing_resource.file, existing_resource.line]
+ end
+
+ if resource.line or resource.file
+ msg << "; cannot redefine"
+ end
+
+ raise ArgumentError.new(msg)
+ end
+
# An abstracted method for converting one catalog into another type of catalog.
# This pretty much just converts all of the resources from one class to another, using
# a conversion method.
@@ -488,12 +499,12 @@ class Puppet::Node::Catalog < Puppet::PGraph
raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.target.ref, message]
end
- result.add_edge!(source, target, edge.label)
+ result.add_edge(source, target, edge.label)
end
map.clear
- result.add_class *self.classes
+ result.add_class(*self.classes)
result.tag(*self.tags)
return result
diff --git a/lib/puppet/parser/ast.rb b/lib/puppet/parser/ast.rb
index 14b686e..c9bd7c9 100644
--- a/lib/puppet/parser/ast.rb
+++ b/lib/puppet/parser/ast.rb
@@ -14,30 +14,6 @@ class Puppet::Parser::AST
include Puppet::Util::MethodHelper
attr_accessor :line, :file, :parent, :scope
- # Just used for 'tree', which is only used in debugging.
- @@pink = "[0;31m"
- @@green = "[0;32m"
- @@yellow = "[0;33m"
- @@slate = "[0;34m"
- @@reset = "[0m"
-
- # Just used for 'tree', which is only used in debugging.
- @@indent = " " * 4
- @@indline = @@pink + ("-" * 4) + @@reset
- @@midline = @@slate + ("-" * 4) + @@reset
-
- @@settypes = {}
-
- # Just used for 'tree', which is only used in debugging.
- def AST.indention
- return @@indent * @@indention
- end
-
- # Just used for 'tree', which is only used in debugging.
- def AST.midline
- return @@midline
- end
-
# Does this ast object set something? If so, it gets evaluated first.
def self.settor?
if defined? @settor
@@ -47,16 +23,12 @@ class Puppet::Parser::AST
end
end
- # Evaluate the current object. Basically just iterates across all
+ # Evaluate the current object. Just a stub method, since the subclass
+ # should override this method.
# of the contained children and evaluates them in turn, returning a
# list of all of the collected values, rejecting nil values
- def evaluate(args)
- #Puppet.debug("Evaluating ast %s" % @name)
- value = self.collect { |obj|
- obj.safeevaluate(args)
- }.reject { |obj|
- obj.nil?
- }
+ def evaluate(*options)
+ raise Puppet::DevError, "Did not override #evaluate in %s" % self.class
end
# Throw a parse error.
@@ -75,11 +47,11 @@ class Puppet::Parser::AST
# correctly handles errors. It is critical to use this method because
# it can enable you to catch the error where it happens, rather than
# much higher up the stack.
- def safeevaluate(options)
+ def safeevaluate(*options)
# We duplicate code here, rather than using exceptwrap, because this
# is called so many times during parsing.
begin
- return self.evaluate(options)
+ return self.evaluate(*options)
rescue Puppet::Error => detail
raise adderrorcontext(detail)
rescue => detail
@@ -90,14 +62,6 @@ class Puppet::Parser::AST
end
end
- # Again, just used for printing out the parse tree.
- def typewrap(string)
- #return self.class.to_s.sub(/.+::/,'') +
- #"(" + @@green + string.to_s + @@reset + ")"
- return @@green + string.to_s + @@reset +
- "(" + self.class.to_s.sub(/.+::/,'') + ")"
- end
-
# Initialize the object. Requires a hash as the argument, and
# takes each of the parameters of the hash and calls the settor
# method for them. This is probably pretty inefficient and should
@@ -107,13 +71,27 @@ class Puppet::Parser::AST
@line = nil
set_options(args)
end
- #---------------------------------------------------------------
- # Now autoload everything.
- @autoloader = Puppet::Util::Autoload.new(self,
- "puppet/parser/ast"
- )
- @autoloader.loadall
end
+# And include all of the AST subclasses.
+require 'puppet/parser/ast/astarray'
+require 'puppet/parser/ast/branch'
+require 'puppet/parser/ast/caseopt'
+require 'puppet/parser/ast/casestatement'
+require 'puppet/parser/ast/collection'
+require 'puppet/parser/ast/collexpr'
+require 'puppet/parser/ast/definition'
+require 'puppet/parser/ast/else'
+require 'puppet/parser/ast/function'
+require 'puppet/parser/ast/hostclass'
+require 'puppet/parser/ast/ifstatement'
require 'puppet/parser/ast/leaf'
-
+require 'puppet/parser/ast/node'
+require 'puppet/parser/ast/resource'
+require 'puppet/parser/ast/resource_defaults'
+require 'puppet/parser/ast/resource_override'
+require 'puppet/parser/ast/resource_reference'
+require 'puppet/parser/ast/resourceparam'
+require 'puppet/parser/ast/selector'
+require 'puppet/parser/ast/tag'
+require 'puppet/parser/ast/vardef'
diff --git a/lib/puppet/parser/ast/astarray.rb b/lib/puppet/parser/ast/astarray.rb
index 5f1e838..8f09aa9 100644
--- a/lib/puppet/parser/ast/astarray.rb
+++ b/lib/puppet/parser/ast/astarray.rb
@@ -15,18 +15,7 @@ class Puppet::Parser::AST
end
# Evaluate our children.
- def evaluate(hash)
- scope = hash[:scope]
- rets = nil
- # We basically always operate declaratively, and when we
- # do we need to evaluate the settor-like statements first. This
- # is basically variable and type-default declarations.
- # This is such a stupid hack. I've no real idea how to make a
- # "real" declarative language, so I hack it so it looks like
- # one, yay.
- settors = []
- others = []
-
+ def evaluate(scope)
# Make a new array, so we don't have to deal with the details of
# flattening and such
items = []
@@ -35,23 +24,15 @@ class Puppet::Parser::AST
@children.each { |child|
if child.instance_of?(AST::ASTArray)
child.each do |ac|
- if ac.class.settor?
- settors << ac
- else
- others << ac
- end
+ items << ac
end
else
- if child.class.settor?
- settors << child
- else
- others << child
- end
+ items << child
end
}
- rets = [settors, others].flatten.collect { |child|
- child.safeevaluate(:scope => scope)
+ rets = items.flatten.collect { |child|
+ child.safeevaluate(scope)
}
return rets.reject { |o| o.nil? }
end
diff --git a/lib/puppet/parser/ast/caseopt.rb b/lib/puppet/parser/ast/caseopt.rb
index d1d9d0e..824bde8 100644
--- a/lib/puppet/parser/ast/caseopt.rb
+++ b/lib/puppet/parser/ast/caseopt.rb
@@ -44,17 +44,17 @@ class Puppet::Parser::AST
def eachvalue(scope)
if @value.is_a?(AST::ASTArray)
@value.each { |subval|
- yield subval.evaluate(:scope => scope)
+ yield subval.safeevaluate(scope)
}
else
- yield @value.evaluate(:scope => scope)
+ yield @value.safeevaluate(scope)
end
end
# Evaluate the actual statements; this only gets called if
# our option matched.
- def evaluate(hash)
- return @statements.safeevaluate(hash)
+ def evaluate(scope)
+ return @statements.safeevaluate(scope)
end
end
end
diff --git a/lib/puppet/parser/ast/casestatement.rb b/lib/puppet/parser/ast/casestatement.rb
index 3c6f9c7..aa03090 100644
--- a/lib/puppet/parser/ast/casestatement.rb
+++ b/lib/puppet/parser/ast/casestatement.rb
@@ -8,9 +8,8 @@ class Puppet::Parser::AST
# Short-curcuit evaluation. Return the value of the statements for
# the first option that matches.
- def evaluate(hash)
- scope = hash[:scope]
- value = @test.safeevaluate(:scope => scope)
+ def evaluate(scope)
+ value = @test.safeevaluate(scope)
sensitive = Puppet[:casesensitive]
value = value.downcase if ! sensitive and value.respond_to?(:downcase)
@@ -30,7 +29,7 @@ class Puppet::Parser::AST
if found
# we found a matching option
- retvalue = option.safeevaluate(:scope => scope)
+ retvalue = option.safeevaluate(scope)
break
end
@@ -42,7 +41,7 @@ class Puppet::Parser::AST
# Unless we found something, look for the default.
unless found
if default
- retvalue = default.safeevaluate(:scope => scope)
+ retvalue = default.safeevaluate(scope)
else
Puppet.debug "No true answers and no default"
retvalue = nil
diff --git a/lib/puppet/parser/ast/collection.rb b/lib/puppet/parser/ast/collection.rb
index e05977a..9e795a3 100644
--- a/lib/puppet/parser/ast/collection.rb
+++ b/lib/puppet/parser/ast/collection.rb
@@ -9,18 +9,16 @@ class Collection < AST::Branch
attr_accessor :type, :query, :form
# We return an object that does a late-binding evaluation.
- def evaluate(hash)
- scope = hash[:scope]
-
+ def evaluate(scope)
if self.query
- str, code = self.query.safeevaluate :scope => scope
+ str, code = self.query.safeevaluate scope
else
str = code = nil
end
newcoll = Puppet::Parser::Collector.new(scope, @type, str, code, self.form)
- scope.compile.add_collection(newcoll)
+ scope.compiler.add_collection(newcoll)
newcoll
end
diff --git a/lib/puppet/parser/ast/collexpr.rb b/lib/puppet/parser/ast/collexpr.rb
index 4a96d9c..3e13d94 100644
--- a/lib/puppet/parser/ast/collexpr.rb
+++ b/lib/puppet/parser/ast/collexpr.rb
@@ -9,9 +9,7 @@ class CollExpr < AST::Branch
attr_accessor :test1, :test2, :oper, :form, :type, :parens
# We return an object that does a late-binding evaluation.
- def evaluate(hash)
- scope = hash[:scope]
-
+ def evaluate(scope)
# Make sure our contained expressions have all the info they need.
[@test1, @test2].each do |t|
if t.is_a?(self.class)
@@ -21,8 +19,8 @@ class CollExpr < AST::Branch
end
# The code is only used for virtual lookups
- str1, code1 = @test1.safeevaluate :scope => scope
- str2, code2 = @test2.safeevaluate :scope => scope
+ str1, code1 = @test1.safeevaluate scope
+ str2, code2 = @test2.safeevaluate scope
# First build up the virtual code.
# If we're a conjunction operator, then we're calling code. I did
diff --git a/lib/puppet/parser/ast/definition.rb b/lib/puppet/parser/ast/definition.rb
index 3d6d618..0c65c70 100644
--- a/lib/puppet/parser/ast/definition.rb
+++ b/lib/puppet/parser/ast/definition.rb
@@ -1,155 +1,145 @@
require 'puppet/parser/ast/branch'
-class Puppet::Parser::AST
- # Evaluate the stored parse tree for a given component. This will
- # receive the arguments passed to the component and also the type and
- # name of the component.
- class Definition < AST::Branch
- include Puppet::Util
- include Puppet::Util::Warnings
- include Puppet::Util::MethodHelper
- class << self
- attr_accessor :name
- end
+require 'puppet/util/warnings'
- # The class name
- @name = :definition
+# The AST class for defined types, which is also the base class
+# nodes and classes.
+class Puppet::Parser::AST::Definition < Puppet::Parser::AST::Branch
+ include Puppet::Util::Warnings
+ class << self
+ attr_accessor :name
+ end
- attr_accessor :classname, :arguments, :code, :scope, :keyword
- attr_accessor :exported, :namespace, :parser, :virtual
+ # The class name
+ @name = :definition
- # These are retrieved when looking up the superclass
- attr_accessor :name
+ attr_accessor :classname, :arguments, :code, :scope, :keyword
+ attr_accessor :exported, :namespace, :parser, :virtual, :name
- attr_reader :parentclass
+ attr_reader :parentclass
- def child_of?(klass)
- false
- end
+ def child_of?(klass)
+ false
+ end
- def evaluate(options)
- origscope = options[:scope]
- resource = options[:resource]
+ # Create a resource that knows how to evaluate our actual code.
+ def evaluate(scope)
+ resource = Puppet::Parser::Resource.new(:type => self.class.name, :title => self.classname, :scope => scope, :source => scope.source)
- # Create a new scope.
- scope = subscope(origscope, resource)
+ scope.catalog.tag(*resource.tags)
- # Additionally, add a tag for whatever kind of class
- # we are
- if @classname != "" and ! @classname.nil?
- @classname.split(/::/).each { |tag| scope.resource.tag(tag) }
- end
+ scope.compiler.add_resource(scope, resource)
- [resource.name, resource.title].each do |str|
- unless str.nil? or str =~ /[^\w]/ or str == ""
- scope.resource.tag(str)
- end
- end
+ return resource
+ end
- set_resource_parameters(scope, resource)
+ # Now evaluate the code associated with this class or definition.
+ def evaluate_code(resource)
+ # Create a new scope.
+ scope = subscope(resource.scope, resource)
- if self.code
- return self.code.safeevaluate(:scope => scope)
- else
- return nil
- end
+ set_resource_parameters(scope, resource)
+
+ if self.code
+ return self.code.safeevaluate(scope)
+ else
+ return nil
end
+ end
- def initialize(hash = {})
- @arguments = nil
- @parentclass = nil
- super
+ def initialize(hash = {})
+ @arguments = nil
+ @parentclass = nil
+ super
- # Convert the arguments to a hash for ease of later use.
- if @arguments
- unless @arguments.is_a? Array
- @arguments = [@arguments]
- end
- oldargs = @arguments
- @arguments = {}
- oldargs.each do |arg, val|
- @arguments[arg] = val
- end
- else
- @arguments = {}
+ # Convert the arguments to a hash for ease of later use.
+ if @arguments
+ unless @arguments.is_a? Array
+ @arguments = [@arguments]
end
-
- # Deal with metaparams in the argument list.
- @arguments.each do |arg, defvalue|
- next unless Puppet::Type.metaparamclass(arg)
- if defvalue
- warnonce "%s is a metaparam; this value will inherit to all contained resources" % arg
- else
- raise Puppet::ParseError, "%s is a metaparameter; please choose another parameter name in the %s definition" % [arg, self.classname]
- end
+ oldargs = @arguments
+ @arguments = {}
+ oldargs.each do |arg, val|
+ @arguments[arg] = val
end
+ else
+ @arguments = {}
end
- def find_parentclass
- @parser.findclass(namespace, parentclass)
+ # Deal with metaparams in the argument list.
+ @arguments.each do |arg, defvalue|
+ next unless Puppet::Type.metaparamclass(arg)
+ if defvalue
+ warnonce "%s is a metaparam; this value will inherit to all contained resources" % arg
+ else
+ raise Puppet::ParseError, "%s is a metaparameter; please choose another parameter name in the %s definition" % [arg, self.classname]
+ end
end
+ end
- # Set our parent class, with a little check to avoid some potential
- # weirdness.
- def parentclass=(name)
- if name == self.classname
- parsefail "Parent classes must have dissimilar names"
- end
+ def find_parentclass
+ @parser.findclass(namespace, parentclass)
+ end
- @parentclass = name
+ # Set our parent class, with a little check to avoid some potential
+ # weirdness.
+ def parentclass=(name)
+ if name == self.classname
+ parsefail "Parent classes must have dissimilar names"
end
- # Hunt down our class object.
- def parentobj
- if @parentclass
- # Cache our result, since it should never change.
- unless defined?(@parentobj)
- unless tmp = find_parentclass
- parsefail "Could not find %s %s" % [self.class.name, @parentclass]
- end
+ @parentclass = name
+ end
- if tmp == self
- parsefail "Parent classes must have dissimilar names"
- end
+ # Hunt down our class object.
+ def parentobj
+ return nil unless @parentclass
- @parentobj = tmp
- end
- @parentobj
- else
- nil
+ # Cache our result, since it should never change.
+ unless defined?(@parentobj)
+ unless tmp = find_parentclass
+ parsefail "Could not find %s parent %s" % [self.class.name, @parentclass]
end
+
+ if tmp == self
+ parsefail "Parent classes must have dissimilar names"
+ end
+
+ @parentobj = tmp
end
+ @parentobj
+ end
- # Create a new subscope in which to evaluate our code.
- def subscope(scope, resource)
- args = {
- :resource => resource,
- :keyword => self.keyword,
- :namespace => self.namespace,
- :source => self
- }
+ # Create a new subscope in which to evaluate our code.
+ def subscope(scope, resource)
+ args = {
+ :resource => resource,
+ :keyword => self.keyword,
+ :namespace => self.namespace,
+ :source => self
+ }
- oldscope = scope
- scope = scope.newscope(args)
- scope.source = self
+ oldscope = scope
+ scope = scope.newscope(args)
+ scope.source = self
- return scope
- end
+ return scope
+ end
- def to_s
- classname
- end
+ def to_s
+ classname
+ end
- # Check whether a given argument is valid. Searches up through
- # any parent classes that might exist.
- def validattr?(param)
- param = param.to_s
+ # Check whether a given argument is valid. Searches up through
+ # any parent classes that might exist.
+ def validattr?(param)
+ param = param.to_s
- if @arguments.include?(param)
- # It's a valid arg for us
- return true
- elsif param == "name"
- return true
+ if @arguments.include?(param)
+ # It's a valid arg for us
+ return true
+ elsif param == "name"
+ return true
# elsif defined? @parentclass and @parentclass
# # Else, check any existing parent
# if parent = @scope.lookuptype(@parentclass) and parent != []
@@ -160,53 +150,52 @@ class Puppet::Parser::AST
# raise Puppet::Error, "Could not find parent class %s" %
# @parentclass
# end
- elsif Puppet::Type.metaparam?(param)
- return true
- else
- # Or just return false
- return false
- end
+ elsif Puppet::Type.metaparam?(param)
+ return true
+ else
+ # Or just return false
+ return false
end
+ end
- private
-
- # Set any arguments passed by the resource as variables in the scope.
- def set_resource_parameters(scope, resource)
- args = symbolize_options(resource.to_hash || {})
-
- # Verify that all required arguments are either present or
- # have been provided with defaults.
- if self.arguments
- self.arguments.each { |arg, default|
- arg = symbolize(arg)
- unless args.include?(arg)
- if defined? default and ! default.nil?
- default = default.safeevaluate :scope => scope
- args[arg] = default
- #Puppet.debug "Got default %s for %s in %s" %
- # [default.inspect, arg.inspect, @name.inspect]
- else
- parsefail "Must pass %s to %s of type %s" %
- [arg, resource.title, @classname]
- end
+ private
+
+ # Set any arguments passed by the resource as variables in the scope.
+ def set_resource_parameters(scope, resource)
+ args = symbolize_options(resource.to_hash || {})
+
+ # Verify that all required arguments are either present or
+ # have been provided with defaults.
+ if self.arguments
+ self.arguments.each { |arg, default|
+ arg = arg.to_sym
+ unless args.include?(arg)
+ if defined? default and ! default.nil?
+ default = default.safeevaluate scope
+ args[arg] = default
+ #Puppet.debug "Got default %s for %s in %s" %
+ # [default.inspect, arg.inspect, @name.inspect]
+ else
+ parsefail "Must pass %s to %s of type %s" %
+ [arg, resource.title, @classname]
end
- }
- end
-
- # Set each of the provided arguments as variables in the
- # definition's scope.
- args.each { |arg,value|
- unless validattr?(arg)
- parsefail "%s does not accept attribute %s" % [@classname, arg]
- end
-
- exceptwrap do
- scope.setvar(arg.to_s, args[arg])
end
}
-
- scope.setvar("title", resource.title) unless args.include? :title
- scope.setvar("name", resource.name) unless args.include? :name
end
+
+ # Set each of the provided arguments as variables in the
+ # definition's scope.
+ args.each { |arg,value|
+ unless validattr?(arg)
+ parsefail "%s does not accept attribute %s" % [@classname, arg]
+ end
+
+ exceptwrap do
+ scope.setvar(arg.to_s, args[arg])
+ end
+ }
+
+ scope.setvar("title", resource.title) unless args.include? :title
+ scope.setvar("name", resource.name) unless args.include? :name
end
end
diff --git a/lib/puppet/parser/ast/else.rb b/lib/puppet/parser/ast/else.rb
index e760513..affac62 100644
--- a/lib/puppet/parser/ast/else.rb
+++ b/lib/puppet/parser/ast/else.rb
@@ -12,9 +12,8 @@ class Puppet::Parser::AST
# Evaluate the actual statements; this only gets called if
# our test was true matched.
- def evaluate(hash)
- scope = hash[:scope]
- return @statements.safeevaluate(:scope => scope)
+ def evaluate(scope)
+ return @statements.safeevaluate(scope)
end
end
end
diff --git a/lib/puppet/parser/ast/function.rb b/lib/puppet/parser/ast/function.rb
index 0cd1fff..63d7c7a 100644
--- a/lib/puppet/parser/ast/function.rb
+++ b/lib/puppet/parser/ast/function.rb
@@ -7,18 +7,11 @@ class Puppet::Parser::AST
@settor = true
- def evaluate(hash)
+ def evaluate(scope)
# We don't need to evaluate the name, because it's plaintext
+ args = @arguments.safeevaluate(scope)
- # Just evaluate the arguments
- scope = hash[:scope]
-
- args = @arguments.safeevaluate(:scope => scope)
-
- #exceptwrap :message => "Failed to execute %s" % @name,
- # :type => Puppet::ParseError do
- return scope.send("function_" + @name, args)
- #end
+ return scope.send("function_" + @name, args)
end
def initialize(hash)
diff --git a/lib/puppet/parser/ast/hostclass.rb b/lib/puppet/parser/ast/hostclass.rb
index 63900d0..7f89f81 100644
--- a/lib/puppet/parser/ast/hostclass.rb
+++ b/lib/puppet/parser/ast/hostclass.rb
@@ -1,80 +1,87 @@
require 'puppet/parser/ast/definition'
-class Puppet::Parser::AST
- # The code associated with a class. This is different from definitions
- # in that each class is a singleton -- only one will exist for a given
- # node.
- class HostClass < AST::Definition
- @name = :class
+# The code associated with a class. This is different from definitions
+# in that each class is a singleton -- only one will exist for a given
+# node.
+class Puppet::Parser::AST::HostClass < Puppet::Parser::AST::Definition
+ @name = :class
- # Are we a child of the passed class? Do a recursive search up our
- # parentage tree to figure it out.
- def child_of?(klass)
- return false unless self.parentclass
+ # Are we a child of the passed class? Do a recursive search up our
+ # parentage tree to figure it out.
+ def child_of?(klass)
+ return false unless self.parentclass
- if klass == self.parentobj
- return true
- else
- return self.parentobj.child_of?(klass)
- end
+ if klass == self.parentobj
+ return true
+ else
+ return self.parentobj.child_of?(klass)
end
+ end
- # Evaluate the code associated with this class.
- def evaluate(options)
- scope = options[:scope]
- raise(ArgumentError, "Classes require resources") unless options[:resource]
- # Verify that we haven't already been evaluated. This is
- # what provides the singleton aspect.
- if existing_scope = scope.compile.class_scope(self)
- Puppet.debug "Class '%s' already evaluated; not evaluating again" % (classname == "" ? "main" : classname)
- return nil
- end
+ # Make sure our parent class has been evaluated, if we have one.
+ def evaluate(scope)
+ if parentclass and ! scope.catalog.resource(self.class.name, parentclass)
+ parent_resource = parentobj.evaluate(scope)
+ end
- scope.compile.catalog.tag(self.classname)
+ # Do nothing if the resource already exists; this makes sure we don't
+ # get multiple copies of the class resource, which helps provide the
+ # singleton nature of classes.
+ if resource = scope.catalog.resource(self.class.name, self.classname)
+ return resource
+ end
- pnames = nil
- if pklass = self.parentobj
- pklass.safeevaluate :scope => scope, :resource => options[:resource]
+ super
+ end
- scope = parent_scope(scope, pklass)
- pnames = scope.namespaces
- end
+ # Evaluate the code associated with this class.
+ def evaluate_code(resource)
+ scope = resource.scope
+ # Verify that we haven't already been evaluated. This is
+ # what provides the singleton aspect.
+ if existing_scope = scope.compiler.class_scope(self)
+ Puppet.debug "Class '%s' already evaluated; not evaluating again" % (classname == "" ? "main" : classname)
+ return nil
+ end
- # Don't create a subscope for the top-level class, since it already
- # has its own scope.
- unless options[:resource].title == :main
- scope = subscope(scope, options[:resource])
- end
+ pnames = nil
+ if pklass = self.parentobj
+ parent_resource = resource.scope.compiler.catalog.resource(self.class.name, pklass.classname)
+ # This shouldn't evaluate if the class has already been evaluated.
+ pklass.evaluate_code(parent_resource)
- if pnames
- pnames.each do |ns|
- scope.add_namespace(ns)
- end
- end
+ scope = parent_scope(scope, pklass)
+ pnames = scope.namespaces
+ end
- # Set the class before we do anything else, so that it's set
- # during the evaluation and can be inspected.
- scope.compile.class_set(self.classname, scope)
+ # Don't create a subscope for the top-level class, since it already
+ # has its own scope.
+ scope = subscope(scope, resource) unless resource.title == :main
- # Now evaluate our code, yo.
- if self.code
- return self.code.evaluate(:scope => scope)
- else
- return nil
+ # Add the parent scope namespaces to our own.
+ if pnames
+ pnames.each do |ns|
+ scope.add_namespace(ns)
end
end
- def initialize(options)
- @parentclass = nil
- super
+ # Set the class before we evaluate the code, so that it's set during
+ # the evaluation and can be inspected.
+ scope.compiler.class_set(self.classname, scope)
+
+ # Now evaluate our code, yo.
+ if self.code
+ return self.code.safeevaluate(scope)
+ else
+ return nil
end
+ end
- def parent_scope(scope, klass)
- if s = scope.compile.class_scope(klass)
- return s
- else
- raise Puppet::DevError, "Could not find scope for %s" % klass.classname
- end
+ def parent_scope(scope, klass)
+ if s = scope.compiler.class_scope(klass)
+ return s
+ else
+ raise Puppet::DevError, "Could not find scope for %s" % klass.classname
end
end
end
diff --git a/lib/puppet/parser/ast/ifstatement.rb b/lib/puppet/parser/ast/ifstatement.rb
index 66a07b0..afa2cd5 100644
--- a/lib/puppet/parser/ast/ifstatement.rb
+++ b/lib/puppet/parser/ast/ifstatement.rb
@@ -12,15 +12,14 @@ class Puppet::Parser::AST
# Short-curcuit evaluation. If we're true, evaluate our statements,
# else if there's an 'else' setting, evaluate it.
# the first option that matches.
- def evaluate(hash)
- scope = hash[:scope]
- value = @test.safeevaluate(:scope => scope)
+ def evaluate(scope)
+ value = @test.safeevaluate(scope)
if Puppet::Parser::Scope.true?(value)
- return @statements.safeevaluate(:scope => scope)
+ return @statements.safeevaluate(scope)
else
if defined? @else
- return @else.safeevaluate(:scope => scope)
+ return @else.safeevaluate(scope)
else
return nil
end
diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index 2252530..c545c1e 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -6,7 +6,7 @@ class Puppet::Parser::AST
attr_accessor :value, :type
# Return our value.
- def evaluate(hash)
+ def evaluate(scope)
return @value
end
@@ -35,14 +35,14 @@ class Puppet::Parser::AST
class String < AST::Leaf
# Interpolate the string looking for variables, and then return
# the result.
- def evaluate(hash)
- return hash[:scope].strinterp(@value, @file, @line)
+ def evaluate(scope)
+ return scope.strinterp(@value, @file, @line)
end
end
# An uninterpreted string.
class FlatString < AST::Leaf
- def evaluate(hash)
+ def evaluate(scope)
return @value
end
end
@@ -81,9 +81,9 @@ class Puppet::Parser::AST
class Variable < Name
# Looks up the value of the object in the scope tree (does
# not include syntactical constructs, like '$' and '{}').
- def evaluate(hash)
+ def evaluate(scope)
parsewrap do
- return hash[:scope].lookupvar(@value)
+ return scope.lookupvar(@value)
end
end
end
diff --git a/lib/puppet/parser/ast/node.rb b/lib/puppet/parser/ast/node.rb
index a296e43..2bf6c18 100644
--- a/lib/puppet/parser/ast/node.rb
+++ b/lib/puppet/parser/ast/node.rb
@@ -1,67 +1,35 @@
require 'puppet/parser/ast/hostclass'
-class Puppet::Parser::AST
- # The specific code associated with a host. Nodes are annoyingly unlike
- # other objects. That's just the way it is, at least for now.
- class Node < AST::HostClass
- @name = :node
- attr_accessor :name
-
- def evaluate(options)
- scope = options[:scope]
-
- #pscope = if ! Puppet[:lexical] or options[:asparent]
- # @scope
- #else
- # origscope
- #end
-
- # We don't have to worry about the declarativeness of node parentage,
- # because the entry point is always a single node definition.
- if parent = self.parentobj
- scope = parent.safeevaluate :scope => scope, :resource => options[:resource]
- end
-
- scope = scope.newscope(
- :resource => options[:resource],
- :keyword => @keyword,
- :source => self,
- :namespace => "" # nodes are always in ""
- )
-
- # Mark our node name as a class, too, but strip it of the domain
- # name. Make the mark before we evaluate the code, so that it is
- # marked within the code itself.
- scope.compile.class_set(self.classname, scope)
-
- # And then evaluate our code if we have any
- if self.code
- @code.safeevaluate(:scope => scope)
- end
-
- return scope
+# The specific code associated with a host. Nodes are annoyingly unlike
+# other objects. That's just the way it is, at least for now.
+class Puppet::Parser::AST::Node < Puppet::Parser::AST::HostClass
+ @name = :node
+
+ def initialize(options)
+ @parentclass = nil
+ super
+
+ # Do some validation on the node name
+ if @name =~ /[^-\w.]/
+ raise Puppet::ParseError, "Invalid node name %s" % @name
end
+ end
- def initialize(options)
- @parentclass = nil
- super
+ def namespace
+ ""
+ end
- # Do some validation on the node name
- if @name =~ /[^-\w.]/
- raise Puppet::ParseError, "Invalid node name %s" % @name
- end
- end
+ # Make sure node scopes are marked as such.
+ def subscope(*args)
+ scope = super
+ scope.nodescope = true
+ scope
+ end
- # Make sure node scopes are marked as such.
- def subscope(*args)
- scope = super
- scope.nodescope = true
- end
+ private
- private
- # Search for the object matching our parent class.
- def find_parentclass
- @parser.findnode(parentclass)
- end
+ # Search for the object matching our parent class.
+ def find_parentclass
+ @parser.findnode(parentclass)
end
end
diff --git a/lib/puppet/parser/ast/resource.rb b/lib/puppet/parser/ast/resource.rb
index c53ab0a..8a60522 100644
--- a/lib/puppet/parser/ast/resource.rb
+++ b/lib/puppet/parser/ast/resource.rb
@@ -9,15 +9,13 @@ class Resource < AST::ResourceReference
# Does not actually return an object; instead sets an object
# in the current scope.
- def evaluate(options)
- scope = options[:scope]
-
+ def evaluate(scope)
# Evaluate all of the specified params.
paramobjects = @params.collect { |param|
- param.safeevaluate(:scope => scope)
+ param.safeevaluate(scope)
}
- objtitles = @title.safeevaluate(:scope => scope)
+ objtitles = @title.safeevaluate(scope)
# it's easier to always use an array, even for only one name
unless objtitles.is_a?(Array)
@@ -50,10 +48,10 @@ class Resource < AST::ResourceReference
:scope => scope
)
- # And then store the resource in the compile.
+ # And then store the resource in the compiler.
# At some point, we need to switch all of this to return
# objects instead of storing them like this.
- scope.compile.store_resource(scope, obj)
+ scope.compiler.add_resource(scope, obj)
obj
end
}.reject { |obj| obj.nil? }
diff --git a/lib/puppet/parser/ast/resource_defaults.rb b/lib/puppet/parser/ast/resource_defaults.rb
index 8f9c1b8..4856f05 100644
--- a/lib/puppet/parser/ast/resource_defaults.rb
+++ b/lib/puppet/parser/ast/resource_defaults.rb
@@ -8,13 +8,11 @@ class Puppet::Parser::AST
# As opposed to ResourceDef, this stores each default for the given
# object type.
- def evaluate(hash)
- scope = hash[:scope]
-
+ def evaluate(scope)
# Use a resource reference to canonize the type
ref = Puppet::ResourceReference.new(@type, "whatever")
type = ref.type
- params = @params.safeevaluate(:scope => scope)
+ params = @params.safeevaluate(scope)
parsewrap do
scope.setdefaults(type, params)
diff --git a/lib/puppet/parser/ast/resource_override.rb b/lib/puppet/parser/ast/resource_override.rb
index 46c9309..f9464ac 100644
--- a/lib/puppet/parser/ast/resource_override.rb
+++ b/lib/puppet/parser/ast/resource_override.rb
@@ -17,17 +17,15 @@ class Puppet::Parser::AST
# Does not actually return an object; instead sets an object
# in the current scope.
- def evaluate(hash)
- scope = hash[:scope]
-
+ def evaluate(scope)
# Get our object reference.
- object = @object.safeevaluate(:scope => scope)
+ object = @object.safeevaluate(scope)
hash = {}
# Evaluate all of the specified params.
params = @params.collect { |param|
- param.safeevaluate(:scope => scope)
+ param.safeevaluate(scope)
}
# Now we just create a normal resource, but we call a very different
@@ -44,7 +42,7 @@ class Puppet::Parser::AST
# Now we tell the scope that it's an override, and it behaves as
# necessary.
- scope.compile.store_override(obj)
+ scope.compiler.add_override(obj)
obj
end
diff --git a/lib/puppet/parser/ast/resource_reference.rb b/lib/puppet/parser/ast/resource_reference.rb
index b06ea17..4bb4116 100644
--- a/lib/puppet/parser/ast/resource_reference.rb
+++ b/lib/puppet/parser/ast/resource_reference.rb
@@ -22,10 +22,8 @@ class Puppet::Parser::AST
# Evaluate our object, but just return a simple array of the type
# and name.
- def evaluate(hash)
- scope = hash[:scope]
-
- title = @title.safeevaluate(:scope => scope)
+ def evaluate(scope)
+ title = @title.safeevaluate(scope)
if @type.to_s.downcase == "class"
objtype = "class"
title = qualified_class(scope, title)
diff --git a/lib/puppet/parser/ast/resourceparam.rb b/lib/puppet/parser/ast/resourceparam.rb
index 8b1e7b3..c552a7e 100644
--- a/lib/puppet/parser/ast/resourceparam.rb
+++ b/lib/puppet/parser/ast/resourceparam.rb
@@ -10,12 +10,10 @@ class Puppet::Parser::AST
end
# Return the parameter and the value.
- def evaluate(hash)
- scope = hash[:scope]
-
+ def evaluate(scope)
return Puppet::Parser::Resource::Param.new(
:name => @param,
- :value => @value.safeevaluate(:scope => scope),
+ :value => @value.safeevaluate(scope),
:source => scope.source, :line => self.line, :file => self.file,
:add => self.add
)
diff --git a/lib/puppet/parser/ast/selector.rb b/lib/puppet/parser/ast/selector.rb
index d363ab7..399d405 100644
--- a/lib/puppet/parser/ast/selector.rb
+++ b/lib/puppet/parser/ast/selector.rb
@@ -11,13 +11,12 @@ class Puppet::Parser::AST
end
# Find the value that corresponds with the test.
- def evaluate(hash)
- scope = hash[:scope]
+ def evaluate(scope)
retvalue = nil
found = nil
# Get our parameter.
- paramvalue = @param.safeevaluate(:scope => scope)
+ paramvalue = @param.safeevaluate(scope)
sensitive = Puppet[:casesensitive]
@@ -33,13 +32,13 @@ class Puppet::Parser::AST
# Then look for a match in the options.
@values.each { |obj|
- param = obj.param.safeevaluate(:scope => scope)
+ param = obj.param.safeevaluate(scope)
if ! sensitive && param.respond_to?(:downcase)
param = param.downcase
end
if param == paramvalue
# we found a matching option
- retvalue = obj.value.safeevaluate(:scope => scope)
+ retvalue = obj.value.safeevaluate(scope)
found = true
break
elsif obj.param.is_a?(Default)
@@ -51,7 +50,7 @@ class Puppet::Parser::AST
# Unless we found something, look for the default.
unless found
if default
- retvalue = default.value.safeevaluate(:scope => scope)
+ retvalue = default.value.safeevaluate(scope)
else
self.fail Puppet::ParseError,
"No matching value for selector param '%s'" % paramvalue
diff --git a/lib/puppet/parser/ast/tag.rb b/lib/puppet/parser/ast/tag.rb
index e2882d2..2909504 100644
--- a/lib/puppet/parser/ast/tag.rb
+++ b/lib/puppet/parser/ast/tag.rb
@@ -8,10 +8,8 @@ class Puppet::Parser::AST
@name = :class
attr_accessor :type
- def evaluate(hash)
- scope = hash[:scope]
-
- types = @type.safeevaluate(:scope => scope)
+ def evaluate(scope)
+ types = @type.safeevaluate(scope)
types = [types] unless types.is_a? Array
diff --git a/lib/puppet/parser/ast/vardef.rb b/lib/puppet/parser/ast/vardef.rb
index 1e7f874..ee79159 100644
--- a/lib/puppet/parser/ast/vardef.rb
+++ b/lib/puppet/parser/ast/vardef.rb
@@ -9,10 +9,9 @@ class Puppet::Parser::AST
# Look up our name and value, and store them appropriately. The
# lexer strips off the syntax stuff like '$'.
- def evaluate(hash)
- scope = hash[:scope]
- name = @name.safeevaluate(:scope => scope)
- value = @value.safeevaluate(:scope => scope)
+ def evaluate(scope)
+ name = @name.safeevaluate(scope)
+ value = @value.safeevaluate(scope)
parsewrap do
scope.setvar(name,value, @file, @line)
diff --git a/lib/puppet/parser/collector.rb b/lib/puppet/parser/collector.rb
index b8165a8..2699dc6 100644
--- a/lib/puppet/parser/collector.rb
+++ b/lib/puppet/parser/collector.rb
@@ -51,7 +51,7 @@ class Puppet::Parser::Collector
search = "(exported=? AND restype=?)"
values = [true, @type]
- search += " AND (?)" and values << @equery if @equery
+ search += " AND (%s)" % @equery if @equery
# We're going to collect objects from rails, but we don't want any
# objects from this host.
@@ -118,20 +118,20 @@ class Puppet::Parser::Collector
# If there are no more resources to find, delete this from the list
# of collections.
if @resources.empty?
- @scope.compile.delete_collection(self)
+ @scope.compiler.delete_collection(self)
end
return result
end
- # Collect just virtual objects, from our local compile.
+ # Collect just virtual objects, from our local compiler.
def collect_virtual(exported = false)
if exported
method = :exported?
else
method = :virtual?
end
- scope.compile.resources.find_all do |resource|
+ scope.compiler.resources.find_all do |resource|
resource.type == @type and resource.send(method) and match?(resource)
end
end
@@ -150,7 +150,7 @@ class Puppet::Parser::Collector
resource.exported = false
- scope.compile.store_resource(scope, resource)
+ scope.compiler.add_resource(scope, resource)
return resource
end
diff --git a/lib/puppet/parser/compile.rb b/lib/puppet/parser/compiler.rb
similarity index 79%
rename from lib/puppet/parser/compile.rb
rename to lib/puppet/parser/compiler.rb
index fdd0cbc..8fba411 100644
--- a/lib/puppet/parser/compile.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -1,17 +1,13 @@
# Created by Luke A. Kanies on 2007-08-13.
# Copyright (c) 2007. All rights reserved.
-require 'puppet/external/gratr/digraph'
-require 'puppet/external/gratr/import'
-require 'puppet/external/gratr/dot'
-
require 'puppet/node'
require 'puppet/node/catalog'
require 'puppet/util/errors'
# Maintain a graph of scopes, along with a bunch of data
# about the individual catalog we're compiling.
-class Puppet::Parser::Compile
+class Puppet::Parser::Compiler
include Puppet::Util
include Puppet::Util::Errors
attr_reader :parser, :node, :facts, :collections, :catalog, :node_scope
@@ -21,6 +17,29 @@ class Puppet::Parser::Compile
@collections << coll
end
+ # Store a resource override.
+ def add_override(override)
+ # If possible, merge the override in immediately.
+ if resource = @catalog.resource(override.ref)
+ resource.merge(override)
+ else
+ # Otherwise, store the override for later; these
+ # get evaluated in Resource#finish.
+ @resource_overrides[override.ref] << override
+ end
+ end
+
+ # Store a resource in our resource table.
+ def add_resource(scope, resource)
+ # Note that this will fail if the resource is not unique.
+ @catalog.add_resource(resource)
+
+ # And in the resource graph. At some point, this might supercede
+ # the global resource table, but the table is a lot faster
+ # so it makes sense to maintain for now.
+ @catalog.add_edge(scope.resource, resource)
+ end
+
# Do we use nodes found in the code, vs. the external node sources?
def ast_nodes?
parser.nodes.length > 0
@@ -30,10 +49,10 @@ class Puppet::Parser::Compile
# the scope in which it was evaluated, so that we can look it up later.
def class_set(name, scope)
if existing = @class_scopes[name]
- if existing.nodescope? or scope.nodescope?
+ if existing.nodescope? != scope.nodescope?
raise Puppet::ParseError, "Cannot have classes, nodes, or definitions with the same name"
else
- raise Puppet::DevError, "Somehow evaluated the same class twice"
+ raise Puppet::DevError, "Somehow evaluated %s %s twice" % [ existing.nodescope? ? "node" : "class", name]
end
end
@class_scopes[name] = scope
@@ -58,7 +77,7 @@ class Puppet::Parser::Compile
return @catalog.classes
end
- # Compile our catalog. This mostly revolves around finding and evaluating classes.
+ # Compiler our catalog. This mostly revolves around finding and evaluating classes.
# This is the main entry into our catalog.
def compile
# Set the client's parameters into the top scope.
@@ -72,10 +91,10 @@ class Puppet::Parser::Compile
evaluate_generators()
- fail_on_unevaluated()
-
finish()
+ fail_on_unevaluated()
+
if Puppet[:storeconfigs]
store()
end
@@ -88,11 +107,6 @@ class Puppet::Parser::Compile
@collections.delete(coll) if @collections.include?(coll)
end
- # LAK:FIXME There are no tests for this.
- def delete_resource(resource)
- @resource_table.delete(resource.ref) if @resource_table.include?(resource.ref)
- end
-
# Return the node's environment.
def environment
unless defined? @environment
@@ -122,15 +136,13 @@ class Puppet::Parser::Compile
classes.each do |name|
# If we can find the class, then make a resource that will evaluate it.
if klass = scope.findclass(name)
- # Create a resource to model this class, and then add it to the list
- # of resources.
- resource = Puppet::Parser::Resource.new(:type => "class", :title => klass.classname, :scope => scope, :source => scope.source)
- store_resource(scope, resource)
+ found << name and next if class_scope(klass)
+
+ resource = klass.evaluate(scope)
# If they've disabled lazy evaluation (which the :include function does),
# then evaluate our resource immediately.
resource.evaluate unless lazy_evaluate
- @catalog.tag(klass.classname)
found << name
else
Puppet.info "Could not find class %s for %s" % [name, node.name]
@@ -141,10 +153,8 @@ class Puppet::Parser::Compile
end
# Return a resource by either its ref or its type and title.
- def findresource(string, name = nil)
- string = "%s[%s]" % [string.capitalize, name] if name
-
- @resource_table[string]
+ def findresource(*args)
+ @catalog.resource(*args)
end
# Set up our compile. We require a parser
@@ -159,7 +169,7 @@ class Puppet::Parser::Compile
begin
send(param.to_s + "=", value)
rescue NoMethodError
- raise ArgumentError, "Compile objects do not accept %s" % param
+ raise ArgumentError, "Compiler objects do not accept %s" % param
end
end
@@ -172,10 +182,10 @@ class Puppet::Parser::Compile
# its parent to the graph.
def newscope(parent, options = {})
parent ||= topscope
- options[:compile] = self
+ options[:compiler] = self
options[:parser] ||= self.parser
scope = Puppet::Parser::Scope.new(options)
- @scope_graph.add_edge!(parent, scope)
+ @scope_graph.add_edge(parent, scope)
scope
end
@@ -196,35 +206,7 @@ class Puppet::Parser::Compile
# Return a list of all resources.
def resources
- @resource_table.values
- end
-
- # Store a resource override.
- def store_override(override)
- override.override = true
-
- # If possible, merge the override in immediately.
- if resource = @resource_table[override.ref]
- resource.merge(override)
- else
- # Otherwise, store the override for later; these
- # get evaluated in Resource#finish.
- @resource_overrides[override.ref] << override
- end
- end
-
- # Store a resource in our resource table.
- def store_resource(scope, resource)
- # This might throw an exception
- verify_uniqueness(resource)
-
- # Store it in the global table.
- @resource_table[resource.ref] = resource
-
- # And in the resource graph. At some point, this might supercede
- # the global resource table, but the table is a lot faster
- # so it makes sense to maintain for now.
- @catalog.add_edge!(scope.resource, resource)
+ @catalog.vertices
end
# The top scope is usually the top-level scope, but if we're using AST nodes,
@@ -251,9 +233,7 @@ class Puppet::Parser::Compile
# Create a resource to model this node, and then add it to the list
# of resources.
- resource = Puppet::Parser::Resource.new(:type => "node", :title => astnode.classname, :scope => topscope, :source => topscope.source)
- store_resource(topscope, resource)
- @catalog.tag(astnode.classname)
+ resource = astnode.evaluate(topscope)
resource.evaluate
@@ -286,11 +266,15 @@ class Puppet::Parser::Compile
def evaluate_definitions
exceptwrap do
if ary = unevaluated_resources
+ evaluated = false
ary.each do |resource|
- resource.evaluate
+ if not resource.virtual?
+ resource.evaluate
+ evaluated = true
+ end
end
# If we evaluated, let the loop know.
- return true
+ return evaluated
else
return false
end
@@ -310,6 +294,9 @@ class Puppet::Parser::Compile
done = false if evaluate_collections
done = false if evaluate_definitions
break if done
+
+ count += 1
+
if count > 1000
raise Puppet::ParseError, "Somehow looped more than 1000 times while evaluating host catalog"
end
@@ -323,9 +310,7 @@ class Puppet::Parser::Compile
@main_resource = Puppet::Parser::Resource.new(:type => "class", :title => :main, :scope => @topscope, :source => @main)
@topscope.resource = @main_resource
- @catalog.add_vertex!(@main_resource)
-
- @resource_table["Class[main]"] = @main_resource
+ @catalog.add_resource(@main_resource)
@main_resource.evaluate
end
@@ -381,14 +366,27 @@ class Puppet::Parser::Compile
# Make sure all of our resources and such have done any last work
# necessary.
def finish
- @resource_table.each { |name, resource| resource.finish if resource.respond_to?(:finish) }
+ @catalog.vertices.each do |resource|
+ # Add in any resource overrides.
+ if overrides = resource_overrides(resource)
+ overrides.each do |over|
+ resource.merge(over)
+ end
+
+ # Remove the overrides, so that the configuration knows there
+ # are none left.
+ overrides.clear
+ end
+
+ resource.finish if resource.respond_to?(:finish)
+ end
end
# Initialize the top-level scope, class, and resource.
def init_main
# Create our initial scope and a resource that will evaluate main.
- @topscope = Puppet::Parser::Scope.new(:compile => self, :parser => self.parser)
- @scope_graph.add_vertex!(@topscope)
+ @topscope = Puppet::Parser::Scope.new(:compiler => self, :parser => self.parser)
+ @scope_graph.add_vertex(@topscope)
end
# Set up all of our internal variables.
@@ -397,9 +395,6 @@ class Puppet::Parser::Compile
# be used by top scopes and node scopes.
@class_scopes = {}
- # The table for all defined resources.
- @resource_table = {}
-
# The list of objects that will available for export.
@exported_resources = {}
@@ -413,11 +408,8 @@ class Puppet::Parser::Compile
# but they each refer back to the scope that created them.
@collections = []
- # A list of tags we've generated; most class names.
- @tags = []
-
# A graph for maintaining scope relationships.
- @scope_graph = GRATR::Digraph.new
+ @scope_graph = Puppet::SimpleGraph.new
# For maintaining the relationship between scopes and their resources.
@catalog = Puppet::Node::Catalog.new(@node.name)
@@ -444,7 +436,7 @@ class Puppet::Parser::Compile
# We used to have hooks here for forking and saving, but I don't
# think it's worth retaining at this point.
- store_to_active_record(@node, @resource_table.values)
+ store_to_active_record(@node, @catalog.vertices)
end
# Do the actual storage.
@@ -467,9 +459,7 @@ class Puppet::Parser::Compile
# Return an array of all of the unevaluated resources. These will be definitions,
# which need to get evaluated into native resources.
def unevaluated_resources
- ary = @resource_table.find_all do |name, object|
- ! object.builtin? and ! object.evaluated?
- end.collect { |name, object| object }
+ ary = @catalog.vertices.reject { |resource| resource.builtin? or resource.evaluated? }
if ary.empty?
return nil
@@ -477,33 +467,4 @@ class Puppet::Parser::Compile
return ary
end
end
-
- # Verify that the given resource isn't defined elsewhere.
- def verify_uniqueness(resource)
- # Short-curcuit the common case,
- unless existing_resource = @resource_table[resource.ref]
- return true
- end
-
- if typeclass = Puppet::Type.type(resource.type) and ! typeclass.isomorphic?
- Puppet.info "Allowing duplicate %s" % typeclass.name
- return true
- end
-
- # Either it's a defined type, which are never
- # isomorphic, or it's a non-isomorphic type, so
- # we should throw an exception.
- msg = "Duplicate definition: %s is already defined" % resource.ref
-
- if existing_resource.file and existing_resource.line
- msg << " in file %s at line %s" %
- [existing_resource.file, existing_resource.line]
- end
-
- if resource.line or resource.file
- msg << "; cannot redefine"
- end
-
- raise Puppet::ParseError.new(msg)
- end
end
diff --git a/lib/puppet/parser/functions.rb b/lib/puppet/parser/functions.rb
index 34b38b8..e0b60e1 100644
--- a/lib/puppet/parser/functions.rb
+++ b/lib/puppet/parser/functions.rb
@@ -111,7 +111,7 @@ module Functions
vals = [vals] unless vals.is_a?(Array)
# The 'false' disables lazy evaluation.
- klasses = compile.evaluate_classes(vals, self, false)
+ klasses = compiler.evaluate_classes(vals, self, false)
missing = vals.find_all do |klass|
! klasses.include?(klass)
@@ -146,7 +146,7 @@ module Functions
tells you whether the current container is tagged with the specified tags.
The tags are ANDed, so that all of the specified tags must be included for
the function to return true.") do |vals|
- configtags = compile.catalog.tags
+ configtags = compiler.catalog.tags
resourcetags = resource.tags
retval = true
@@ -235,7 +235,7 @@ module Functions
vals = [vals] unless vals.is_a?(Array)
coll.resources = vals
- compile.add_collection(coll)
+ compiler.add_collection(coll)
end
newfunction(:search, :doc => "Add another namespace for this class to search.
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
new file mode 100644
index 0000000..484efe8
--- /dev/null
+++ b/lib/puppet/parser/grammar.ra
@@ -0,0 +1,648 @@
+# vim: syntax=ruby
+
+# the parser
+
+class Puppet::Parser::Parser
+
+token LBRACK DQTEXT SQTEXT RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE
+token FALSE EQUALS LESSEQUAL NOTEQUAL DOT COLON LLCOLLECT RRCOLLECT
+token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN
+token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN
+token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSNAME CLASSREF
+token NOT OR AND UNDEF PARROW
+
+rule
+program: statements {
+ if val[0]
+ # Make sure we always return an array.
+ if val[0].is_a?(AST::ASTArray)
+ if val[0].children.empty?
+ result = nil
+ else
+ result = val[0]
+ end
+ else
+ result = aryfy(val[0])
+ end
+ else
+ result = nil
+ end
+}
+ | nil
+
+statements: statement
+ | statements statement {
+ if val[0] and val[1]
+ if val[0].instance_of?(AST::ASTArray)
+ val[0].push(val[1])
+ result = val[0]
+ else
+ result = ast AST::ASTArray, :children => [val[0],val[1]]
+ end
+ elsif obj = (val[0] || val[1])
+ result = obj
+ else result = nil
+ end
+}
+
+# The main list of valid statements
+statement: resource
+ | virtualresource
+ | collection
+ | assignment
+ | casestatement
+ | ifstatement
+ | import
+ | fstatement
+ | definition
+ | hostclass
+ | nodedef
+ | resourceoverride
+
+fstatement: NAME LPAREN funcvalues RPAREN {
+ args = aryfy(val[2])
+ result = ast AST::Function,
+ :name => val[0],
+ :arguments => args,
+ :ftype => :statement
+}
+ | NAME LPAREN RPAREN {
+ result = ast AST::Function,
+ :name => val[0],
+ :arguments => AST::ASTArray.new({}),
+ :ftype => :statement
+}
+ | NAME funcvalues {
+ args = aryfy(val[1])
+ result = ast AST::Function,
+ :name => val[0],
+ :arguments => args,
+ :ftype => :statement
+}
+
+funcvalues: namestrings
+ | resourcerefs
+
+namestrings: namestring
+ | namestrings COMMA namestring {
+ result = aryfy(val[0], val[2])
+ result.line = @lexer.line
+ result.file = @lexer.file
+}
+
+# This is *almost* an rvalue, but I couldn't get a full
+# rvalue to work without scads of shift/reduce conflicts.
+namestring: name
+ | variable
+ | type
+ | boolean
+ | funcrvalue
+ | selector
+ | quotedtext
+ | CLASSNAME {
+ result = ast AST::Name, :value => val[0]
+ }
+
+resourcerefs: resourceref
+ | resourcerefs COMMA resourceref {
+ unless val[0].is_a?(AST::ASTArray)
+ val[0] = aryfy(val[0])
+ end
+
+ val[0].push(val[2])
+
+ result = val[0]
+}
+
+resource: classname LBRACE resourceinstances endsemi RBRACE {
+ array = val[2]
+ if array.instance_of?(AST::ResourceInstance)
+ array = [array]
+ end
+ result = ast AST::ASTArray
+
+ # this iterates across each specified resourceinstance
+ array.each { |instance|
+ unless instance.instance_of?(AST::ResourceInstance)
+ raise Puppet::Dev, "Got something that isn't an instance"
+ end
+ # now, i need to somehow differentiate between those things with
+ # arrays in their names, and normal things
+ result.push ast(AST::Resource,
+ :type => val[0],
+ :title => instance[0],
+ :params => instance[1])
+ }
+} | classname LBRACE params endcomma RBRACE {
+ # This is a deprecated syntax.
+ error "All resource specifications require names"
+} | classref LBRACE params endcomma RBRACE {
+ # a defaults setting for a type
+ result = ast(AST::ResourceDefaults, :type => val[0], :params => val[2])
+}
+
+# Override a value set elsewhere in the configuration.
+resourceoverride: resourceref LBRACE anyparams endcomma RBRACE {
+ result = ast AST::ResourceOverride, :object => val[0], :params => val[2]
+}
+
+# Exported and virtual resources; these don't get sent to the client
+# unless they get collected elsewhere in the db.
+virtualresource: at resource {
+ type = val[0]
+
+ if (type == :exported and ! Puppet[:storeconfigs]) and ! Puppet[:parseonly]
+ error "You cannot collect without storeconfigs being set"
+ end
+
+ if val[1].is_a? AST::ResourceDefaults
+ error "Defaults are not virtualizable"
+ end
+
+ method = type.to_s + "="
+
+ # Just mark our resources as exported and pass them through.
+ if val[1].instance_of?(AST::ASTArray)
+ val[1].each do |obj|
+ obj.send(method, true)
+ end
+ else
+ val[1].send(method, true)
+ end
+
+ result = val[1]
+}
+
+at: AT { result = :virtual }
+ | AT AT { result = :exported }
+
+# A collection statement. Currently supports no arguments at all, but eventually
+# will, I assume.
+collection: classref collectrhand {
+ if val[0] =~ /^[a-z]/
+ Puppet.warning addcontext("Collection names must now be capitalized")
+ end
+ type = val[0].downcase
+ args = {:type => type}
+
+ if val[1].is_a?(AST::CollExpr)
+ args[:query] = val[1]
+ args[:query].type = type
+ args[:form] = args[:query].form
+ else
+ args[:form] = val[1]
+ end
+ if args[:form] == :exported and ! Puppet[:storeconfigs] and ! Puppet[:parseonly]
+ error "You cannot collect exported resources without storeconfigs being set"
+ end
+ result = ast AST::Collection, args
+}
+
+
+collectrhand: LCOLLECT collstatements RCOLLECT {
+ if val[1]
+ result = val[1]
+ result.form = :virtual
+ else
+ result = :virtual
+ end
+}
+ | LLCOLLECT collstatements RRCOLLECT {
+ if val[1]
+ result = val[1]
+ result.form = :exported
+ else
+ result = :exported
+ end
+}
+
+# A mini-language for handling collection comparisons. This is organized
+# to avoid the need for precedence indications.
+collstatements: nil
+ | collstatement
+ | collstatements colljoin collstatement {
+ result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+}
+
+collstatement: collexpr
+ | LPAREN collstatements RPAREN {
+ result = val[1]
+ result.parens = true
+}
+
+colljoin: AND | OR
+
+collexpr: colllval ISEQUAL simplervalue {
+ result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+ #result = ast AST::CollExpr
+ #result.push *val
+}
+ | colllval NOTEQUAL simplervalue {
+ result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+ #result = ast AST::CollExpr
+ #result.push *val
+}
+
+colllval: variable
+ | name
+
+resourceinst: resourcename COLON params endcomma {
+ result = ast AST::ResourceInstance, :children => [val[0],val[2]]
+}
+
+resourceinstances: resourceinst
+ | resourceinstances SEMIC resourceinst {
+ if val[0].instance_of?(AST::ResourceInstance)
+ result = ast AST::ASTArray, :children => [val[0],val[2]]
+ else
+ val[0].push val[2]
+ result = val[0]
+ end
+}
+
+endsemi: # nothing
+ | SEMIC
+
+undef: UNDEF {
+ result = ast AST::Undef, :value => :undef
+}
+
+name: NAME {
+ result = ast AST::Name, :value => val[0]
+}
+
+type: CLASSREF {
+ result = ast AST::Type, :value => val[0]
+}
+
+resourcename: quotedtext
+ | name
+ | type
+ | selector
+ | variable
+ | array
+
+assignment: VARIABLE EQUALS rvalue {
+ if val[0] =~ /::/
+ raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
+ end
+ # this is distinct from referencing a variable
+ variable = ast AST::Name, :value => val[0]
+ result = ast AST::VarDef, :name => variable, :value => val[2]
+}
+
+params: # nothing
+{
+ result = ast AST::ASTArray
+}
+ | param { result = val[0] }
+ | params COMMA param {
+ if val[0].instance_of?(AST::ASTArray)
+ val[0].push(val[2])
+ result = val[0]
+ else
+ result = ast AST::ASTArray, :children => [val[0],val[2]]
+ end
+}
+
+param: NAME FARROW rvalue {
+ result = ast AST::ResourceParam, :param => val[0], :value => val[2]
+}
+
+addparam: NAME PARROW rvalue {
+ result = ast AST::ResourceParam, :param => val[0], :value => val[2],
+ :add => true
+}
+
+anyparam: param
+ | addparam
+
+anyparams: # nothing
+{
+ result = ast AST::ASTArray
+}
+ | anyparam { result = val[0] }
+ | anyparams COMMA anyparam {
+ if val[0].instance_of?(AST::ASTArray)
+ val[0].push(val[2])
+ result = val[0]
+ else
+ result = ast AST::ASTArray, :children => [val[0],val[2]]
+ end
+}
+
+rvalues: rvalue
+ | rvalues comma rvalue {
+ if val[0].instance_of?(AST::ASTArray)
+ result = val[0].push(val[2])
+ else
+ result = ast AST::ASTArray, :children => [val[0],val[2]]
+ end
+}
+
+simplervalue: quotedtext
+ | name
+ | type
+ | boolean
+ | selector
+ | variable
+
+rvalue: quotedtext
+ | name
+ | type
+ | boolean
+ | selector
+ | variable
+ | array
+ | resourceref
+ | funcrvalue
+ | undef
+
+# We currently require arguments in these functions.
+funcrvalue: NAME LPAREN funcvalues RPAREN {
+ args = aryfy(val[2])
+ result = ast AST::Function,
+ :name => val[0],
+ :arguments => args,
+ :ftype => :rvalue
+} | NAME LPAREN RPAREN {
+ result = ast AST::Function,
+ :name => val[0],
+ :arguments => AST::ASTArray.new({}),
+ :ftype => :rvalue
+}
+
+quotedtext: DQTEXT {
+ result = ast AST::String, :value => val[0]
+} | SQTEXT {
+ result = ast AST::FlatString, :value => val[0]
+}
+
+boolean: BOOLEAN {
+ result = ast AST::Boolean, :value => val[0]
+}
+
+resourceref: NAME LBRACK rvalue RBRACK {
+ Puppet.warning addcontext("Deprecation notice: Resource references should now be capitalized")
+ result = ast AST::ResourceReference, :type => val[0], :title => val[2]
+} | classref LBRACK rvalue RBRACK {
+ result = ast AST::ResourceReference, :type => val[0], :title => val[2]
+}
+
+ifstatement: IF iftest LBRACE statements RBRACE else {
+ args = {
+ :test => val[1],
+ :statements => val[3]
+ }
+
+ if val[5]
+ args[:else] = val[5]
+ end
+
+ result = ast AST::IfStatement, args
+}
+
+else: # nothing
+ | ELSE LBRACE statements RBRACE {
+ result = ast AST::Else, :statements => val[2]
+}
+
+# Currently we only support a single value, but eventually one assumes
+# we'll support operators and such.
+iftest: rvalue
+
+casestatement: CASE rvalue LBRACE caseopts RBRACE {
+ options = val[3]
+ unless options.instance_of?(AST::ASTArray)
+ options = ast AST::ASTArray, :children => [val[3]]
+ end
+ result = ast AST::CaseStatement, :test => val[1], :options => options
+}
+
+caseopts: caseopt
+ | caseopts caseopt {
+ if val[0].instance_of?(AST::ASTArray)
+ val[0].push val[1]
+ result = val[0]
+ else
+ result = ast AST::ASTArray, :children => [val[0], val[1]]
+ end
+}
+
+caseopt: casevalues COLON LBRACE statements RBRACE {
+ result = ast AST::CaseOpt, :value => val[0], :statements => val[3]
+} | casevalues COLON LBRACE RBRACE {
+ result = ast(AST::CaseOpt,
+ :value => val[0],
+ :statements => ast(AST::ASTArray)
+ )
+}
+
+casevalues: selectlhand
+ | casevalues COMMA selectlhand {
+ if val[0].instance_of?(AST::ASTArray)
+ val[0].push(val[2])
+ result = val[0]
+ else
+ result = ast AST::ASTArray, :children => [val[0],val[2]]
+ end
+}
+
+selector: selectlhand QMARK svalues {
+ result = ast AST::Selector, :param => val[0], :values => val[2]
+}
+
+svalues: selectval
+ | LBRACE sintvalues endcomma RBRACE { result = val[1] }
+
+sintvalues: selectval
+ | sintvalues comma selectval {
+ if val[0].instance_of?(AST::ASTArray)
+ val[0].push(val[2])
+ result = val[0]
+ else
+ result = ast AST::ASTArray, :children => [val[0],val[2]]
+ end
+}
+
+selectval: selectlhand FARROW rvalue {
+ result = ast AST::ResourceParam, :param => val[0], :value => val[2]
+}
+
+selectlhand: name
+ | type
+ | quotedtext
+ | variable
+ | funcrvalue
+ | boolean
+ | undef
+ | DEFAULT {
+ result = ast AST::Default, :value => val[0]
+}
+
+# These are only used for importing, and we don't interpolate there.
+qtexts: quotedtext { result = [val[0].value] }
+ | qtexts COMMA quotedtext {
+ results = val[0] << val[2].value
+}
+
+import: IMPORT qtexts {
+ val[1].each do |file|
+ import(file)
+ end
+
+ result = AST::ASTArray.new(:children => [])
+}
+
+# Disable definition inheritance for now. 8/27/06, luke
+#definition: DEFINE NAME argumentlist parent LBRACE statements RBRACE {
+definition: DEFINE classname argumentlist LBRACE statements RBRACE {
+ newdefine classname(val[1]), :arguments => val[2], :code => val[4]
+ @lexer.indefine = false
+ result = nil
+
+#} | DEFINE NAME argumentlist parent LBRACE RBRACE {
+} | DEFINE classname argumentlist LBRACE RBRACE {
+ newdefine classname(val[1]), :arguments => val[2]
+ @lexer.indefine = false
+ result = nil
+}
+
+#hostclass: CLASS NAME argumentlist parent LBRACE statements RBRACE {
+hostclass: CLASS classname classparent LBRACE statements RBRACE {
+ # Our class gets defined in the parent namespace, not our own.
+ @lexer.namepop
+ newclass classname(val[1]), :code => val[4], :parent => val[2]
+ result = nil
+} | CLASS classname classparent LBRACE RBRACE {
+ # Our class gets defined in the parent namespace, not our own.
+ @lexer.namepop
+ newclass classname(val[1]), :parent => val[2]
+ result = nil
+}
+
+nodedef: NODE hostnames nodeparent LBRACE statements RBRACE {
+ newnode val[1], :parent => val[2], :code => val[4]
+ result = nil
+} | NODE hostnames nodeparent LBRACE RBRACE {
+ newnode val[1], :parent => val[2]
+ result = nil
+}
+
+classref: CLASSREF
+
+classname: NAME
+ | CLASSNAME
+
+# Multiple hostnames, as used for node names. These are all literal
+# strings, not AST objects.
+hostnames: hostname
+ | hostnames COMMA hostname {
+ result = val[0]
+ result = [result] unless result.is_a?(Array)
+ result << val[2]
+}
+
+hostname: NAME
+ | SQTEXT
+ | DQTEXT
+ | DEFAULT
+
+nil: {
+ result = nil
+}
+
+nothing: {
+ result = ast AST::ASTArray, :children => []
+}
+
+argumentlist: nil
+ | LPAREN nothing RPAREN {
+ result = nil
+}
+ | LPAREN arguments RPAREN {
+ result = val[1]
+ result = [result] unless result[0].is_a?(Array)
+}
+
+arguments: argument
+ | arguments COMMA argument {
+ result = val[0]
+ result = [result] unless result[0].is_a?(Array)
+ result << val[2]
+}
+
+argument: NAME EQUALS rvalue {
+ Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
+ result = [val[0], val[2]]
+}
+ | NAME {
+ Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
+ result = [val[0]]
+} | VARIABLE EQUALS rvalue {
+ result = [val[0], val[2]]
+} | VARIABLE {
+ result = [val[0]]
+}
+
+nodeparent: nil
+ | INHERITS hostname {
+ result = val[1]
+}
+
+classparent: nil
+ | INHERITS classnameordefault {
+ result = val[1]
+}
+
+classnameordefault: classname | DEFAULT
+
+variable: VARIABLE {
+ result = ast AST::Variable, :value => val[0]
+}
+
+array: LBRACK rvalues RBRACK {
+ if val[1].instance_of?(AST::ASTArray)
+ result = val[1]
+ else
+ result = ast AST::ASTArray, :children => [val[1]]
+ end
+} | LBRACK RBRACK {
+ result = ast AST::ASTArray
+}
+
+comma: FARROW
+ | COMMA
+
+endcomma: # nothing
+ | COMMA { result = nil }
+
+end
+---- header ----
+require 'puppet'
+require 'puppet/util/loadedfile'
+require 'puppet/parser/lexer'
+require 'puppet/parser/ast'
+#require 'puppet/parser/interpreter'
+
+module Puppet
+ class ParseError < Puppet::Error; end
+ class ImportError < Racc::ParseError; end
+ class AlreadyImportedError < ImportError; end
+end
+
+Puppet[:typecheck] = true
+Puppet[:paramcheck] = true
+
+---- inner ----
+
+# It got too annoying having code in a file that needs to be compiled.
+require 'puppet/parser/parser_support'
+
+# Make emacs happy
+# Local Variables:
+# mode: ruby
+# End:
+
+# $Id$
+
diff --git a/lib/puppet/parser/interpreter.rb b/lib/puppet/parser/interpreter.rb
index e29e199..f27c1c5 100644
--- a/lib/puppet/parser/interpreter.rb
+++ b/lib/puppet/parser/interpreter.rb
@@ -3,7 +3,7 @@ require 'timeout'
require 'puppet/rails'
require 'puppet/util/methodhelper'
require 'puppet/parser/parser'
-require 'puppet/parser/compile'
+require 'puppet/parser/compiler'
require 'puppet/parser/scope'
# The interpreter is a very simple entry-point class that
@@ -24,8 +24,13 @@ class Puppet::Parser::Interpreter
# evaluate our whole tree
def compile(node)
- raise Puppet::ParseError, "Could not parse configuration; cannot compile" unless env_parser = parser(node.environment)
- return Puppet::Parser::Compile.new(node, env_parser).compile
+ raise Puppet::ParseError, "Could not parse configuration; cannot compile on node %s" % node.name unless env_parser = parser(node.environment)
+ begin
+ return Puppet::Parser::Compiler.new(node, env_parser).compile
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ raise Puppet::Error, detail.to_s + " on node %s" % node.name
+ end
end
# create our interpreter
@@ -42,6 +47,30 @@ class Puppet::Parser::Interpreter
@parsers = {}
end
+ # Return the parser for a specific environment.
+ def parser(environment)
+ if ! @parsers[environment] or @parsers[environment].reparse?
+ # This will throw an exception if it does not succeed. We only
+ # want to get rid of the old parser if we successfully create a new
+ # one.
+ begin
+ tmp = create_parser(environment)
+ @parsers[environment].clear if @parsers[environment]
+ @parsers[environment] = tmp
+ rescue => detail
+ # If a parser already exists, than assume that we logged the
+ # exception elsewhere and reuse the parser. If one doesn't
+ # exist, then reraise.
+ if @parsers[environment]
+ Puppet.err detail
+ else
+ raise detail
+ end
+ end
+ end
+ @parsers[environment]
+ end
+
private
# Create a new parser object and pre-parse the configuration.
@@ -67,24 +96,4 @@ class Puppet::Parser::Interpreter
raise error
end
end
-
- # Return the parser for a specific environment.
- def parser(environment)
- if ! @parsers[environment] or @parsers[environment].reparse?
- # This will throw an exception if it does not succeed. We only
- # want to get rid of the old parser if we successfully create a new
- # one.
- begin
- tmp = create_parser(environment)
- @parsers[environment].clear if @parsers[environment]
- @parsers[environment] = tmp
- rescue => detail
- # If a parser already exists, than assume that we logged the
- # exception elsewhere and reuse the parser. If one doesn't
- # exist, then reraise.
- raise detail unless @parsers[environment]
- end
- end
- @parsers[environment]
- end
end
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index 086d82c..51026ea 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -1,4 +1,3 @@
-
# the scanner/lexer
require 'strscan'
@@ -7,326 +6,436 @@ require 'puppet'
module Puppet
class LexError < RuntimeError; end
- module Parser
- #---------------------------------------------------------------
- class Lexer
- attr_reader :line, :last, :file
-
- attr_accessor :indefine
-
- #%r{\w+} => :WORD,
- @@tokens = {
- %r{#.*} => :COMMENT,
- %r{\[} => :LBRACK,
- %r{\]} => :RBRACK,
- %r{\{} => :LBRACE,
- %r{\}} => :RBRACE,
- %r{\(} => :LPAREN,
- %r{\)} => :RPAREN,
- %r{\"} => :DQUOTE,
- %r{\n} => :RETURN,
- %r{\'} => :SQUOTE,
- %r{=} => :EQUALS,
- %r{==} => :ISEQUAL,
- %r{>=} => :GREATEREQUAL,
- %r{>} => :GREATERTHAN,
- %r{<} => :LESSTHAN,
- %r{<=} => :LESSEQUAL,
- %r{!=} => :NOTEQUAL,
- %r{!} => :NOT,
- %r{,} => :COMMA,
- %r{\.} => :DOT,
- %r{:} => :COLON,
- %r{@} => :AT,
- %r{<<\|} => :LLCOLLECT,
- %r{\|>>} => :RRCOLLECT,
- %r{<\|} => :LCOLLECT,
- %r{\|>} => :RCOLLECT,
- %r{;} => :SEMIC,
- %r{\?} => :QMARK,
- %r{\\} => :BACKSLASH,
- %r{=>} => :FARROW,
- %r{\+>} => :PARROW,
- %r{[a-z][-\w]*} => :NAME,
- %r{([a-z][-\w]*::)+[a-z][-\w]*} => :CLASSNAME,
- %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF,
- %r{[0-9]+} => :NUMBER,
- %r{\$(\w*::)*\w+} => :VARIABLE
- }
-
- @@pairs = {
- "{" => "}",
- "(" => ")",
- "[" => "]",
- "<|" => "|>",
- "<<|" => "|>>"
- }
-
- @@reverse_pairs = @@pairs.inject({}) { |hash, pair| hash[pair[1]] = pair[0]; hash }
-
- @@keywords = {
- "case" => :CASE,
- "class" => :CLASS,
- "default" => :DEFAULT,
- "define" => :DEFINE,
- "false" => :BOOLEAN,
- "import" => :IMPORT,
- "if" => :IF,
- "elsif" => :ELSIF,
- "else" => :ELSE,
- "inherits" => :INHERITS,
- "node" => :NODE,
- "true" => :BOOLEAN,
- "and" => :AND,
- "or" => :OR,
- "undef" => :UNDEF
- }
-
- def clear
- initvars
- end
+end
- def expected
- if @expected.empty?
- nil
- else
- token = @expected[-1]
- @@tokens.each do |value, name|
- if token == name
- return value
- end
- end
- return token
- end
- end
+module Puppet::Parser; end
- # scan the whole file
- # basically just used for testing
- def fullscan
- array = []
-
- self.scan { |token,str|
- # Ignore any definition nesting problems
- @indefine = false
- #Puppet.debug("got token '%s' => '%s'" % [token,str])
- if token.nil?
- return array
- else
- array.push([token,str])
- end
- }
- return array
+class Puppet::Parser::Lexer
+ attr_reader :last, :file
+
+ attr_accessor :line, :indefine
+
+ # Our base token class.
+ class Token
+ attr_accessor :regex, :name, :string, :skip, :incr_line, :skip_text
+
+ def initialize(regex, name)
+ if regex.is_a?(String)
+ @name, @string = name, regex
+ @regex = Regexp.new(Regexp.escape(@string))
+ else
+ @name, @regex = name, regex
end
+ end
- # this is probably pretty damned inefficient...
- # it'd be nice not to have to load the whole file first...
- def file=(file)
- @file = file
- @line = 1
- File.open(file) { |of|
- str = ""
- of.each { |line| str += line }
- @scanner = StringScanner.new(str)
- }
+ def skip?
+ self.skip
+ end
+
+ def to_s
+ if self.string
+ @string
+ else
+ @name.to_s
end
+ end
+ end
- def indefine?
- if defined? @indefine
- @indefine
- else
- false
- end
+ # Maintain a list of tokens.
+ class TokenList
+ attr_reader :regex_tokens, :string_tokens
+
+ def [](name)
+ @tokens[name]
+ end
+
+ # Create a new token.
+ def add_token(name, regex, options = {}, &block)
+ token = Token.new(regex, name)
+ raise(ArgumentError, "Token %s already exists" % name) if @tokens.include?(name)
+ @tokens[token.name] = token
+ if token.string
+ @string_tokens << token
+ @tokens_by_string[token.string] = token
+ else
+ @regex_tokens << token
end
- def initialize
- initvars()
+ options.each do |name, option|
+ token.send(name.to_s + "=", option)
end
- def initvars
- @line = 1
- @last = ""
- @lasttoken = nil
- @scanner = nil
- @file = nil
- # AAARRGGGG! okay, regexes in ruby are bloody annoying
- # no one else has "\n" =~ /\s/
- @skip = %r{[ \t]+}
+ token.meta_def(:convert, &block) if block_given?
+
+ token
+ end
- @namestack = []
- @indefine = false
+ def initialize
+ @tokens = {}
+ @regex_tokens = []
+ @string_tokens = []
+ @tokens_by_string = {}
+ end
- @expected = []
- end
+ # Look up a token by its value, rather than name.
+ def lookup(string)
+ @tokens_by_string[string]
+ end
- # Go up one in the namespace.
- def namepop
- @namestack.pop
+ # Define more tokens.
+ def add_tokens(hash)
+ hash.each do |regex, name|
+ add_token(name, regex)
end
+ end
- # Collect the current namespace.
- def namespace
- @namestack.join("::")
+ # Sort our tokens by length, so we know once we match, we're done.
+ # This helps us avoid the O(n^2) nature of token matching.
+ def sort_tokens
+ @string_tokens.sort! { |a, b| b.string.length <=> a.string.length }
+ end
+ end
+
+ TOKENS = TokenList.new
+ TOKENS.add_tokens(
+ '[' => :LBRACK,
+ ']' => :RBRACK,
+ '{' => :LBRACE,
+ '}' => :RBRACE,
+ '(' => :LPAREN,
+ ')' => :RPAREN,
+ '=' => :EQUALS,
+ '==' => :ISEQUAL,
+ '>=' => :GREATEREQUAL,
+ '>' => :GREATERTHAN,
+ '<' => :LESSTHAN,
+ '<=' => :LESSEQUAL,
+ '!=' => :NOTEQUAL,
+ '!' => :NOT,
+ ',' => :COMMA,
+ '.' => :DOT,
+ ':' => :COLON,
+ '@' => :AT,
+ '<<|' => :LLCOLLECT,
+ '|>>' => :RRCOLLECT,
+ '<|' => :LCOLLECT,
+ '|>' => :RCOLLECT,
+ ';' => :SEMIC,
+ '?' => :QMARK,
+ '\\' => :BACKSLASH,
+ '=>' => :FARROW,
+ '+>' => :PARROW,
+ %r{([a-z][-\w]*::)+[a-z][-\w]*} => :CLASSNAME,
+ %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF
+ )
+
+ TOKENS.add_tokens "Whatever" => :DQTEXT, "Nomatter" => :SQTEXT, "alsonomatter" => :BOOLEAN
+
+ TOKENS.add_token :NAME, %r{[a-z][-\w]*} do |lexer, value|
+ string_token = self
+ # we're looking for keywords here
+ if tmp = KEYWORDS.lookup(value)
+ string_token = tmp
+ if [:TRUE, :FALSE].include?(string_token.name)
+ value = eval(value)
+ string_token = TOKENS[:BOOLEAN]
end
+ end
+ [string_token, value]
+ end
+
+ TOKENS.add_token :NUMBER, %r{[0-9]+} do |lexer, value|
+ [TOKENS[:NAME], value]
+ end
+
+ TOKENS.add_token :COMMENT, %r{#.*}, :skip => true
+
+ TOKENS.add_token :RETURN, "\n", :skip => true, :incr_line => true, :skip_text => true
+
+ TOKENS.add_token :SQUOTE, "'" do |lexer, value|
+ value = lexer.slurpstring(value)
+ [TOKENS[:SQTEXT], value]
+ end
+
+ TOKENS.add_token :DQUOTE, '"' do |lexer, value|
+ value = lexer.slurpstring(value)
+ [TOKENS[:DQTEXT], value]
+ end
+
+ TOKENS.add_token :VARIABLE, %r{\$(\w*::)*\w+} do |lexer, value|
+ value = value.sub(/^\$/, '')
+ [self, value]
+ end
+
+ TOKENS.sort_tokens
+
+ @@pairs = {
+ "{" => "}",
+ "(" => ")",
+ "[" => "]",
+ "<|" => "|>",
+ "<<|" => "|>>"
+ }
+
+ KEYWORDS = TokenList.new
+
+ KEYWORDS.add_tokens(
+ "case" => :CASE,
+ "class" => :CLASS,
+ "default" => :DEFAULT,
+ "define" => :DEFINE,
+ "import" => :IMPORT,
+ "if" => :IF,
+ "elsif" => :ELSIF,
+ "else" => :ELSE,
+ "inherits" => :INHERITS,
+ "node" => :NODE,
+ "and" => :AND,
+ "or" => :OR,
+ "undef" => :UNDEF,
+ "false" => :FALSE,
+ "true" => :TRUE
+ )
+
+ def clear
+ initvars
+ end
+
+ def expected
+ return nil if @expected.empty?
+ name = @expected[-1]
+ raise "Could not find expected token %s" % name unless token = TOKENS.lookup(name)
+
+ return token
+ end
+
+ # scan the whole file
+ # basically just used for testing
+ def fullscan
+ array = []
+
+ self.scan { |token, str|
+ # Ignore any definition nesting problems
+ @indefine = false
+ array.push([token,str])
+ }
+ return array
+ end
+
+ # this is probably pretty damned inefficient...
+ # it'd be nice not to have to load the whole file first...
+ def file=(file)
+ @file = file
+ @line = 1
+ File.open(file) { |of|
+ str = ""
+ of.each { |line| str += line }
+ @scanner = StringScanner.new(str)
+ }
+ end
- # This value might have :: in it, but we don't care -- it'll be
- # handled normally when joining, and when popping we want to pop
- # this full value, however long the namespace is.
- def namestack(value)
- @namestack << value
+ def find_string_token
+ matched_token = value = nil
+
+ # We know our longest string token is three chars, so try each size in turn
+ # until we either match or run out of chars. This way our worst-case is three
+ # tries, where it is otherwise the number of string chars we have. Also,
+ # the lookups are optimized hash lookups, instead of regex scans.
+ [3, 2, 1].each do |i|
+ str = @scanner.peek(i)
+ if matched_token = TOKENS.lookup(str)
+ value = @scanner.scan(matched_token.regex)
+ break
end
+ end
+
+ return matched_token, value
+ end
- def rest
- @scanner.rest
+ # Find the next token that matches a regex. We look for these first.
+ def find_regex_token
+ @regex += 1
+ matched_token = nil
+ value = ""
+ length = 0
+
+ # I tried optimizing based on the first char, but it had
+ # a slightly negative affect and was a good bit more complicated.
+ TOKENS.regex_tokens.each do |token|
+ next unless match_length = @scanner.match?(token.regex)
+
+ # We've found a longer match
+ if match_length > length
+ value = @scanner.scan(token.regex)
+ length = value.length
+ matched_token = token
end
+ end
- # this is the heart of the lexer
- def scan
- #Puppet.debug("entering scan")
- if @scanner.nil?
- raise TypeError.new("Invalid or empty string")
- end
+ return matched_token, value
+ end
- @scanner.skip(@skip)
- until @scanner.eos? do
- yielded = false
- sendbreak = false # gah, this is a nasty hack
- stoken = nil
- sregex = nil
- value = ""
-
- # first find out which type of token we've got
- @@tokens.each { |regex,token|
- # we're just checking, which doesn't advance the scan
- # pointer
- tmp = @scanner.check(regex)
- if tmp.nil?
- #puppet.debug("did not match %s to '%s'" %
- # [regex, at scanner.rest])
- next
- end
-
- # find the longest match
- if tmp.length > value.length
- value = tmp
- stoken = token
- sregex = regex
- else
- # we've already got a longer match
- next
- end
- }
-
- # error out if we didn't match anything at all
- if stoken.nil?
- nword = nil
- if @scanner.rest =~ /^(\S+)/
- nword = $1
- elsif at scanner.rest =~ /^(\s+)/
- nword = $1
- else
- nword = @scanner.rest
- end
- raise "Could not match '%s'" % nword
- end
+ # Find the next token, returning the string and the token.
+ def find_token
+ @find += 1
+ matched_token, value = find_regex_token
- value = @scanner.scan(sregex)
+ unless matched_token
+ matched_token, value = find_string_token
+ end
- if value == ""
- raise "Didn't match regex on token %s" % stoken
- end
+ return matched_token, value
+ end
- # token-specific operations
- # if this gets much more complicated, it should
- # be moved up to where the tokens themselves are defined
- # which will get me about 75% of the way to a lexer generator
- ptoken = stoken
- case stoken
- when :NAME then
- wtoken = stoken
- # we're looking for keywords here
- if @@keywords.include?(value)
- wtoken = @@keywords[value]
- #Puppet.debug("token '%s'" % wtoken)
- if wtoken == :BOOLEAN
- value = eval(value)
- end
- end
- ptoken = wtoken
- when :NUMBER then
- ptoken = :NAME
- when :COMMENT then
- # just throw comments away
- next
- when :RETURN then
- @line += 1
- @scanner.skip(@skip)
- next
- when :SQUOTE then
- #Puppet.debug("searching '%s' after '%s'" % [self.rest,value])
- value = self.slurpstring(value)
- ptoken = :SQTEXT
- #Puppet.debug("got string '%s' => '%s'" % [:DQTEXT,value])
- when :DQUOTE then
- value = self.slurpstring(value)
- ptoken = :DQTEXT
- when :VARIABLE then
- value = value.sub(/^\$/, '')
- end
+ def indefine?
+ if defined? @indefine
+ @indefine
+ else
+ false
+ end
+ end
- if match = @@pairs[value] and ptoken != :DQUOTE and ptoken != :SQUOTE
- @expected << match
- elsif exp = @expected[-1] and exp == value and ptoken != :DQUOTE and ptoken != :SQUOTE
- @expected.pop
- end
+ def initialize
+ @find = 0
+ @regex = 0
+ initvars()
+ end
- yield [ptoken, value]
+ def initvars
+ @line = 1
+ @previous_token = nil
+ @scanner = nil
+ @file = nil
+ # AAARRGGGG! okay, regexes in ruby are bloody annoying
+ # no one else has "\n" =~ /\s/
+ @skip = %r{[ \t]+}
+
+ @namestack = []
+ @indefine = false
+ @expected = []
+ end
- if @lasttoken == :CLASS
- namestack(value)
- end
+ # Make any necessary changes to the token and/or value.
+ def munge_token(token, value)
+ @line += 1 if token.incr_line
- if @lasttoken == :DEFINE
- if indefine?
- msg = "Cannot nest definition %s inside %s" % [value, @indefine]
- self.indefine = false
- raise Puppet::ParseError, msg
- end
+ skip() if token.skip_text
- @indefine = value
- end
+ return if token.skip
- @last = value
- @lasttoken = ptoken
+ token, value = token.convert(self, value) if token.respond_to?(:convert)
- @scanner.skip(@skip)
- end
- @scanner = nil
- yield [false,false]
- end
+ return unless token
+
+ return token, value
+ end
+
+ # Go up one in the namespace.
+ def namepop
+ @namestack.pop
+ end
- # we've encountered an opening quote...
- # slurp in the rest of the string and return it
- def slurpstring(quote)
- # we search for the next quote that isn't preceded by a
- # backslash; the caret is there to match empty strings
- str = @scanner.scan_until(/([^\\]|^)#{quote}/)
- if str.nil?
- raise Puppet::LexError.new("Unclosed quote after '%s' in '%s'" %
- [self.last,self.rest])
+ # Collect the current namespace.
+ def namespace
+ @namestack.join("::")
+ end
+
+ # This value might have :: in it, but we don't care -- it'll be
+ # handled normally when joining, and when popping we want to pop
+ # this full value, however long the namespace is.
+ def namestack(value)
+ @namestack << value
+ end
+
+ def rest
+ @scanner.rest
+ end
+
+ # this is the heart of the lexer
+ def scan
+ #Puppet.debug("entering scan")
+ raise Puppet::LexError.new("Invalid or empty string") unless @scanner
+
+ # Skip any initial whitespace.
+ skip()
+
+ until @scanner.eos? do
+ yielded = false
+ matched_token, value = find_token
+
+ # error out if we didn't match anything at all
+ if matched_token.nil?
+ nword = nil
+ # Try to pull a 'word' out of the remaining string.
+ if @scanner.rest =~ /^(\S+)/
+ nword = $1
+ elsif @scanner.rest =~ /^(\s+)/
+ nword = $1
else
- str.sub!(/#{quote}\Z/,"")
- str.gsub!(/\\#{quote}/,quote)
+ nword = @scanner.rest
end
+ raise "Could not match '%s'" % nword
+ end
- return str
+ final_token, value = munge_token(matched_token, value)
+
+ next unless final_token
+
+ if match = @@pairs[value] and final_token.name != :DQUOTE and final_token.name != :SQUOTE
+ @expected << match
+ elsif exp = @expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
+ @expected.pop
end
- # just parse a string, not a whole file
- def string=(string)
- @scanner = StringScanner.new(string)
+ yield [final_token.name, value]
+
+ if @previous_token
+ namestack(value) if @previous_token.name == :CLASS
+
+ if @previous_token.name == :DEFINE
+ if indefine?
+ msg = "Cannot nest definition %s inside %s" % [value, @indefine]
+ self.indefine = false
+ raise Puppet::ParseError, msg
+ end
+
+ @indefine = value
+ end
end
+
+ @previous_token = final_token
+ skip()
end
- #---------------------------------------------------------------
+ @scanner = nil
+
+ # This indicates that we're done parsing.
+ yield [false,false]
+ end
+
+ # Skip any skipchars in our remaining string.
+ def skip
+ @scanner.skip(@skip)
end
-end
+ # we've encountered an opening quote...
+ # slurp in the rest of the string and return it
+ def slurpstring(quote)
+ # we search for the next quote that isn't preceded by a
+ # backslash; the caret is there to match empty strings
+ str = @scanner.scan_until(/([^\\]|^)#{quote}/)
+ if str.nil?
+ raise Puppet::LexError.new("Unclosed quote after '%s' in '%s'" %
+ [self.last,self.rest])
+ else
+ str.sub!(/#{quote}\Z/,"")
+ str.gsub!(/\\#{quote}/,quote)
+ end
+
+ return str
+ end
+
+ # just parse a string, not a whole file
+ def string=(string)
+ @scanner = StringScanner.new(string)
+ end
+end
diff --git a/lib/puppet/parser/makefile b/lib/puppet/parser/makefile
new file mode 100644
index 0000000..c4911d0
--- /dev/null
+++ b/lib/puppet/parser/makefile
@@ -0,0 +1,8 @@
+#parser.rb: grammar.ry
+# ryacc --output parser grammar
+
+parser.rb: grammar.ra
+ racc -o$@ grammar.ra
+
+grammar.output: grammar.ra
+ racc -v -o$@ grammar.ra
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index c3279d4..e27a209 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -29,7 +29,7 @@ module Puppet
class Parser < Racc::Parser
-module_eval <<'..end grammar.ra modeval..id9134b179f4', 'grammar.ra', 638
+module_eval <<'..end grammar.ra modeval..idfef5d70c9f', 'grammar.ra', 638
# It got too annoying having code in a file that needs to be compiled.
require 'puppet/parser/parser_support'
@@ -39,8 +39,9 @@ require 'puppet/parser/parser_support'
# mode: ruby
# End:
+# $Id$
-..end grammar.ra modeval..id9134b179f4
+..end grammar.ra modeval..idfef5d70c9f
##### racc 1.4.5 generates ###
@@ -956,7 +957,7 @@ module_eval <<'.,.,', 'grammar.ra', 174
def _reduce_38( val, _values, result )
type = val[0]
- if type == :exported and ! Puppet[:storeconfigs]
+ if (type == :exported and ! Puppet[:storeconfigs]) and ! Puppet[:parseonly]
error "You cannot collect without storeconfigs being set"
end
@@ -1009,7 +1010,7 @@ module_eval <<'.,.,', 'grammar.ra', 199
else
args[:form] = val[1]
end
- if args[:form] == :exported and ! Puppet[:storeconfigs]
+ if args[:form] == :exported and ! Puppet[:storeconfigs] and ! Puppet[:parseonly]
error "You cannot collect exported resources without storeconfigs being set"
end
result = ast AST::Collection, args
diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb
index acf3c9f..ccfc4d4 100644
--- a/lib/puppet/parser/parser_support.rb
+++ b/lib/puppet/parser/parser_support.rb
@@ -47,11 +47,8 @@ class Puppet::Parser::Parser
# Create an AST object, and automatically add the file and line information if
# available.
- def ast(klass, hash = nil)
- hash ||= {}
- unless hash.include?(:line)
- hash[:line] = @lexer.line
- end
+ def ast(klass, hash = {})
+ hash[:line] = @lexer.line unless hash.include?(:line)
unless hash.include?(:file)
if file = @lexer.file
@@ -180,7 +177,7 @@ class Puppet::Parser::Parser
"in file #{@lexer.file} at line #{@lexer.line}"
)
end
- files = Puppet::Module::find_manifests(pat, :cwd => dir)
+ files = Puppet::Module::find_manifests(pat, :cwd => dir, :environment => @environment)
if files.size == 0
raise Puppet::ImportError.new("No file(s) found for import " +
"of '#{pat}'")
diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 3f34616..4b48ff6 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -3,18 +3,18 @@
class Puppet::Parser::Resource
require 'puppet/parser/resource/param'
require 'puppet/parser/resource/reference'
+ require 'puppet/util/tagging'
include Puppet::Util
include Puppet::Util::MethodHelper
include Puppet::Util::Errors
include Puppet::Util::Logging
+ include Puppet::Util::Tagging
attr_accessor :source, :line, :file, :scope, :rails_id
attr_accessor :virtual, :override, :translated
attr_reader :exported, :evaluated, :params
- attr_writer :tags
-
# Determine whether the provided parameter name is a relationship parameter.
def self.relationship_parameter?(name)
unless defined?(@relationship_names)
@@ -58,8 +58,7 @@ class Puppet::Parser::Resource
def evaluate
if klass = @ref.definedtype
finish()
- scope.compile.delete_resource(self)
- return klass.evaluate(:scope => scope, :resource => self)
+ return klass.evaluate_code(self)
elsif builtin?
devfail "Cannot evaluate a builtin type"
else
@@ -83,12 +82,19 @@ class Puppet::Parser::Resource
# Do any finishing work on this object, called before evaluation or
# before storage/translation.
def finish
- add_overrides()
+ return if finished?
+ @finished = true
add_defaults()
add_metaparams()
+ add_scope_tags()
validate()
end
+ # Has this resource already been finished?
+ def finished?
+ defined?(@finished) and @finished
+ end
+
def initialize(options)
# Set all of the options we can.
options.each do |option, value|
@@ -130,12 +136,16 @@ class Puppet::Parser::Resource
raise ArgumentError, "Resources do not accept %s" % options.keys.collect { |k| k.to_s }.join(", ")
end
- @tags = []
tag(@ref.type)
- tag(@ref.title) if @ref.title.to_s =~ /^[-\w]+$/
+ tag(@ref.title) if valid_tag?(@ref.title.to_s)
+ end
- if scope.resource
- @tags += scope.resource.tags
+ # Is this resource modeling an isomorphic resource type?
+ def isomorphic?
+ if builtin?
+ return @ref.builtintype.isomorphic?
+ else
+ return true
end
end
@@ -223,21 +233,18 @@ class Puppet::Parser::Resource
@ref.to_s
end
- # Add a tag to our current list. These tags will be added to all
- # of the objects contained in this scope.
- def tag(*ary)
- ary.collect { |tag| tag.to_s.downcase }.collect { |tag| tag.split("::") }.flatten.each do |tag|
- unless tag =~ /^\w[-\w]*$/
- fail Puppet::ParseError, "Invalid tag %s" % tag.inspect
- end
- unless @tags.include?(tag)
- @tags << tag
- end
+ # Define a parameter in our resource.
+ def set_parameter(param, value = nil)
+ if value
+ param = Puppet::Parser::Resource::Param.new(
+ :name => param, :value => value, :source => self.source
+ )
+ elsif ! param.is_a?(Puppet::Parser::Resource::Param)
+ raise ArgumentError, "Must pass a parameter or all necessary values"
end
- end
- def tags
- @tags.dup
+ # And store it in our parameter hash.
+ @params[param.name] = param
end
def to_hash
@@ -260,6 +267,8 @@ class Puppet::Parser::Resource
# Handle file specially
db_resource.file = self.file
+ db_resource.save
+
@params.each { |name, param|
param.to_rails(db_resource)
}
@@ -336,7 +345,7 @@ class Puppet::Parser::Resource
unless @params.include?(name)
self.debug "Adding default for %s" % name
- @params[name] = param
+ @params[name] = param.dup
end
end
end
@@ -361,16 +370,9 @@ class Puppet::Parser::Resource
end
end
- # Add any overrides for this object.
- def add_overrides
- if overrides = scope.compile.resource_overrides(self)
- overrides.each do |over|
- self.merge(over)
- end
-
- # Remove the overrides, so that the configuration knows there
- # are none left.
- overrides.clear
+ def add_scope_tags
+ if scope_resource = scope.resource
+ tag(*scope_resource.tags)
end
end
@@ -382,11 +384,8 @@ class Puppet::Parser::Resource
# The parameter is already set. Fail if they're not allowed to override it.
unless param.source.child_of?(current.source)
- if Puppet[:trace]
- puts caller
- end
- msg = "Parameter '%s' is already set on %s" %
- [param.name, self.to_s]
+ puts caller if Puppet[:trace]
+ msg = "Parameter '%s' is already set on %s" % [param.name, self.to_s]
if current.source.to_s != ""
msg += " by %s" % current.source
end
@@ -438,20 +437,6 @@ class Puppet::Parser::Resource
end
end
- # Define a parameter in our resource.
- def set_parameter(param, value = nil)
- if value
- param = Puppet::Parser::Resource::Param.new(
- :name => param, :value => value, :source => self.source
- )
- elsif ! param.is_a?(Puppet::Parser::Resource::Param)
- raise ArgumentError, "Must pass a parameter or all necessary values"
- end
-
- # And store it in our parameter hash.
- @params[param.name] = param
- end
-
# Make sure the resource's parameters are all valid for the type.
def validate
@params.each do |name, param|
diff --git a/lib/puppet/parser/resource/param.rb b/lib/puppet/parser/resource/param.rb
index 9352311..9dd3f26 100644
--- a/lib/puppet/parser/resource/param.rb
+++ b/lib/puppet/parser/resource/param.rb
@@ -12,7 +12,7 @@ class Puppet::Parser::Resource::Param
end
def inspect
- "#<#{self.class} @name => #{self.name}, @value => #{self.value}, @source => #{self.source.name}>"
+ "#<#{self.class} @name => #{name}, @value => #{value}, @source => #{source.name}>"
end
def line_to_i
diff --git a/lib/puppet/parser/resource/reference.rb b/lib/puppet/parser/resource/reference.rb
index 6e70d23..c597480 100644
--- a/lib/puppet/parser/resource/reference.rb
+++ b/lib/puppet/parser/resource/reference.rb
@@ -37,10 +37,14 @@ class Puppet::Parser::Resource::Reference < Puppet::ResourceReference
if self.title == :main
tmp = @scope.findclass("")
else
- tmp = @scope.findclass(self.title)
+ unless tmp = @scope.findclass(self.title)
+ fail Puppet::ParseError, "Could not find class '%s'" % self.title
+ end
end
when "Node": # look for node definitions
- tmp = @scope.parser.nodes[self.title]
+ unless tmp = @scope.parser.nodes[self.title]
+ fail Puppet::ParseError, "Could not find node '%s'" % self.title
+ end
else # normal definitions
# We have to swap these variables around so the errors are right.
tmp = @scope.finddefine(self.type)
@@ -49,7 +53,7 @@ class Puppet::Parser::Resource::Reference < Puppet::ResourceReference
if tmp
@definedtype = tmp
else
- fail Puppet::ParseError, "Could not find resource '%s'" % self
+ fail Puppet::ParseError, "Could not find resource type '%s'" % self.type
end
end
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 028414c..a6e43e7 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -17,15 +17,20 @@ class Puppet::Parser::Scope
include Puppet::Util::Errors
attr_accessor :parent, :level, :parser, :source, :resource
attr_accessor :base, :keyword, :nodescope
- attr_accessor :top, :translated, :compile
+ attr_accessor :top, :translated, :compiler
+
+ # A demeterific shortcut to the catalog.
+ def catalog
+ compiler.catalog
+ end
# Proxy accessors
def host
- @compile.node.name
+ @compiler.node.name
end
def interpreter
- @compile.interpreter
+ @compiler.interpreter
end
# Is the value true? This allows us to control the definition of truth
@@ -72,7 +77,7 @@ class Puppet::Parser::Scope
end
def findresource(string, name = nil)
- compile.findresource(string, name)
+ compiler.findresource(string, name)
end
# Initialize our new scope. Defaults to having no parent.
@@ -147,7 +152,7 @@ class Puppet::Parser::Scope
unless klass
raise Puppet::ParseError, "Could not find class %s" % klassname
end
- unless kscope = compile.class_scope(klass)
+ unless kscope = compiler.class_scope(klass)
raise Puppet::ParseError, "Class %s has not been evaluated so its variables cannot be referenced" % klass.classname
end
return kscope.lookupvar(shortname, usestring)
@@ -184,7 +189,7 @@ class Puppet::Parser::Scope
# Create a new scope and set these options.
def newscope(options = {})
- compile.newscope(self, options)
+ compiler.newscope(self, options)
end
# Is this class for a node? This is used to make sure that
@@ -199,7 +204,7 @@ class Puppet::Parser::Scope
# than doing lots of queries.
def parent
unless defined?(@parent)
- @parent = compile.parent(self)
+ @parent = compiler.parent(self)
end
@parent
end
diff --git a/lib/puppet/parser/templatewrapper.rb b/lib/puppet/parser/templatewrapper.rb
index 13823d4..7a8f741 100644
--- a/lib/puppet/parser/templatewrapper.rb
+++ b/lib/puppet/parser/templatewrapper.rb
@@ -7,7 +7,7 @@ class Puppet::Parser::TemplateWrapper
def initialize(scope, file)
@scope = scope
- @file = Puppet::Module::find_template(file, @scope.compile.environment)
+ @file = Puppet::Module::find_template(file, @scope.compiler.environment)
unless FileTest.exists?(@file)
raise Puppet::ParseError,
diff --git a/lib/puppet/pgraph.rb b/lib/puppet/pgraph.rb
index 49fd214..3bcc2ce 100644
--- a/lib/puppet/pgraph.rb
+++ b/lib/puppet/pgraph.rb
@@ -1,51 +1,27 @@
# Created by Luke A. Kanies on 2006-11-24.
# Copyright (c) 2006. All rights reserved.
-require 'puppet/external/gratr/digraph'
-require 'puppet/external/gratr/import'
-require 'puppet/external/gratr/dot'
-
require 'puppet/relationship'
require 'puppet/simple_graph'
# This class subclasses a graph class in order to handle relationships
# among resources.
class Puppet::PGraph < Puppet::SimpleGraph
- # This is the type used for splicing.
- attr_accessor :container_type
-
include Puppet::Util
- def add_edge!(*args)
+ def add_edge(*args)
@reversal = nil
super
end
- def add_vertex!(*args)
+ def add_vertex(*args)
@reversal = nil
super
end
- # Make sure whichever edge has a label keeps the label
- def copy_label(source, target, label)
- # 'require' relationships will not have a label,
- # and all 'subscribe' relationships have the same
- # label, at least for now.
-
- # Labels default to {}, so we can't just test for nil.
- newlabel = label || {}
- oldlabel = edge_label(source, target) || {}
- if ! newlabel.empty? and oldlabel.empty?
- edge_label_set(source, target, label)
- # We should probably check to see if the labels both exist
- # and don't match, but we'd just throw an error which the user
- # couldn't do anyting about.
- end
- end
-
# Which resources a given resource depends upon.
def dependents(resource)
- tree_from_vertex2(resource).keys
+ tree_from_vertex(resource).keys
end
# Which resources depend upon the given resource.
@@ -58,19 +34,13 @@ class Puppet::PGraph < Puppet::SimpleGraph
# Strangely, it's significantly faster to search a reversed
# tree in the :out direction than to search a normal tree
# in the :in direction.
- @reversal.tree_from_vertex2(resource, :out).keys
- #tree_from_vertex2(resource, :in).keys
- end
-
- # Override this method to use our class instead.
- def edge_class()
- Puppet::Relationship
+ @reversal.tree_from_vertex(resource, :out).keys
end
# Determine all of the leaf nodes below a given vertex.
- def leaves(vertex, type = :dfs)
- tree = tree_from_vertex(vertex, type)
- l = tree.keys.find_all { |c| adjacent(c, :direction => :out).empty? }
+ def leaves(vertex, direction = :out)
+ tree = tree_from_vertex(vertex, direction)
+ l = tree.keys.find_all { |c| adjacent(c, :direction => direction).empty? }
return l
end
@@ -128,83 +98,24 @@ class Puppet::PGraph < Puppet::SimpleGraph
t = edge.target
end
- # We don't want to add multiple copies of the
- # same edge, but we *do* want to make sure we
- # keep labels around.
- # XXX This will *not* work when we support multiple
- # types of labels, and only works now because
- # you can only do simple subscriptions.
- if edge?(s, t)
- copy_label(s, t, edge.label)
- next
- end
- add_edge!(s, t, edge.label)
+ add_edge(s, t, edge.label)
end
# Now get rid of the edge, so remove_vertex! works correctly.
remove_edge!(edge)
- Puppet.debug "%s: %s => %s: %s" % [container,
- edge.source, edge.target, edge?(edge.source, edge.target)]
end
end
remove_vertex!(container)
end
end
-
- # For some reason, unconnected vertices do not show up in
- # this graph.
- def to_jpg(path, name)
- gv = vertices()
- Dir.chdir(path) do
- induced_subgraph(gv).write_to_graphic_file('jpg', name)
- end
- end
-
- # Replace the default method, because we want to throw errors on back edges,
- # not just skip them.
- def topsort(start = nil, &block)
- result = []
- go = true
- cycles = []
- back = Proc.new { |e|
- cycles << e
- go = false
- }
- push = Proc.new { |v| result.unshift(v) if go}
- start ||= vertices[0]
- dfs({:exit_vertex => push, :back_edge => back, :start => start})
- if block_given?
- result.each {|v| yield(v) }
- end
-
- if cycles.length > 0
- msg = "Found cycles in the following relationships:"
- cycles.each { |edge| msg += " %s => %s" % [edge.source, edge.target] }
- raise Puppet::Error, msg
- end
- return result
- end
-
- def to_yaml_properties
- instance_variables
- end
# A different way of walking a tree, and a much faster way than the
# one that comes with GRATR.
- def tree_from_vertex2(start, direction = :out)
+ def tree_from_vertex(start, direction = :out)
predecessor={}
walk(start, direction) do |parent, child|
predecessor[child] = parent
end
predecessor
end
-
- # A support method for tree_from_vertex2. Just walk the tree and pass
- # the parents and children.
- def walk(source, direction, &block)
- adjacent(source, :direction => direction).each do |target|
- yield source, target
- walk(target, direction, &block)
- end
- end
end
diff --git a/lib/puppet/provider/interface/redhat.rb b/lib/puppet/provider/interface/redhat.rb
index aa21762..4a9fcb4 100644
--- a/lib/puppet/provider/interface/redhat.rb
+++ b/lib/puppet/provider/interface/redhat.rb
@@ -5,7 +5,7 @@ Puppet::Type.type(:interface).provide(:redhat) do
desc "Manage network interfaces on Red Hat operating systems. This provider
parses and generates configuration files in ``/etc/sysconfig/network-scripts``."
- INTERFACE_DIR = "/etc/sysconfig/network-scripts"
+ INTERFACE_DIR = "/etc/sysconfig/network-scripts"
confine :exists => INTERFACE_DIR
defaultfor :operatingsystem => [:fedora, :centos, :redhat]
@@ -43,52 +43,52 @@ NETMASK=<%= self.netmask %>
BROADCAST=
LOOPBACKDUMMY
- # maximum number of dummy interfaces
- @max_dummies = 10
+ # maximum number of dummy interfaces
+ @max_dummies = 10
- # maximum number of aliases per interface
- @max_aliases_per_iface = 10
+ # maximum number of aliases per interface
+ @max_aliases_per_iface = 10
- @@dummies = []
- @@aliases = Hash.new { |hash, key| hash[key] = [] }
+ @@dummies = []
+ @@aliases = Hash.new { |hash, key| hash[key] = [] }
- # calculate which dummy interfaces are currently already in
- # use prior to needing to call self.next_dummy later on.
- def self.instances
- # parse all of the config files at once
- Dir.glob("%s/ifcfg-*" % INTERFACE_DIR).collect do |file|
- record = parse(file)
+ # calculate which dummy interfaces are currently already in
+ # use prior to needing to call self.next_dummy later on.
+ def self.instances
+ # parse all of the config files at once
+ Dir.glob("%s/ifcfg-*" % INTERFACE_DIR).collect do |file|
+ record = parse(file)
- # store the existing dummy interfaces
+ # store the existing dummy interfaces
@@dummies << record[:ifnum] if (record[:interface_type] == :dummy and ! @@dummies.include?(record[:ifnum]))
@@aliases[record[:interface]] << record[:ifnum] if record[:interface_type] == :alias
new(record)
- end
- end
-
- # return the next avaliable dummy interface number, in the case where
- # ifnum is not manually specified
- def self.next_dummy
- @max_dummies.times do |i|
- unless @@dummies.include?(i.to_s)
- @@dummies << i.to_s
- return i.to_s
- end
- end
- end
-
- # return the next available alias on a given interface, in the case
- # where ifnum if not manually specified
- def self.next_alias(interface)
- @max_aliases_per_iface.times do |i|
- unless @@aliases[interface].include?(i.to_s)
- @@aliases[interface] << i.to_s
- return i.to_s
- end
- end
- end
+ end
+ end
+
+ # return the next avaliable dummy interface number, in the case where
+ # ifnum is not manually specified
+ def self.next_dummy
+ @max_dummies.times do |i|
+ unless @@dummies.include?(i.to_s)
+ @@dummies << i.to_s
+ return i.to_s
+ end
+ end
+ end
+
+ # return the next available alias on a given interface, in the case
+ # where ifnum if not manually specified
+ def self.next_alias(interface)
+ @max_aliases_per_iface.times do |i|
+ unless @@aliases[interface].include?(i.to_s)
+ @@aliases[interface] << i.to_s
+ return i.to_s
+ end
+ end
+ end
# base the ifnum, for dummy / loopback interface in linux
# on the last octect of the IP address
@@ -139,14 +139,14 @@ LOOPBACKDUMMY
# on whether we are adding an alias to a real interface, or a loopback
# address (also dummy) on linux. For linux it's quite involved, and we
# will use an ERB template
- def generate
+ def generate
itype = self.interface_type == :alias ? :alias : :normal
self.class.template(itype).result(binding)
- end
+ end
# Where should the file be written out?
- # This defaults to INTERFACE_DIR/ifcfg-<namevar>, but can have a
- # more symbolic name by setting interface_desc in the type.
+ # This defaults to INTERFACE_DIR/ifcfg-<namevar>, but can have a
+ # more symbolic name by setting interface_desc in the type.
def file_path
if resource and val = resource[:interface_desc]
desc = val
@@ -185,16 +185,16 @@ LOOPBACKDUMMY
end
end
- # create the device name, so this based on the IP, and interface + type
- def device
- case @resource.should(:interface_type)
- when :loopback
- @property_hash[:ifnum] ||= self.class.next_dummy
- return "dummy" + @property_hash[:ifnum]
- when :alias
- @property_hash[:ifnum] ||= self.class.next_alias(@resource[:interface])
- return @resource[:interface] + ":" + @property_hash[:ifnum]
- end
+ # create the device name, so this based on the IP, and interface + type
+ def device
+ case @resource.should(:interface_type)
+ when :loopback
+ @property_hash[:ifnum] ||= self.class.next_dummy
+ return "dummy" + @property_hash[:ifnum]
+ when :alias
+ @property_hash[:ifnum] ||= self.class.next_alias(@resource[:interface])
+ return @resource[:interface] + ":" + @property_hash[:ifnum]
+ end
end
# Set the name to our ip address.
@@ -202,19 +202,19 @@ LOOPBACKDUMMY
@property_hash[:name] = value
end
- # whether the device is to be brought up on boot or not. converts
- # the true / false of the type, into yes / no values respectively
- # writing out the ifcfg-* files
- def on_boot
- case @property_hash[:onboot].to_s
- when "true"
- return "yes"
- when "false"
- return "no"
- else
- return "neither"
- end
- end
+ # whether the device is to be brought up on boot or not. converts
+ # the true / false of the type, into yes / no values respectively
+ # writing out the ifcfg-* files
+ def on_boot
+ case @property_hash[:onboot].to_s
+ when "true"
+ return "yes"
+ when "false"
+ return "no"
+ else
+ return "neither"
+ end
+ end
# Mark whether the interface should be started on boot.
def on_boot=(value)
diff --git a/lib/puppet/provider/mount/parsed.rb b/lib/puppet/provider/mount/parsed.rb
index 2090833..9bc1cf5 100755
--- a/lib/puppet/provider/mount/parsed.rb
+++ b/lib/puppet/provider/mount/parsed.rb
@@ -14,7 +14,7 @@ Puppet::Type.type(:mount).provide(:parsed,
:filetype => :flat
) do
include Puppet::Provider::Mount
- confine :exists => fstab
+ #confine :exists => fstab
commands :mountcmd => "mount", :umount => "umount"
diff --git a/lib/puppet/provider/naginator.rb b/lib/puppet/provider/naginator.rb
new file mode 100644
index 0000000..8e8a3d6
--- /dev/null
+++ b/lib/puppet/provider/naginator.rb
@@ -0,0 +1,55 @@
+# Created by Luke Kanies on 2007-11-27.
+# Copyright (c) 2007. All rights reserved.
+
+require 'puppet'
+require 'puppet/provider/parsedfile'
+require 'puppet/external/nagios'
+
+# The base class for all Naginator providers.
+class Puppet::Provider::Naginator < Puppet::Provider::ParsedFile
+ # Retrieve the associated class from Nagios::Base.
+ def self.nagios_type
+ unless defined?(@nagios_type) and @nagios_type
+ name = resource_type.name.to_s.sub(/^nagios_/, '')
+ unless @nagios_type = Nagios::Base.type(name.to_sym)
+ raise Puppet::DevError, "Could not find nagios type '%s'" % name
+ end
+
+ # And add our 'ensure' settings, since they aren't a part of
+ # Naginator by default
+ @nagios_type.send(:attr_accessor, :ensure, :target, :on_disk)
+ end
+ @nagios_type
+ end
+
+ def self.parse(text)
+ Nagios::Parser.new.parse(text)
+ end
+
+ def self.to_file(records)
+ header + records.collect { |record| record.to_s }.join("\n")
+ end
+
+ def self.skip_record?(record)
+ false
+ end
+
+ def self.valid_attr?(klass, attr_name)
+ nagios_type.parameters.include?(attr_name)
+ end
+
+ def initialize(resource = nil)
+ if resource.is_a?(Nagios::Base)
+ # We don't use a duplicate here, because some providers (ParsedFile, at least)
+ # use the hash here for later events.
+ @property_hash = resource
+ elsif resource
+ @resource = resource if resource
+ # LAK 2007-05-09: Keep the model stuff around for backward compatibility
+ @model = resource
+ @property_hash = self.class.nagios_type.new
+ else
+ @property_hash = self.class.nagios_type.new
+ end
+ end
+end
diff --git a/lib/puppet/provider/nameservice/directoryservice.rb b/lib/puppet/provider/nameservice/directoryservice.rb
index b2ccfbd..e2e68b2 100644
--- a/lib/puppet/provider/nameservice/directoryservice.rb
+++ b/lib/puppet/provider/nameservice/directoryservice.rb
@@ -139,10 +139,12 @@ class DirectoryService < Puppet::Provider::NameService
dscl_output.split("\n").each do |line|
# JJM: Split the attribute name and the list of values.
ds_attribute, ds_values_string = line.split(':')
+
+ # Split sets the values to nil if there's nothing after the :
+ ds_values_string ||= ""
# JJM: skip this attribute line if the Puppet::Type doesn't care about it.
- next unless (@@ds_to_ns_attribute_map.keys.include?(ds_attribute) \
- and type_properties.include? @@ds_to_ns_attribute_map[ds_attribute])
+ next unless (@@ds_to_ns_attribute_map.keys.include?(ds_attribute) and type_properties.include? @@ds_to_ns_attribute_map[ds_attribute])
# JJM: We asked dscl to output url encoded values so we're able
# to machine parse on whitespace. We need to urldecode:
@@ -178,11 +180,8 @@ class DirectoryService < Puppet::Provider::NameService
# This method spits out proper DSCL commands for us.
# We EXPECT name to be @resource[:name] when called from an instance object.
- # JJM: With dscl, the domain "/" is always the default local domain.
- # The domain /Search will search all domains, and you may
- # get at specific domains with /LDAPv3/server1.foobar.com,
- # /LDAPv3/server2.foobar.com, etc...
- command_vector = [ command(:dscl), "-url", "/" ]
+ # There are two ways to specify paths in 10.5. See man dscl.
+ command_vector = [ command(:dscl), "-url", "." ]
# JJM: The actual action to perform. See "man dscl"
# Common actiosn: -create, -delete, -merge, -append, -passwd
command_vector << ds_action
diff --git a/lib/puppet/provider/package/fink.rb b/lib/puppet/provider/package/fink.rb
index e0933df..030e1a3 100755
--- a/lib/puppet/provider/package/fink.rb
+++ b/lib/puppet/provider/package/fink.rb
@@ -9,8 +9,6 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
commands :aptcache => "/sw/bin/apt-cache"
commands :dpkgquery => "/sw/bin/dpkg-query"
- defaultfor :operatingsystem => :darwin
-
has_feature :versionable
# A derivative of DPKG; this is how most people actually manage
diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index 6e777a7..bb09bc5 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -23,14 +23,14 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
end
begin
- list = execute(command).split("\n\n").collect do |set|
+ list = execute(command).split("\n").collect do |set|
if gemhash = gemsplit(set)
gemhash[:provider] = :gem
gemhash
else
nil
end
- end.reject { |p| p.nil? }
+ end.compact
rescue Puppet::ExecutionFailure => detail
raise Puppet::Error, "Could not list gems: %s" % detail
end
@@ -44,8 +44,8 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
def self.gemsplit(desc)
case desc
- when /^\*\*\*/: return nil
- when /^(\S+)\s+\((.+)\)\n/
+ when /^\*\*\*/, /^\s*$/, /^\s+/; return nil
+ when /^(\S+)\s+\((.+)\)/
name = $1
version = $2.split(/,\s*/)[0]
return {
@@ -78,7 +78,11 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
command << @resource[:name]
end
- gemcmd(*command)
+ output = gemcmd(*command)
+ # Apparently some stupid gem versions don't exit non-0 on failure
+ if output.include?("ERROR")
+ self.fail "Could not install: %s" % output.chomp
+ end
end
def latest
diff --git a/lib/puppet/provider/package/openbsd.rb b/lib/puppet/provider/package/openbsd.rb
index ce69dd4..f76c371 100755
--- a/lib/puppet/provider/package/openbsd.rb
+++ b/lib/puppet/provider/package/openbsd.rb
@@ -66,7 +66,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
info = pkginfo @resource[:name]
# Search for the version info
- if info =~ /Information for #{@resource[:name]}-(\S+)/
+ if info =~ /Information for (inst:)?#{@resource[:name]}-(\S+)/
hash[:ensure] = $1
else
return nil
diff --git a/lib/puppet/provider/package/pkgdmg.rb b/lib/puppet/provider/package/pkgdmg.rb
index b7601cd..2614d09 100644
--- a/lib/puppet/provider/package/pkgdmg.rb
+++ b/lib/puppet/provider/package/pkgdmg.rb
@@ -87,10 +87,8 @@ Example usage::
**WARNING**: Because I assume files will be downloaded to /tmp, the current
implementation attempts to delete DMG files if you install directly from the
-file system and not via a URL method.
-"
+file system and not via a URL method."
-
confine :exists => "/Library/Receipts"
commands :installer => "/usr/sbin/installer"
commands :hdiutil => "/usr/bin/hdiutil"
@@ -147,11 +145,8 @@ file system and not via a URL method.
begin
open(cached_source) do |dmg|
xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
- ptable = Plist::parse_xml xml_str
- # JJM Filter out all mount-paths into a single array, discard the rest.
- mounts = ptable['system-entities'].collect { |entity|
- entity['mount-point']
- }.select { |mountloc|; mountloc }
+ # JJM THIS IS A HORRIBLE HACK (Well, actually it's not so bad...)
+ mounts = xml_str.scan(/<string>(\/tmp.*?)<\/string>/)[0]
begin
mounts.each do |fspath|
Dir.entries(fspath).select { |f|
diff --git a/lib/puppet/provider/package/portage.rb b/lib/puppet/provider/package/portage.rb
index 03274a7..f795d03 100644
--- a/lib/puppet/provider/package/portage.rb
+++ b/lib/puppet/provider/package/portage.rb
@@ -10,8 +10,8 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
defaultfor :operatingsystem => :gentoo
def self.instances
- result_format = /(\S+) (\S+) \[([^\[]*)(\[[^\]]*\])?\] \[[^0-9]*([^\s:\[]*)(\[[^\]]*\])?(:\S*)?\] ([\S]*) (.*)/
- result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :overlay, :slot, :vendor, :description]
+ result_format = /(\S+) (\S+) \[(?:([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\([^\)]+\))?(?:\[([^\]]+)\])?[ ]*)*\] \[(?:(?:\{M\})?(?:\([~*]+\))?([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\(([^\)]+)\))?(?:![mf])*(?:\[([^\]]+)\])?)?\] ([\S]*) (.*)/
+ result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :slot, :overlay, :vendor, :description]
search_format = "{installedversionsshort}<category> <name> [<installedversionsshort>] [<best>] <homepage> <description>{}"
@@ -39,7 +39,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
return packages
rescue Puppet::ExecutionFailure => detail
- raise Puppet::PackageError.new(detail)
+ raise Puppet::Error.new(detail)
end
end
@@ -67,8 +67,8 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
end
def query
- result_format = /(\S+) (\S+) \[([^\[]*)(\[[^\]]*\])?\] \[[^0-9]*([^\s:\[]*)(\[[^\]]*\])?(:\S*)?\] ([\S]*) (.*)/
- result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :overlay, :slot, :vendor, :description]
+ result_format = /(\S+) (\S+) \[(?:([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\([^\)]+\))?(?:\[([^\]]+)\])?[ ]*)*\] \[(?:(?:\{M\})?(?:\([~*]+\))?([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\(([^\)]+)\))?(?:![mf])*(?:\[([^\]]+)\])?)?\] ([\S]*) (.*)/
+ result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :slot, :overlay, :vendor, :description]
search_field = @resource[:category] ? "--category-name" : "--name"
search_value = package_name
@@ -99,14 +99,14 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
case packages.size
when 0
not_found_value = "%s/%s" % [@resource[:category] ? @resource[:category] : "<unspecified category>", @resource[:name]]
- raise Puppet::PackageError.new("No package found with the specified name [#{not_found_value}]")
+ raise Puppet::Error.new("No package found with the specified name [#{not_found_value}]")
when 1
return packages[0]
else
- raise Puppet::PackageError.new("More than one package with the specified name [#{search_value}], please use the category parameter to disambiguate")
+ raise Puppet::Error.new("More than one package with the specified name [#{search_value}], please use the category parameter to disambiguate")
end
rescue Puppet::ExecutionFailure => detail
- raise Puppet::PackageError.new(detail)
+ raise Puppet::Error.new(detail)
end
end
diff --git a/lib/puppet/provider/package/yumhelper.py b/lib/puppet/provider/package/yumhelper.py
index 1142401..962b96c 100644
--- a/lib/puppet/provider/package/yumhelper.py
+++ b/lib/puppet/provider/package/yumhelper.py
@@ -13,8 +13,7 @@ OVERRIDE_OPTS = {
'logfile': '/dev/null'
}
-def pkg_lists():
- my = yum.YumBase()
+def pkg_lists(my):
my.doConfigSetup()
for k in OVERRIDE_OPTS.keys():
@@ -28,10 +27,13 @@ def pkg_lists():
return my.doPackageLists('updates')
try:
- ypl = pkg_lists()
+ try:
+ my = yum.YumBase()
+ ypl = pkg_lists(my)
+ for pkg in ypl.updates:
+ print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch)
+ finally:
+ my.closeRpmDB()
except IOError, e:
print "_err IOError %d %s" % (e.errno, e)
sys.exit(1)
-
-for pkg in ypl.updates:
- print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch)
diff --git a/lib/puppet/provider/parsedfile.rb b/lib/puppet/provider/parsedfile.rb
index 76654c4..b4a4a3b 100755
--- a/lib/puppet/provider/parsedfile.rb
+++ b/lib/puppet/provider/parsedfile.rb
@@ -180,7 +180,7 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
matchers = resources.dup
@records.each do |record|
# Skip things like comments and blank lines
- next if record_type(record[:record_type]).text?
+ next if skip_record?(record)
if name = record[:name] and resource = resources[name]
resource.provider = new(record)
@@ -243,6 +243,12 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
end
end
+ # Should we skip the record? Basically, we skip text records.
+ # This is only here so subclasses can override it.
+ def self.skip_record?(record)
+ record_type(record[:record_type]).text?
+ end
+
# Initialize the object if necessary.
def self.target_object(target)
@target_objects[target] ||= filetype.new(target)
diff --git a/lib/puppet/provider/service/debian.rb b/lib/puppet/provider/service/debian.rb
index 233242a..e54fb13 100755
--- a/lib/puppet/provider/service/debian.rb
+++ b/lib/puppet/provider/service/debian.rb
@@ -14,6 +14,7 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
# Remove the symlinks
def disable
update "-f", @resource[:name], "remove"
+ update @resource[:name], "stop 1 2 3 4 5 6 ."
end
def enabled?
@@ -29,6 +30,7 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
end
def enable
+ update "-f", @resource[:name], "remove"
update @resource[:name], "defaults"
end
end
diff --git a/lib/puppet/provider/service/gentoo.rb b/lib/puppet/provider/service/gentoo.rb
index 2dcc3e9..adbee69 100644
--- a/lib/puppet/provider/service/gentoo.rb
+++ b/lib/puppet/provider/service/gentoo.rb
@@ -8,6 +8,10 @@ Puppet::Type.type(:service).provide :gentoo, :parent => :init do
defaultfor :operatingsystem => :gentoo
+ def self.defpath
+ superclass.defpath
+ end
+
def disable
begin
output = update :del, @resource[:name], :default
diff --git a/lib/puppet/provider/service/init.rb b/lib/puppet/provider/service/init.rb
index d9919f5..274c334 100755
--- a/lib/puppet/provider/service/init.rb
+++ b/lib/puppet/provider/service/init.rb
@@ -110,7 +110,7 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
# we just return that; otherwise, we return false, which causes it to
# fallback to other mechanisms.
def statuscmd
- if @resource[:hasstatus]
+ if @resource[:hasstatus] == :true
return [self.initscript, :status]
else
return false
diff --git a/lib/puppet/provider/sshkey/parsed.rb b/lib/puppet/provider/sshkey/parsed.rb
index cb1010c..6f7d98f 100755
--- a/lib/puppet/provider/sshkey/parsed.rb
+++ b/lib/puppet/provider/sshkey/parsed.rb
@@ -12,6 +12,8 @@ Puppet::Type.type(:sshkey).provide(:parsed,
:default_target => known,
:filetype => :flat
) do
+ desc "Parse and generate host-wide known hosts files for SSH."
+
text_line :comment, :match => /^#/
text_line :blank, :match => /^\s+/
diff --git a/lib/puppet/provider/user/useradd.rb b/lib/puppet/provider/user/useradd.rb
index c247620..9ecaad8 100644
--- a/lib/puppet/provider/user/useradd.rb
+++ b/lib/puppet/provider/user/useradd.rb
@@ -19,7 +19,7 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
has_features :manages_homedir, :allows_duplicates
- if Puppet.features.libshadow? and (Facter.value(:kernel) == "Linux")
+ if Puppet.features.libshadow?
has_feature :manages_passwords
end
diff --git a/lib/puppet/rails.rb b/lib/puppet/rails.rb
index a1192bf..a021c77 100644
--- a/lib/puppet/rails.rb
+++ b/lib/puppet/rails.rb
@@ -91,6 +91,10 @@ module Puppet::Rails
raise Puppet::Error, "Could not find Puppet::Rails database dir"
end
+ unless ActiveRecord::Base.connection.tables.include?("resources")
+ raise Puppet::Error, "Database has problems, can't migrate."
+ end
+
Puppet.notice "Migrating"
begin
diff --git a/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb b/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb
new file mode 100644
index 0000000..71ee6ae
--- /dev/null
+++ b/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb
@@ -0,0 +1,17 @@
+class AddCreatedAtToAllTables < ActiveRecord::Migration
+ def self.up
+ ActiveRecord::Base.connection.tables.each do |t|
+ unless ActiveRecord::Base.connection.columns(t).collect {|c| c.name}.include?("created_at")
+ add_column t.to_s, :created_at, :datetime
+ end
+ end
+ end
+
+ def self.down
+ ActiveRecord::Base.connection.tables.each do |t|
+ unless ActiveRecord::Base.connection.columns(t).collect {|c| c.name}.include?("created_at")
+ remove_column t.to_s, :created_at
+ end
+ end
+ end
+end
diff --git a/lib/puppet/rails/external/tagging/acts_as_taggable.rb b/lib/puppet/rails/external/tagging/acts_as_taggable.rb
deleted file mode 100644
index 7fd7f6b..0000000
--- a/lib/puppet/rails/external/tagging/acts_as_taggable.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-module ActiveRecord
- module Acts #:nodoc:
- module Taggable #:nodoc:
- def self.included(base)
- base.extend(ClassMethods)
- end
-
- module ClassMethods
- def acts_as_taggable(options = {})
- write_inheritable_attribute(:acts_as_taggable_options, {
- :taggable_type => ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s,
- :from => options[:from]
- })
-
- class_inheritable_reader :acts_as_taggable_options
-
- has_many :taggings, :as => :taggable, :dependent => :destroy
- has_many :tags, :through => :taggings
-
- include ActiveRecord::Acts::Taggable::InstanceMethods
- extend ActiveRecord::Acts::Taggable::SingletonMethods
- end
- end
-
- module SingletonMethods
- def find_tagged_with(list)
- find_by_sql([
- "SELECT #{table_name}.* FROM #{table_name}, tags, taggings " +
- "WHERE #{table_name}.#{primary_key} = taggings.taggable_id " +
- "AND taggings.taggable_type = ? " +
- "AND taggings.tag_id = tags.id AND tags.name IN (?)",
- acts_as_taggable_options[:taggable_type], list
- ])
- end
- def tags(options = {})
- options.merge!(:taggable_type => self.to_s)
- Tag.tags(options)
- end
- end
-
- module InstanceMethods
- def tag_with(list)
- Tag.transaction do
- taggings.destroy_all
-
- Tag.parse(list).each do |name|
- if acts_as_taggable_options[:from]
- send(acts_as_taggable_options[:from]).tags.find_or_create_by_name(name).on(self)
- else
- Tag.find_or_create_by_name(name).on(self)
- end
- end
- end
- end
-
- def tag_list
- tags.collect { |tag| tag.name.include?(" ") ? "'#{tag.name}'" : tag.name }.join(" ")
- end
- end
- end
- end
-end
diff --git a/lib/puppet/rails/external/tagging/init.rb b/lib/puppet/rails/external/tagging/init.rb
deleted file mode 100644
index 5069d80..0000000
--- a/lib/puppet/rails/external/tagging/init.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'puppet/rails/external/tagging/acts_as_taggable'
-ActiveRecord::Base.send(:include, ActiveRecord::Acts::Taggable)
-
-require 'puppet/rails/external/tagging/tagging'
-require 'puppet/rails/external/tagging/tag'
diff --git a/lib/puppet/rails/external/tagging/tag.rb b/lib/puppet/rails/external/tagging/tag.rb
deleted file mode 100644
index c6bf4ca..0000000
--- a/lib/puppet/rails/external/tagging/tag.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-class Tag < ActiveRecord::Base
- has_many :taggings
-
- def self.tags(options = {})
- query = "select tags.id, name, count(*) as count"
- query << " from taggings, tags"
- query << " where tags.id = tag_id"
- query << " group by tag_id"
- query << " order by #{options[:order]}" if options[:order] != nil
- query << " limit #{options[:limit]}" if options[:limit] != nil
- tags = Tag.find_by_sql(query)
- end
-
- def self.parse(list)
- tag_names = []
-
- # first, pull out the quoted tags
- list.gsub!(/\"(.*?)\"\s*/ ) { tag_names << $1; "" }
-
- # then, replace all commas with a space
- list.gsub!(/,/, " ")
-
- # then, get whatever's left
- tag_names.concat list.split(/\s/)
-
- # strip whitespace from the names
- tag_names = tag_names.map { |t| t.strip }
-
- # delete any blank tag names
- tag_names = tag_names.delete_if { |t| t.empty? }
-
- return tag_names
- end
-
- def tagged
- @tagged ||= taggings.collect { |tagging| tagging.taggable }
- end
-
- def on(taggable)
- taggings.build :taggable => taggable
- end
-
- def ==(comparison_object)
- super || name == comparison_object.to_s
- end
-
- def to_s
- name
- end
-end
diff --git a/lib/puppet/rails/external/tagging/tagging.rb b/lib/puppet/rails/external/tagging/tagging.rb
deleted file mode 100644
index e06e88a..0000000
--- a/lib/puppet/rails/external/tagging/tagging.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class Tagging < ActiveRecord::Base
- belongs_to :tag
- belongs_to :taggable, :polymorphic => true
-
- def self.tagged_class(taggable)
- ActiveRecord::Base.send(:class_name_of_active_record_descendant, taggable.class).to_s
- end
-
- def self.find_taggable(tagged_class, tagged_id)
- tagged_class.constantize.find(tagged_id)
- end
-end
\ No newline at end of file
diff --git a/lib/puppet/rails/fact_value.rb b/lib/puppet/rails/fact_value.rb
index 0eb70be..b53591d 100644
--- a/lib/puppet/rails/fact_value.rb
+++ b/lib/puppet/rails/fact_value.rb
@@ -1,6 +1,10 @@
class Puppet::Rails::FactValue < ActiveRecord::Base
belongs_to :fact_name
belongs_to :host
+
+ def to_label
+ "#{self.fact_name.name}"
+ end
end
# $Id: fact_value.rb 1952 2006-12-19 05:47:57Z luke $
diff --git a/lib/puppet/rails/host.rb b/lib/puppet/rails/host.rb
index 72898fd..626edaa 100644
--- a/lib/puppet/rails/host.rb
+++ b/lib/puppet/rails/host.rb
@@ -11,8 +11,7 @@ class Puppet::Rails::Host < ActiveRecord::Base
has_many :fact_values, :dependent => :destroy
has_many :fact_names, :through => :fact_values
- belongs_to :puppet_classes
- has_many :source_files
+ belongs_to :source_file
has_many :resources,
:include => :param_values,
:dependent => :destroy
diff --git a/lib/puppet/rails/param_value.rb b/lib/puppet/rails/param_value.rb
index 02c29c5..fc00a43 100644
--- a/lib/puppet/rails/param_value.rb
+++ b/lib/puppet/rails/param_value.rb
@@ -20,5 +20,9 @@ class Puppet::Rails::ParamValue < ActiveRecord::Base
self[:value] = val
end
end
+
+ def to_label
+ "#{self.param_name.name}"
+ end
end
diff --git a/lib/puppet/rails/puppet_class.rb b/lib/puppet/rails/puppet_class.rb
deleted file mode 100644
index 35cef89..0000000
--- a/lib/puppet/rails/puppet_class.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class Puppet::Rails::PuppetClass < ActiveRecord::Base
- has_many :resources
- has_many :source_files
- has_many :hosts
-end
-
diff --git a/lib/puppet/rails/resource_tag.rb b/lib/puppet/rails/resource_tag.rb
index d067118..f9694e0 100644
--- a/lib/puppet/rails/resource_tag.rb
+++ b/lib/puppet/rails/resource_tag.rb
@@ -1,4 +1,8 @@
class Puppet::Rails::ResourceTag < ActiveRecord::Base
belongs_to :puppet_tag
belongs_to :resource
+
+ def to_label
+ "#{self.puppet_tag.name}"
+ end
end
diff --git a/lib/puppet/rails/source_file.rb b/lib/puppet/rails/source_file.rb
index 51d1b1f..3ccf87a 100644
--- a/lib/puppet/rails/source_file.rb
+++ b/lib/puppet/rails/source_file.rb
@@ -1,5 +1,8 @@
class Puppet::Rails::SourceFile < ActiveRecord::Base
has_one :host
- has_one :puppet_class
has_one :resource
+
+ def to_label
+ "#{self.filename}"
+ end
end
diff --git a/lib/puppet/reference/node_source.rb b/lib/puppet/reference/node_source.rb
deleted file mode 100644
index 29a01f8..0000000
--- a/lib/puppet/reference/node_source.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'puppet/node'
-
-noderef = Puppet::Util::Reference.newreference :node_source, :doc => "Sources of node configuration information" do
- Puppet::Network::Handler.node.docs
-end
-
-noderef.header = "
-Nodes can be searched for in different locations. This document describes those different locations.
-"
diff --git a/lib/puppet/reference/report.rb b/lib/puppet/reference/report.rb
deleted file mode 100644
index a8086f8..0000000
--- a/lib/puppet/reference/report.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-report = Puppet::Util::Reference.newreference :report, :doc => "All available transaction reports" do
- Puppet::Network::Handler.report.reportdocs
-end
-
-report.header = "
-Puppet clients can report back to the server after each transaction. This
-transaction report is sent as a YAML dump of the
-``Puppet::Transaction::Report`` class and includes every log message that was
-generated during the transaction along with as many metrics as Puppet knows how
-to collect. See `ReportsAndReporting Reports and Reporting`:trac:
-for more information on how to use reports.
-
-Currently, clients default to not sending in reports; you can enable reporting
-by setting the ``report`` parameter to true.
-
-To use a report, set the ``reports`` parameter on the server; multiple
-reports must be comma-separated. You can also specify ``none`` to disable
-reports entirely.
-
-Puppet provides multiple report handlers that will process client reports:
-"
diff --git a/lib/puppet/relationship.rb b/lib/puppet/relationship.rb
index c611928..05b7dc3 100644
--- a/lib/puppet/relationship.rb
+++ b/lib/puppet/relationship.rb
@@ -59,7 +59,11 @@ class Puppet::Relationship
end
def ref
- "%s => %s" % [source.ref, target.ref]
+ "%s => %s" % [source, target]
+ end
+
+ def to_s
+ ref
end
end
diff --git a/lib/puppet/reports/tagmail.rb b/lib/puppet/reports/tagmail.rb
index a2c973f..9b37111 100644
--- a/lib/puppet/reports/tagmail.rb
+++ b/lib/puppet/reports/tagmail.rb
@@ -28,6 +28,10 @@ Puppet::Reports.register_report(:tagmail) do
This will send all messages to ``me at domain.com``, and all messages from
webservers that are not also from mailservers to ``httpadmins at domain.com``.
+
+ If you are using anti-spam controls, such as grey-listing, on your mail
+ server you should whitelist the sending email (controlled by ``reportform``
+ configuration option) to ensure your email is not discarded as spam.
"
@@ -127,7 +131,14 @@ Puppet::Reports.register_report(:tagmail) do
Net::SMTP.start(Puppet[:smtpserver]) do |smtp|
reports.each do |emails, messages|
Puppet.info "Sending report to %s" % emails.join(", ")
- smtp.send_message(messages, Puppet[:reportfrom], *emails)
+ smtp.open_message_stream(Puppet[:reportfrom], *emails) do |p|
+ p.puts "From: #{Puppet[:reportfrom]}"
+ p.puts "Subject: Puppet Report for %s" % self.host
+ p.puts "To: " + emails.join(", ")
+ p.puts "Date: " + Time.now.rfc2822
+ p.puts
+ p.puts messages
+ end
end
end
rescue => detail
diff --git a/lib/puppet/resource_reference.rb b/lib/puppet/resource_reference.rb
index 3e92662..771a91b 100644
--- a/lib/puppet/resource_reference.rb
+++ b/lib/puppet/resource_reference.rb
@@ -36,7 +36,7 @@ class Puppet::ResourceReference
# If the title has square brackets, treat it like a reference and
# set things appropriately; else, just set it.
def title=(value)
- if value =~ /^(.+)\[(.+)\]$/
+ if value =~ /^([^\[\]]+)\[(.+)\]$/
self.type = $1
@title = $2
else
diff --git a/lib/puppet/simple_graph.rb b/lib/puppet/simple_graph.rb
index c9920e6..48f393f 100644
--- a/lib/puppet/simple_graph.rb
+++ b/lib/puppet/simple_graph.rb
@@ -1,14 +1,11 @@
# Created by Luke A. Kanies on 2007-11-07.
# Copyright (c) 2007. All rights reserved.
-require 'puppet/external/gratr/dot'
+require 'puppet/external/dot'
require 'puppet/relationship'
-require 'puppet/external/gratr/search'
# A hopefully-faster graph class to replace the use of GRATR.
class Puppet::SimpleGraph
- include GRATR::Graph::Search
-
# An internal class for handling a vertex's edges.
class VertexWrapper
attr_accessor :in, :out, :vertex
@@ -52,6 +49,19 @@ class Puppet::SimpleGraph
return false
end
+ # Create methods for returning the degree and edges.
+ [:in, :out].each do |direction|
+ # LAK:NOTE If you decide to create methods for directly
+ # testing the degree, you'll have to get the values and flatten
+ # the results -- you might have duplicate edges, which can give
+ # a false impression of what the degree is. That's just
+ # as expensive as just getting the edge list, so I've decided
+ # to only add this method.
+ define_method("%s_edges" % direction) do
+ @adjacencies[direction].values.flatten
+ end
+ end
+
# The other vertex in the edge.
def other_vertex(direction, edge)
case direction
@@ -66,6 +76,10 @@ class Puppet::SimpleGraph
def remove_edge(direction, edge)
@adjacencies[direction][other_vertex(direction, edge)].delete(edge)
end
+
+ def to_s
+ vertex.to_s
+ end
end
def initialize
@@ -80,7 +94,7 @@ class Puppet::SimpleGraph
@edges.clear
end
- # Whether our graph is directed. Always true. (Used by the GRATR search lib.)
+ # Whether our graph is directed. Always true. Used to produce dot files.
def directed?
true
end
@@ -88,26 +102,58 @@ class Puppet::SimpleGraph
# Return a reversed version of this graph.
def reversal
result = self.class.new
- vertices.each { |vertex| result.add_vertex!(vertex) }
+ vertices.each { |vertex| result.add_vertex(vertex) }
edges.each do |edge|
newedge = edge.class.new(edge.target, edge.source, edge.label)
- result.add_edge!(newedge)
+ result.add_edge(newedge)
end
result
end
- # Return the size of the graph. Used by GRATR.
+ # Return the size of the graph.
def size
@vertices.length
end
- # Return the graph as an array. Again, used by GRATR.
+ # Return the graph as an array.
def to_a
@vertices.keys
end
+ # Provide a topological sort.
+ def topsort
+ degree = {}
+ zeros = []
+ result = []
+
+ # Collect each of our vertices, with the number of in-edges each has.
+ @vertices.each do |name, wrapper|
+ edges = wrapper.in_edges
+ zeros << wrapper if edges.length == 0
+ degree[wrapper.vertex] = edges
+ end
+
+ # Iterate over each 0-degree vertex, decrementing the degree of
+ # each of its out-edges.
+ while wrapper = zeros.pop do
+ result << wrapper.vertex
+ wrapper.out_edges.each do |edge|
+ degree[edge.target].delete(edge)
+ zeros << @vertices[edge.target] if degree[edge.target].length == 0
+ end
+ end
+
+ # If we have any vertices left with non-zero in-degrees, then we've found a cycle.
+ if cycles = degree.find_all { |vertex, edges| edges.length > 0 } and cycles.length > 0
+ message = cycles.collect { |vertex, edges| edges.collect { |e| e.to_s }.join(", ") }.join(", ")
+ raise Puppet::Error, "Found dependency cycles in the following relationships: %s" % message
+ end
+
+ return result
+ end
+
# Add a new vertex to the graph.
- def add_vertex!(vertex)
+ def add_vertex(vertex)
return false if vertex?(vertex)
setup_vertex(vertex)
true # don't return the VertexWrapper instance.
@@ -133,7 +179,7 @@ class Puppet::SimpleGraph
# Add a new edge. The graph user has to create the edge instance,
# since they have to specify what kind of edge it is.
- def add_edge!(source, target = nil, label = nil)
+ def add_edge(source, target = nil, label = nil)
if target
edge = Puppet::Relationship.new(source, target, label)
else
@@ -195,6 +241,27 @@ class Puppet::SimpleGraph
end
public
+
+# # For some reason, unconnected vertices do not show up in
+# # this graph.
+# def to_jpg(path, name)
+# gv = vertices()
+# Dir.chdir(path) do
+# induced_subgraph(gv).write_to_graphic_file('jpg', name)
+# end
+# end
+
+ def to_yaml_properties
+ instance_variables
+ end
+
+ # Just walk the tree and pass each edge.
+ def walk(source, direction, &block)
+ adjacent(source, :direction => direction).each do |target|
+ yield source, target
+ walk(target, direction, &block)
+ end
+ end
# LAK:FIXME This is just a paste of the GRATR code with slight modifications.
diff --git a/lib/puppet/sslcertificates.rb b/lib/puppet/sslcertificates.rb
index bd0ce8c..0c579d0 100755
--- a/lib/puppet/sslcertificates.rb
+++ b/lib/puppet/sslcertificates.rb
@@ -72,7 +72,7 @@ module Puppet::SSLCertificates
subject_alt_name << 'DNS:' + name.sub(/^[^.]+./, "puppet.") # add puppet.domain as an alias
end
key_usage = %w{digitalSignature keyEncipherment}
- ext_key_usage = %w{serverAuth clientAuth}
+ ext_key_usage = %w{serverAuth clientAuth emailProtection}
when :ocsp:
basic_constraint = "CA:FALSE"
key_usage = %w{nonRepudiation digitalSignature}
diff --git a/lib/puppet/sslcertificates/ca.rb b/lib/puppet/sslcertificates/ca.rb
index a3edd2c..7386318 100644
--- a/lib/puppet/sslcertificates/ca.rb
+++ b/lib/puppet/sslcertificates/ca.rb
@@ -194,8 +194,8 @@ class Puppet::SSLCertificates::CA
# Revoke the certificate with serial number SERIAL issued by this
# CA. The REASON must be one of the OpenSSL::OCSP::REVOKED_* reasons
def revoke(serial, reason = OpenSSL::OCSP::REVOKED_STATUS_KEYCOMPROMISE)
- if @config[:cacrl] == 'none'
- raise Puppet::Error, "Revocation requires a CRL, but ca_crl is set to 'none'"
+ if @config[:cacrl] == 'false'
+ raise Puppet::Error, "Revocation requires a CRL, but ca_crl is set to 'false'"
end
time = Time.now
revoked = OpenSSL::X509::Revoked.new
@@ -238,33 +238,6 @@ class Puppet::SSLCertificates::CA
}
end
- # Create an exclusive lock for reading and writing, and do the
- # writing in a tmp file.
- def readwritelock(file, mode = 0600)
- tmpfile = file + ".tmp"
- sync = Sync.new
- unless FileTest.directory?(File.dirname(tmpfile))
- raise Puppet::DevError, "Cannot create %s; directory %s does not exist" %
- [file, File.dirname(file)]
- end
- sync.synchronize(Sync::EX) do
- File.open(file, "r+", mode) do |rf|
- rf.lock_exclusive do
- File.open(tmpfile, "w", mode) do |tf|
- yield tf
- end
- begin
- File.rename(tmpfile, file)
- rescue => detail
- Puppet.err "Could not rename %s to %s: %s" %
- [file, tmpfile, detail]
- end
- end
- end
- end
- end
-
-
# Sign a given certificate request.
def sign(csr)
unless csr.is_a?(OpenSSL::X509::Request)
@@ -278,9 +251,8 @@ class Puppet::SSLCertificates::CA
end
serial = nil
- readwritelock(@config[:serial]) { |f|
+ Puppet.settings.readwritelock(:serial) { |f|
serial = File.read(@config[:serial]).chomp.hex
-
# increment the serial
f << "%04X" % (serial + 1)
}
@@ -372,7 +344,7 @@ class Puppet::SSLCertificates::CA
@crl = OpenSSL::X509::CRL.new(
File.read(@config[:cacrl])
)
- elsif @config[:cacrl] == 'none'
+ elsif @config[:cacrl] == 'false'
@crl = nil
else
# Create new CRL
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 6a49812..14b2037 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -15,8 +15,6 @@ class Transaction
# The list of events generated in this transaction.
attr_reader :events
- attr_writer :tags
-
include Puppet::Util
# Add some additional times for reporting
@@ -173,7 +171,7 @@ class Transaction
relationship_graph.add_resource(gen_child) unless relationship_graph.resource(gen_child.ref)
unless relationship_graph.edge?(edge[1], edge[0])
- relationship_graph.add_edge!(*edge)
+ relationship_graph.add_edge(*edge)
else
resource.debug "Skipping automatic relationship to %s" % gen_child
end
@@ -424,7 +422,7 @@ class Transaction
# Should we ignore tags?
def ignore_tags?
- ! @catalog.host_config?
+ ! (@catalog.host_config? or Puppet[:name] == "puppet")
end
# this should only be called by a Puppet::Type::Component resource now
@@ -636,6 +634,11 @@ class Transaction
@tags
end
+
+ def tags=(tags)
+ tags = [tags] unless tags.is_a?(Array)
+ @tags = tags
+ end
# Is this resource tagged appropriately?
def missing_tags?(resource)
diff --git a/lib/puppet/transportable.rb b/lib/puppet/transportable.rb
index c1d68a8..f686fbb 100644
--- a/lib/puppet/transportable.rb
+++ b/lib/puppet/transportable.rb
@@ -193,7 +193,7 @@ module Puppet
next unless resource = child.to_type
config.add_resource resource
end
- config.add_edge!(container, resource)
+ config.add_edge(container, resource)
if child.is_a?(self.class)
delver.call(child)
end
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index def9e44..09003e8 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -257,10 +257,7 @@ class Type
rescue ArgumentError, Puppet::Error, TypeError
raise
rescue => detail
- error = Puppet::DevError.new(
- "Could not set %s on %s: %s" %
- [attr, self.class.name, detail]
- )
+ error = Puppet::DevError.new( "Could not set %s on %s: %s" % [attr, self.class.name, detail])
error.set_backtrace(detail.backtrace)
raise error
end
@@ -422,10 +419,6 @@ end
require 'puppet/propertychange'
require 'puppet/provider'
-require 'puppet/type/component'
-require 'puppet/type/pfile'
-require 'puppet/type/pfilebucket'
-require 'puppet/type/tidy'
-
-
+# Always load these types.
+require 'puppet/type/component'
diff --git a/lib/puppet/type/cron.rb b/lib/puppet/type/cron.rb
index 17cb166..c46a7c8 100755
--- a/lib/puppet/type/cron.rb
+++ b/lib/puppet/type/cron.rb
@@ -23,6 +23,24 @@ Puppet::Type.newtype(:cron) do
hour => 2,
minute => 0
}
+
+ Note that all cron values can be specified as an array of values::
+
+ cron { logrotate:
+ command => \"/usr/sbin/logrotate\",
+ user => root,
+ hour => [2, 4]
+ }
+
+ Or using ranges, or the step syntax ``*/2`` (although there's no guarantee that
+ your ``cron`` daemon supports it)::
+
+ cron { logrotate:
+ command => \"/usr/sbin/logrotate\",
+ user => root,
+ hour => ['2-4'],
+ minute => '*/10'
+ }
"
ensurable
diff --git a/lib/puppet/type/exec.rb b/lib/puppet/type/exec.rb
index 5bb3158..2772b54 100755
--- a/lib/puppet/type/exec.rb
+++ b/lib/puppet/type/exec.rb
@@ -211,10 +211,7 @@ module Puppet
log the output when the command reports an error. Values are
**true**, *false*, *on_failure*, and any legal log level."
- values = [:true, :false, :on_failure]
- # And all of the log levels
- Puppet::Util::Log.eachlevel { |level| values << level }
- newvalues(*values)
+ newvalues(:true, :false, :on_failure)
end
newparam(:refresh) do
@@ -229,6 +226,15 @@ module Puppet
end
newparam(:env) do
+ desc "This parameter is deprecated. Use 'environment' instead."
+
+ munge do |value|
+ warning "'env' is deprecated on exec; use 'environment' instead."
+ resource[:environment] = value
+ end
+ end
+
+ newparam(:environment) do
desc "Any additional environment variables you want to set for a
command. Note that if you use this to set PATH, it will override
the ``path`` attribute. Multiple environment variables should be
@@ -279,7 +285,7 @@ module Puppet
# Rebuild the database, but only when the file changes
exec { newaliases:
path => [\"/usr/bin\", \"/usr/sbin\"],
- subscribe => file[\"/etc/aliases\"],
+ subscribe => File[\"/etc/aliases\"],
refreshonly => true
}
@@ -554,32 +560,32 @@ module Puppet
begin
# Do our chdir
Dir.chdir(dir) do
- env = {}
+ environment = {}
if self[:path]
- env[:PATH] = self[:path].join(":")
+ environment[:PATH] = self[:path].join(":")
end
- if envlist = self[:env]
+ if envlist = self[:environment]
envlist = [envlist] unless envlist.is_a? Array
envlist.each do |setting|
if setting =~ /^(\w+)=((.|\n)+)$/
name = $1
value = $2
- if env.include? name
+ if environment.include? name
warning(
"Overriding environment setting '%s' with '%s'" %
[name, value]
)
end
- env[name] = value
+ environment[name] = value
else
- warning "Cannot understand env setting %s" % setting.inspect
+ warning "Cannot understand environment setting %s" % setting.inspect
end
end
end
- withenv env do
+ withenv environment do
Timeout::timeout(self[:timeout]) do
output, status = Puppet::Util::SUIDManager.run_and_capture(
[command], self[:user], self[:group]
diff --git a/lib/puppet/type/pfile.rb b/lib/puppet/type/file.rb
similarity index 93%
rename from lib/puppet/type/pfile.rb
rename to lib/puppet/type/file.rb
index f86e1e2..3518e8b 100644
--- a/lib/puppet/type/pfile.rb
+++ b/lib/puppet/type/file.rb
@@ -5,10 +5,12 @@ require 'uri'
require 'fileutils'
require 'puppet/network/handler'
require 'puppet/util/diff'
+require 'puppet/util/checksums'
module Puppet
newtype(:file) do
include Puppet::Util::MethodHelper
+ include Puppet::Util::Checksums
@doc = "Manages local files, including setting ownership and
permissions, creation of both files and directories, and
retrieving entire files from remote servers. As Puppet matures, it
@@ -173,11 +175,9 @@ module Puppet
recursion), and ``follow`` will manage the file to which the
link points."
- newvalues(:follow, :manage, :ignore)
+ newvalues(:follow, :manage)
- # :ignore and :manage behave equivalently on local files,
- # but don't copy remote links
- defaultto :ignore
+ defaultto :manage
end
newparam(:purge, :boolean => true) do
@@ -460,7 +460,9 @@ module Puppet
super
# Get rid of any duplicate slashes, and remove any trailing slashes.
- @title = @title.gsub(/\/+/, "/").sub(/\/$/, "")
+ @title = @title.gsub(/\/+/, "/")
+
+ @title.sub!(/\/$/, "") unless @title == "/"
# Clean out as many references to any file paths as possible.
# This was the source of many, many bugs.
@@ -640,7 +642,6 @@ module Puppet
# :file.
return nil unless child = catalog.create_implicit_resource(self.class.name, args)
rescue => detail
- puts detail.backtrace
self.notice "Cannot manage: %s" % [detail]
return nil
end
@@ -648,7 +649,7 @@ module Puppet
# LAK:FIXME This shouldn't be necessary, but as long as we're
# modeling the relationship graph specifically, it is.
- catalog.relationship_graph.add_edge! self, child
+ catalog.relationship_graph.add_edge self, child
return child
end
@@ -767,11 +768,8 @@ module Puppet
begin
File.unlink(newfile)
rescue => detail
- if Puppet[:trace]
- puts detail.backtrace
- end
- self.err "Could not remove old backup: %s" %
- detail
+ puts detail.backtrace if Puppet[:trace]
+ self.err "Could not remove old backup: %s" % detail
return false
end
end
@@ -781,9 +779,7 @@ module Puppet
def remove_existing(should)
return unless s = stat(true)
- unless handlebackup
- self.fail "Could not back up; will not replace"
- end
+ self.fail "Could not back up; will not replace" unless handlebackup
unless should.to_s == "link"
return if s.ftype.to_s == should.to_s
@@ -792,8 +788,7 @@ module Puppet
case s.ftype
when "directory":
if self[:force] == :true
- debug "Removing existing directory for replacement with %s" %
- should
+ debug "Removing existing directory for replacement with %s" % should
FileUtils.rmtree(self[:path])
else
notice "Not removing directory; use 'force' to override"
@@ -977,7 +972,7 @@ module Puppet
end
def uri2obj(source)
- sourceobj = FileSource.new
+ sourceobj = Puppet::Type::File::FileSource.new
path = nil
unless source
devfail "Got a nil source"
@@ -1033,54 +1028,38 @@ module Puppet
return [sourceobj, path.sub(/\/\//, '/')]
end
- # Write out the file. We open the file correctly, with all of the
- # uid and mode and such, and then yield the file handle for actual
- # writing.
- def write(property, usetmp = true)
- mode = self.should(:mode)
+ # Write out the file. Requires the content to be written,
+ # the property name for logging, and the checksum for validation.
+ def write(content, property, checksum = nil)
+ if validate = validate_checksum?
+ # Use the appropriate checksum type -- md5, md5lite, etc.
+ sumtype = property(:checksum).checktype
+ checksum ||= "{#{sumtype}}" + property(:checksum).send(sumtype, content)
+ end
remove_existing(:file)
- # The temporary file
- path = nil
- if usetmp
- path = self[:path] + ".puppettmp"
- else
- path = self[:path]
- end
-
- # As the correct user and group
- write_if_writable(File.dirname(path)) do
- f = nil
- # Open our file with the correct modes
- if mode
- Puppet::Util.withumask(000) do
- f = File.open(path,
- File::CREAT|File::WRONLY|File::TRUNC, mode)
- end
- else
- f = File.open(path, File::CREAT|File::WRONLY|File::TRUNC)
- end
+ use_temporary_file = (content.length != 0)
+ path = self[:path]
+ path += ".puppettmp" if use_temporary_file
- # Yield it
- yield f
+ mode = self.should(:mode) # might be nil
+ umask = mode ? 000 : 022
- f.flush
- f.close
+ Puppet::Util.withumask(umask) do
+ File.open(path, File::CREAT|File::WRONLY|File::TRUNC, mode) { |f| f.print content }
end
# And put our new file in place
- if usetmp
+ if use_temporary_file # This is only not true when our file is empty.
begin
+ fail_if_checksum_is_wrong(path, checksum) if validate
File.rename(path, self[:path])
rescue => detail
- self.err "Could not rename tmp %s for replacing: %s" %
- [self[:path], detail]
+ self.err "Could not rename tmp %s for replacing: %s" % [self[:path], detail]
ensure
# Make sure the created file gets removed
- if FileTest.exists?(path)
- File.unlink(path)
- end
+ File.unlink(path) if FileTest.exists?(path)
end
end
@@ -1088,32 +1067,35 @@ module Puppet
property_fix
# And then update our checksum, so the next run doesn't find it.
- # FIXME This is extra work, because it's going to read the whole
- # file back in again.
- self.setchecksum
-
+ self.setchecksum(checksum)
end
-
- # Run the block as the specified user if the dir is writeable, else
- # run it as root (or the current user).
- def write_if_writable(dir)
- yield
- # We're getting different behaviors from different versions of ruby, so...
- # asroot = true
- # Puppet::Util::SUIDManager.asuser(asuser(), self.should(:group)) do
- # if FileTest.writable?(dir)
- # asroot = false
- # yield
- # end
- # end
- #
- # if asroot
- # yield
- # end
+
+ # Should we validate the checksum of the file we're writing?
+ def validate_checksum?
+ if sumparam = @parameters[:checksum]
+ return sumparam.checktype.to_s !~ /time/
+ else
+ return false
+ end
end
private
+ # Make sure the file we wrote out is what we think it is.
+ def fail_if_checksum_is_wrong(path, checksum)
+ if checksum =~ /^\{(\w+)\}.+/
+ sumtype = $1
+ else
+ # This shouldn't happen, but if it happens to, it's nicer
+ # to just use a default sumtype than fail.
+ sumtype = "md5"
+ end
+ newsum = property(:checksum).getsum(sumtype, path)
+ return if newsum == checksum
+
+ self.fail "File written to disk did not match checksum; discarding changes (%s vs %s)" % [checksum, newsum]
+ end
+
# Override the parent method, because we don't want to generate changes
# when the file is missing and there is no 'ensure' state.
def propertychanges(currentvalues)
@@ -1150,20 +1132,20 @@ module Puppet
# the filesource class can't include the path, because the path
# changes for every file instance
- class FileSource
+ class ::Puppet::Type::File::FileSource
attr_accessor :mount, :root, :server, :local
end
# We put all of the properties in separate files, because there are so many
# of them. The order these are loaded is important, because it determines
# the order they are in the property lit.
- require 'puppet/type/pfile/checksum'
- require 'puppet/type/pfile/content' # can create the file
- require 'puppet/type/pfile/source' # can create the file
- require 'puppet/type/pfile/target' # creates a different type of file
- require 'puppet/type/pfile/ensure' # can create the file
- require 'puppet/type/pfile/owner'
- require 'puppet/type/pfile/group'
- require 'puppet/type/pfile/mode'
- require 'puppet/type/pfile/type'
+ require 'puppet/type/file/checksum'
+ require 'puppet/type/file/content' # can create the file
+ require 'puppet/type/file/source' # can create the file
+ require 'puppet/type/file/target' # creates a different type of file
+ require 'puppet/type/file/ensure' # can create the file
+ require 'puppet/type/file/owner'
+ require 'puppet/type/file/group'
+ require 'puppet/type/file/mode'
+ require 'puppet/type/file/type'
end
diff --git a/lib/puppet/type/file/checksum.rb b/lib/puppet/type/file/checksum.rb
new file mode 100755
index 0000000..3be147c
--- /dev/null
+++ b/lib/puppet/type/file/checksum.rb
@@ -0,0 +1,274 @@
+require 'puppet/util/checksums'
+
+# Keep a copy of the file checksums, and notify when they change. This
+# property never actually modifies the system, it only notices when the system
+# changes on its own.
+Puppet::Type.type(:file).newproperty(:checksum) do
+ include Puppet::Util::Checksums
+
+ desc "How to check whether a file has changed. This state is used internally
+ for file copying, but it can also be used to monitor files somewhat
+ like Tripwire without managing the file contents in any way. You can
+ specify that a file's checksum should be monitored and then subscribe to
+ the file from another object and receive events to signify
+ checksum changes, for instance."
+
+ @event = :file_changed
+
+ @unmanaged = true
+
+ @validtypes = %w{md5 md5lite timestamp mtime time}
+
+ def self.validtype?(type)
+ @validtypes.include?(type)
+ end
+
+ @validtypes.each do |ctype|
+ newvalue(ctype) do
+ handlesum()
+ end
+ end
+
+ str = @validtypes.join("|")
+
+ # This is here because Puppet sets this internally, using
+ # {md5}......
+ newvalue(/^\{#{str}\}/) do
+ handlesum()
+ end
+
+ newvalue(:nosum) do
+ # nothing
+ :nochange
+ end
+
+ # If they pass us a sum type, behave normally, but if they pass
+ # us a sum type + sum, stick the sum in the cache.
+ munge do |value|
+ if value =~ /^\{(\w+)\}(.+)$/
+ type = symbolize($1)
+ sum = $2
+ cache(type, sum)
+ return type
+ else
+ if FileTest.directory?(@resource[:path])
+ return :time
+ else
+ return symbolize(value)
+ end
+ end
+ end
+
+ # Store the checksum in the data cache, or retrieve it if only the
+ # sum type is provided.
+ def cache(type, sum = nil)
+ unless type
+ raise ArgumentError, "A type must be specified to cache a checksum"
+ end
+ type = symbolize(type)
+ type = :mtime if type == :timestamp
+ type = :ctime if type == :time
+
+ unless state = @resource.cached(:checksums)
+ self.debug "Initializing checksum hash"
+ state = {}
+ @resource.cache(:checksums, state)
+ end
+
+ if sum
+ unless sum =~ /\{\w+\}/
+ sum = "{%s}%s" % [type, sum]
+ end
+ state[type] = sum
+ else
+ return state[type]
+ end
+ end
+
+ # Because source and content and whomever else need to set the checksum
+ # and do the updating, we provide a simple mechanism for doing so.
+ def checksum=(value)
+ munge(@should)
+ self.updatesum(value)
+ end
+
+ def checktype
+ self.should || :md5
+ end
+
+ # Checksums need to invert how changes are printed.
+ def change_to_s(currentvalue, newvalue)
+ begin
+ if currentvalue == :absent
+ return "defined '%s' as '%s'" %
+ [self.name, self.currentsum]
+ elsif newvalue == :absent
+ return "undefined %s from '%s'" %
+ [self.name, self.is_to_s(currentvalue)]
+ else
+ if defined? @cached and @cached
+ return "%s changed '%s' to '%s'" %
+ [self.name, @cached, self.is_to_s(currentvalue)]
+ else
+ return "%s changed '%s' to '%s'" %
+ [self.name, self.currentsum, self.is_to_s(currentvalue)]
+ end
+ end
+ rescue Puppet::Error, Puppet::DevError
+ raise
+ rescue => detail
+ raise Puppet::DevError, "Could not convert change %s to string: %s" %
+ [self.name, detail]
+ end
+ end
+
+ def currentsum
+ cache(checktype())
+ end
+
+ # Retrieve the cached sum
+ def getcachedsum
+ hash = nil
+ unless hash = @resource.cached(:checksums)
+ hash = {}
+ @resource.cache(:checksums, hash)
+ end
+
+ sumtype = self.should
+
+ if hash.include?(sumtype)
+ #self.notice "Found checksum %s for %s" %
+ # [hash[sumtype] , at resource[:path]]
+ sum = hash[sumtype]
+
+ unless sum =~ /^\{\w+\}/
+ sum = "{%s}%s" % [sumtype, sum]
+ end
+ return sum
+ elsif hash.empty?
+ #self.notice "Could not find sum of type %s" % sumtype
+ return :nosum
+ else
+ #self.notice "Found checksum for %s but not of type %s" %
+ # [@resource[:path],sumtype]
+ return :nosum
+ end
+ end
+
+ # Calculate the sum from disk.
+ def getsum(checktype, file = nil)
+ sum = ""
+
+ checktype = :mtime if checktype == :timestamp
+ checktype = :ctime if checktype == :time
+
+ file ||= @resource[:path]
+
+ return nil unless FileTest.exist?(file)
+
+ if ! FileTest.file?(file)
+ checktype = :mtime
+ end
+ method = checktype.to_s + "_file"
+
+ self.fail("Invalid checksum type %s" % checktype) unless respond_to?(method)
+
+ return "{%s}%s" % [checktype, send(method, file)]
+ end
+
+ # At this point, we don't actually modify the system, we modify
+ # the stored state to reflect the current state, and then kick
+ # off an event to mark any changes.
+ def handlesum
+ currentvalue = self.retrieve
+ if currentvalue.nil?
+ raise Puppet::Error, "Checksum state for %s is somehow nil" %
+ @resource.title
+ end
+
+ if self.insync?(currentvalue)
+ self.debug "Checksum is already in sync"
+ return nil
+ end
+ # If we still can't retrieve a checksum, it means that
+ # the file still doesn't exist
+ if currentvalue == :absent
+ # if they're copying, then we won't worry about the file
+ # not existing yet
+ unless @resource.property(:source)
+ self.warning("File %s does not exist -- cannot checksum" % @resource[:path])
+ end
+ return nil
+ end
+
+ # If the sums are different, then return an event.
+ if self.updatesum(currentvalue)
+ return :file_changed
+ else
+ return nil
+ end
+ end
+
+ def insync?(currentvalue)
+ @should = [checktype()]
+ if cache(checktype())
+ return currentvalue == currentsum()
+ else
+ # If there's no cached sum, then we don't want to generate
+ # an event.
+ return true
+ end
+ end
+
+ # Even though they can specify multiple checksums, the insync?
+ # mechanism can really only test against one, so we'll just retrieve
+ # the first specified sum type.
+ def retrieve(usecache = false)
+ # When the 'source' is retrieving, it passes "true" here so
+ # that we aren't reading the file twice in quick succession, yo.
+ currentvalue = currentsum()
+ return currentvalue if usecache and currentvalue
+
+ stat = nil
+ return :absent unless stat = @resource.stat
+
+ if stat.ftype == "link" and @resource[:links] != :follow
+ self.debug "Not checksumming symlink"
+ # @resource.delete(:checksum)
+ return currentvalue
+ end
+
+ # Just use the first allowed check type
+ currentvalue = getsum(checktype())
+
+ # If there is no sum defined, then store the current value
+ # into the cache, so that we're not marked as being
+ # out of sync. We don't want to generate an event the first
+ # time we get a sum.
+ self.updatesum(currentvalue) unless cache(checktype())
+
+ # @resource.debug "checksum state is %s" % self.is
+ return currentvalue
+ end
+
+ # Store the new sum to the state db.
+ def updatesum(newvalue)
+ result = false
+
+ # if we're replacing, vs. updating
+ if sum = cache(checktype())
+ return false if newvalue == sum
+
+ self.debug "Replacing %s checksum %s with %s" % [@resource.title, sum, newvalue]
+ result = true
+ else
+ @resource.debug "Creating checksum %s" % newvalue
+ result = false
+ end
+
+ # Cache the sum so the log message can be right if possible.
+ @cached = sum
+ cache(checktype(), newvalue)
+ return result
+ end
+end
diff --git a/lib/puppet/type/pfile/content.rb b/lib/puppet/type/file/content.rb
similarity index 78%
rename from lib/puppet/type/pfile/content.rb
rename to lib/puppet/type/file/content.rb
index 6dcda0a..1eb1423 100755
--- a/lib/puppet/type/pfile/content.rb
+++ b/lib/puppet/type/file/content.rb
@@ -1,5 +1,5 @@
module Puppet
- Puppet.type(:file).newproperty(:content) do
+ Puppet::Type.type(:file).newproperty(:content) do
include Puppet::Util::Diff
desc "Specify the contents of a file as a string. Newlines, tabs, and
@@ -47,23 +47,13 @@ module Puppet
return result
end
- # We should probably take advantage of existing md5 sums if they're there,
- # but I really don't feel like dealing with the complexity right now.
def retrieve
- stat = nil
- unless stat = @resource.stat
- return :absent
- end
+ return :absent unless stat = @resource.stat
- if stat.ftype == "link" and @resource[:links] == :ignore
- return self.should
- end
+ return self.should if stat.ftype == "link" and @resource[:links] == :ignore
# Don't even try to manage the content on directories
- if stat.ftype == "directory" and @resource[:links] == :ignore
- @resource.delete(:content)
- return nil
- end
+ return nil if stat.ftype == "directory"
begin
currentvalue = File.read(@resource[:path])
@@ -74,12 +64,17 @@ module Puppet
end
end
+ # Make sure we're also managing the checksum property.
+ def should=(value)
+ super
+ @resource.newattr(:checksum) unless @resource.property(:checksum)
+ end
# Just write our content out to disk.
def sync
return_event = @resource.stat ? :file_changed : :file_created
- @resource.write(:content) { |f| f.print self.should }
+ @resource.write(self.should, :content)
return return_event
end
diff --git a/lib/puppet/type/pfile/ensure.rb b/lib/puppet/type/file/ensure.rb
similarity index 90%
rename from lib/puppet/type/pfile/ensure.rb
rename to lib/puppet/type/file/ensure.rb
index 0a6f73d..0d21712 100755
--- a/lib/puppet/type/pfile/ensure.rb
+++ b/lib/puppet/type/file/ensure.rb
@@ -46,7 +46,7 @@ module Puppet
if property = (@resource.property(:content) || @resource.property(:source))
property.sync
else
- @resource.write(false) { |f| f.flush }
+ @resource.write("", :ensure)
mode = @resource.should(:mode)
end
return :file_created
@@ -67,14 +67,12 @@ module Puppet
"Cannot create %s; parent directory %s does not exist" %
[@resource[:path], parent]
end
- @resource.write_if_writable(parent) do
- if mode
- Puppet::Util.withumask(000) do
- Dir.mkdir(@resource[:path],mode)
- end
- else
- Dir.mkdir(@resource[:path])
+ if mode
+ Puppet::Util.withumask(000) do
+ Dir.mkdir(@resource[:path],mode)
end
+ else
+ Dir.mkdir(@resource[:path])
end
@resource.send(:property_fix)
@resource.setchecksum
@@ -101,9 +99,13 @@ module Puppet
munge do |value|
value = super(value)
+ # It doesn't make sense to try to manage links unless, well,
+ # we're managing links.
+ resource[:links] = :manage if value == :link
return value if value.is_a? Symbol
@resource[:target] = value
+ resource[:links] = :manage
return :link
end
@@ -136,6 +138,11 @@ module Puppet
# We have to treat :present specially, because it works with any
# type of file.
def insync?(currentvalue)
+ if property = @resource.property(:source) and ! property.described?
+ warning "No specified sources exist"
+ return true
+ end
+
if self.should == :present
if currentvalue.nil? or currentvalue == :absent
return false
diff --git a/lib/puppet/type/pfile/group.rb b/lib/puppet/type/file/group.rb
similarity index 100%
rename from lib/puppet/type/pfile/group.rb
rename to lib/puppet/type/file/group.rb
diff --git a/lib/puppet/type/pfile/mode.rb b/lib/puppet/type/file/mode.rb
similarity index 100%
rename from lib/puppet/type/pfile/mode.rb
rename to lib/puppet/type/file/mode.rb
diff --git a/lib/puppet/type/pfile/owner.rb b/lib/puppet/type/file/owner.rb
similarity index 100%
rename from lib/puppet/type/pfile/owner.rb
rename to lib/puppet/type/file/owner.rb
diff --git a/lib/puppet/type/pfile/source.rb b/lib/puppet/type/file/source.rb
similarity index 84%
rename from lib/puppet/type/pfile/source.rb
rename to lib/puppet/type/file/source.rb
index 1849d5a..1b0dd31 100755
--- a/lib/puppet/type/pfile/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -101,15 +101,17 @@ module Puppet
begin
desc = server.describe(path, @resource[:links])
rescue Puppet::Network::XMLRPCClientError => detail
- self.err "Could not describe %s: %s" %
- [path, detail]
+ self.err "Could not describe %s: %s" % [path, detail]
return nil
end
+ return nil if desc == ""
+
+ # Collect everything except the checksum
+ values = desc.split("\t")
+ other = values.pop
args = {}
- pinparams.zip(
- desc.split("\t")
- ).each { |param, value|
+ pinparams.zip(values).each { |param, value|
if value =~ /^[0-9]+$/
value = value.to_i
end
@@ -118,16 +120,19 @@ module Puppet
end
}
- # we can't manage ownership as root, so don't even try
- unless Puppet::Util::SUIDManager.uid == 0
- args.delete(:owner)
+ # Now decide whether we're doing checksums or symlinks
+ if args[:type] == "link"
+ args[:target] = other
+ else
+ args[:checksum] = other
end
- if args.empty? or (args[:type] == "link" and @resource[:links] == :ignore)
- return nil
- else
- return args
+ # we can't manage ownership unless we're root, so don't even try
+ unless Puppet::Util::SUIDManager.uid == 0
+ args.delete(:owner)
end
+
+ return args
end
# Have we successfully described the remote source?
@@ -138,10 +143,10 @@ module Puppet
# Use the info we get from describe() to check if we're in sync.
def insync?(currentvalue)
unless described?
- info "No specified sources exist"
+ warning "No specified sources exist"
return true
end
-
+
if currentvalue == :nocopy
return true
end
@@ -163,7 +168,7 @@ module Puppet
# Diff the contents if they ask it. This is quite annoying -- we need to do this in
# 'insync?' because they might be in noop mode, but we don't want to do the file
- # retrieval twice, so we cache the value annoyingly.
+ # retrieval twice, so we cache the value.
if ! result and Puppet[:show_diff] and File.exists?(@resource[:path]) and ! @stats[:_diffed]
@stats[:_remote_content] = get_remote_content
string_file_diff(@resource[:path], @stats[:_remote_content])
@@ -173,7 +178,7 @@ module Puppet
end
def pinparams
- Puppet::Network::Handler.handler(:fileserver).params
+ [:mode, :type, :owner, :group]
end
# This basically calls describe() on our file, and then sets all
@@ -202,14 +207,11 @@ module Puppet
end
case @stats[:type]
- when "directory", "file":
- unless @resource.deleting?
- @resource[:ensure] = @stats[:type]
- end
+ when "directory", "file", "link":
+ @resource[:ensure] = @stats[:type] unless @resource.deleting?
else
self.info @stats.inspect
- self.err "Cannot use files of type %s as sources" %
- @stats[:type]
+ self.err "Cannot use files of type %s as sources" % @stats[:type]
return :nocopy
end
@@ -221,11 +223,9 @@ module Puppet
# was the stat already specified, or should the value
# be inherited from the source?
- unless @resource.argument?(stat)
- @resource[stat] = value
- end
+ @resource[stat] = value unless @resource.argument?(stat)
}
-
+
return @stats[:checksum]
end
@@ -241,9 +241,7 @@ module Puppet
checks.delete(:checksum)
@resource[:check] = checks
- unless @resource.property(:checksum)
- @resource[:checksum] = :md5
- end
+ @resource[:checksum] = :md5 unless @resource.property(:checksum)
end
def sync
@@ -251,7 +249,7 @@ module Puppet
exists = File.exists?(@resource[:path])
- @resource.write(:source) { |f| f.print contents }
+ @resource.write(contents, :source, @stats[:checksum])
if exists
return :file_changed
@@ -261,34 +259,22 @@ module Puppet
end
private
+
def get_remote_content
- unless @stats[:type] == "file"
- #if @stats[:type] == "directory"
- #[@resource.name, @should.inspect]
- #end
- raise Puppet::DevError, "Got told to copy non-file %s" %
- @resource[:path]
- end
+ raise Puppet::DevError, "Got told to copy non-file %s" % @resource[:path] unless @stats[:type] == "file"
sourceobj, path = @resource.uri2obj(@source)
begin
contents = sourceobj.server.retrieve(path, @resource[:links])
- rescue Puppet::Network::XMLRPCClientError => detail
- self.err "Could not retrieve %s: %s" %
- [path, detail]
- return nil
+ rescue => detail
+ self.fail "Could not retrieve %s: %s" % [path, detail]
end
- # FIXME It's stupid that this isn't taken care of in the
- # protocol.
- unless sourceobj.server.local
- contents = CGI.unescape(contents)
- end
+ contents = CGI.unescape(contents) unless sourceobj.server.local
if contents == ""
- self.notice "Could not retrieve contents for %s" %
- @source
+ self.notice "Could not retrieve contents for %s" % @source
end
return contents
diff --git a/lib/puppet/type/pfile/target.rb b/lib/puppet/type/file/target.rb
similarity index 100%
rename from lib/puppet/type/pfile/target.rb
rename to lib/puppet/type/file/target.rb
diff --git a/lib/puppet/type/pfile/type.rb b/lib/puppet/type/file/type.rb
similarity index 100%
rename from lib/puppet/type/pfile/type.rb
rename to lib/puppet/type/file/type.rb
diff --git a/lib/puppet/type/pfilebucket.rb b/lib/puppet/type/filebucket.rb
similarity index 100%
rename from lib/puppet/type/pfilebucket.rb
rename to lib/puppet/type/filebucket.rb
diff --git a/lib/puppet/type/host.rb b/lib/puppet/type/host.rb
index be5c2ed..3e34c0b 100755
--- a/lib/puppet/type/host.rb
+++ b/lib/puppet/type/host.rb
@@ -4,6 +4,13 @@ module Puppet
newproperty(:ip) do
desc "The host's IP address, IPv4 or IPv6."
+
+ validate do |value|
+ unless value =~ /((([0-9a-fA-F]+:){7}[0-9a-fA-F]+)|(([0-9a-fA-F]+:)*[0-9a-fA-F]+)?::(([0-9a-fA-F]+:)*[0-9a-fA-F]+)?)|((25[0-5]|2[0-4][\d]|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})/
+ raise Puppet::Error, "Invalid IP address"
+ end
+ end
+
end
newproperty(:alias) do
@@ -78,6 +85,12 @@ module Puppet
desc "The host name."
isnamevar
+
+ validate do |value|
+ unless value =~ /^\w+-?[\w+]?\.?[\w+.{1}]*\w+$/
+ raise Puppet::Error, "Invalid host name"
+ end
+ end
end
@doc = "Installs and manages host entries. For most systems, these
diff --git a/lib/puppet/type/mailalias.rb b/lib/puppet/type/mailalias.rb
index 92f6092..50ca26e 100755
--- a/lib/puppet/type/mailalias.rb
+++ b/lib/puppet/type/mailalias.rb
@@ -9,7 +9,7 @@ module Puppet
end
newproperty(:recipient, :array_matching => :all) do
- desc "Where email should should be sent. Multiple values
+ desc "Where email should be sent. Multiple values
should be specified as an array."
def is_to_s(value)
diff --git a/lib/puppet/type/nagios_command.rb b/lib/puppet/type/nagios_command.rb
new file mode 100644
index 0000000..0d0e11b
--- /dev/null
+++ b/lib/puppet/type/nagios_command.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :command
diff --git a/lib/puppet/type/nagios_contact.rb b/lib/puppet/type/nagios_contact.rb
new file mode 100644
index 0000000..d5a1f3c
--- /dev/null
+++ b/lib/puppet/type/nagios_contact.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :contact
diff --git a/lib/puppet/type/nagios_contactgroup.rb b/lib/puppet/type/nagios_contactgroup.rb
new file mode 100644
index 0000000..b8f14c0
--- /dev/null
+++ b/lib/puppet/type/nagios_contactgroup.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :contactgroup
diff --git a/lib/puppet/type/nagios_host.rb b/lib/puppet/type/nagios_host.rb
new file mode 100644
index 0000000..f2e03f6
--- /dev/null
+++ b/lib/puppet/type/nagios_host.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :host
diff --git a/lib/puppet/type/nagios_hostextinfo.rb b/lib/puppet/type/nagios_hostextinfo.rb
new file mode 100644
index 0000000..da8e08d
--- /dev/null
+++ b/lib/puppet/type/nagios_hostextinfo.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :hostextinfo
diff --git a/lib/puppet/type/nagios_hostgroup.rb b/lib/puppet/type/nagios_hostgroup.rb
new file mode 100644
index 0000000..e1943be
--- /dev/null
+++ b/lib/puppet/type/nagios_hostgroup.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :hostgroup
diff --git a/lib/puppet/type/nagios_hostgroupescalation.rb b/lib/puppet/type/nagios_hostgroupescalation.rb
new file mode 100644
index 0000000..21b39f6
--- /dev/null
+++ b/lib/puppet/type/nagios_hostgroupescalation.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :hostgroupescalation
diff --git a/lib/puppet/type/nagios_service.rb b/lib/puppet/type/nagios_service.rb
new file mode 100644
index 0000000..22b987f
--- /dev/null
+++ b/lib/puppet/type/nagios_service.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :service
diff --git a/lib/puppet/type/nagios_servicedependency.rb b/lib/puppet/type/nagios_servicedependency.rb
new file mode 100644
index 0000000..0e3340c
--- /dev/null
+++ b/lib/puppet/type/nagios_servicedependency.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :servicedependency
diff --git a/lib/puppet/type/nagios_serviceescalation.rb b/lib/puppet/type/nagios_serviceescalation.rb
new file mode 100644
index 0000000..cb2af15
--- /dev/null
+++ b/lib/puppet/type/nagios_serviceescalation.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :serviceescalation
diff --git a/lib/puppet/type/nagios_serviceextinfo.rb b/lib/puppet/type/nagios_serviceextinfo.rb
new file mode 100644
index 0000000..6bdc709
--- /dev/null
+++ b/lib/puppet/type/nagios_serviceextinfo.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :serviceextinfo
diff --git a/lib/puppet/type/nagios_timeperiod.rb b/lib/puppet/type/nagios_timeperiod.rb
new file mode 100644
index 0000000..25a06d3
--- /dev/null
+++ b/lib/puppet/type/nagios_timeperiod.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :timeperiod
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index 6163622..f004f7c 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -176,7 +176,7 @@ module Puppet
a common name to packages::
# In the 'openssl' class
- $ssl = $operationgsystem ? {
+ $ssl = $operatingsystem ? {
solaris => SMCossl,
default => openssl
}
@@ -190,7 +190,7 @@ module Puppet
. etc. .
- $ssh = $operationgsystem ? {
+ $ssh = $operatingsystem ? {
solaris => SMCossh,
default => openssh
}
@@ -200,7 +200,7 @@ module Puppet
package { $ssh:
ensure => installed,
alias => openssh,
- require => package[openssl]
+ require => Package[openssl]
}
"
@@ -211,14 +211,6 @@ module Puppet
desc "Where to find the actual package. This must be a local file
(or on a network file system) or a URL that your specific
packaging type understands; Puppet will not retrieve files for you."
-
- validate do |value|
- unless value =~ /^#{File::SEPARATOR}/ or value =~ /\w+:\/\//
- self.fail(
- "Package sources must be fully qualified files or URLs, depending on the platform."
- )
- end
- end
end
newparam(:instance) do
desc "A read-only parameter set by the package."
@@ -248,7 +240,7 @@ module Puppet
newparam(:responsefile) do
desc "A file containing any necessary answers to questions asked by
- the package. This is currently only used on Solaris. The
+ the package. This is currently used on Solaris and Debian. The
value will be validated according to system rules, but it should
generally be a fully qualified path."
end
diff --git a/lib/puppet/type/pfile/checksum.rb b/lib/puppet/type/pfile/checksum.rb
deleted file mode 100755
index 08f48ea..0000000
--- a/lib/puppet/type/pfile/checksum.rb
+++ /dev/null
@@ -1,326 +0,0 @@
-# Keep a copy of the file checksums, and notify when they change.
-
-# This state never actually modifies the system, it only notices when the system
-# changes on its own.
-module Puppet
- Puppet.type(:file).newproperty(:checksum) do
- desc "How to check whether a file has changed. This state is used internally
- for file copying, but it can also be used to monitor files somewhat
- like Tripwire without managing the file contents in any way. You can
- specify that a file's checksum should be monitored and then subscribe to
- the file from another object and receive events to signify
- checksum changes, for instance."
-
- @event = :file_changed
-
- @unmanaged = true
-
- @validtypes = %w{md5 md5lite timestamp mtime time}
-
- def self.validtype?(type)
- @validtypes.include?(type)
- end
-
- @validtypes.each do |ctype|
- newvalue(ctype) do
- handlesum()
- end
- end
-
- str = @validtypes.join("|")
-
- # This is here because Puppet sets this internally, using
- # {md5}......
- newvalue(/^\{#{str}\}/) do
- handlesum()
- end
-
- newvalue(:nosum) do
- # nothing
- :nochange
- end
-
- # If they pass us a sum type, behave normally, but if they pass
- # us a sum type + sum, stick the sum in the cache.
- munge do |value|
- if value =~ /^\{(\w+)\}(.+)$/
- type = symbolize($1)
- sum = $2
- cache(type, sum)
- return type
- else
- if FileTest.directory?(@resource[:path])
- return :time
- else
- return symbolize(value)
- end
- end
- end
-
- # Store the checksum in the data cache, or retrieve it if only the
- # sum type is provided.
- def cache(type, sum = nil)
- unless type
- raise ArgumentError, "A type must be specified to cache a checksum"
- end
- type = symbolize(type)
- unless state = @resource.cached(:checksums)
- self.debug "Initializing checksum hash"
- state = {}
- @resource.cache(:checksums, state)
- end
-
- if sum
- unless sum =~ /\{\w+\}/
- sum = "{%s}%s" % [type, sum]
- end
- state[type] = sum
- else
- return state[type]
- end
- end
-
- # Because source and content and whomever else need to set the checksum
- # and do the updating, we provide a simple mechanism for doing so.
- def checksum=(value)
- munge(@should)
- self.updatesum(value)
- end
-
- def checktype
- self.should || :md5
- end
-
- # Checksums need to invert how changes are printed.
- def change_to_s(currentvalue, newvalue)
- begin
- if currentvalue == :absent
- return "defined '%s' as '%s'" %
- [self.name, self.currentsum]
- elsif newvalue == :absent
- return "undefined %s from '%s'" %
- [self.name, self.is_to_s(currentvalue)]
- else
- if defined? @cached and @cached
- return "%s changed '%s' to '%s'" %
- [self.name, @cached, self.is_to_s(currentvalue)]
- else
- return "%s changed '%s' to '%s'" %
- [self.name, self.currentsum, self.is_to_s(currentvalue)]
- end
- end
- rescue Puppet::Error, Puppet::DevError
- raise
- rescue => detail
- raise Puppet::DevError, "Could not convert change %s to string: %s" %
- [self.name, detail]
- end
- end
-
- def currentsum
- #"{%s}%s" % [self.should, cache(self.should)]
- cache(checktype())
- end
-
- # Retrieve the cached sum
- def getcachedsum
- hash = nil
- unless hash = @resource.cached(:checksums)
- hash = {}
- @resource.cache(:checksums, hash)
- end
-
- sumtype = self.should
-
- if hash.include?(sumtype)
- #self.notice "Found checksum %s for %s" %
- # [hash[sumtype] , at resource[:path]]
- sum = hash[sumtype]
-
- unless sum =~ /^\{\w+\}/
- sum = "{%s}%s" % [sumtype, sum]
- end
- return sum
- elsif hash.empty?
- #self.notice "Could not find sum of type %s" % sumtype
- return :nosum
- else
- #self.notice "Found checksum for %s but not of type %s" %
- # [@resource[:path],sumtype]
- return :nosum
- end
- end
-
- # Calculate the sum from disk.
- def getsum(checktype)
- sum = ""
-
- checktype = checktype.intern if checktype.is_a? String
- case checktype
- when :md5, :md5lite:
- if ! FileTest.file?(@resource[:path])
- @resource.debug "Cannot MD5 sum %s; using mtime" %
- [@resource.stat.ftype]
- sum = @resource.stat.mtime.to_s
- else
- begin
- File.open(@resource[:path]) { |file|
- hashfunc = Digest::MD5.new
- while (!file.eof)
- readBuf = file.read(512)
- hashfunc.update(readBuf)
- if checktype == :md5lite then
- break
- end
- end
- sum = hashfunc.hexdigest
- }
- rescue Errno::EACCES => detail
- self.notice "Cannot checksum %s: permission denied" %
- @resource[:path]
- @resource.delete(self.class.name)
- rescue => detail
- self.notice "Cannot checksum: %s" %
- detail
- @resource.delete(self.class.name)
- end
- end
- when :timestamp, :mtime:
- sum = @resource.stat.mtime.to_s
- #sum = File.stat(@resource[:path]).mtime.to_s
- when :time:
- sum = @resource.stat.ctime.to_s
- #sum = File.stat(@resource[:path]).ctime.to_s
- else
- raise Puppet::Error, "Invalid sum type %s" % checktype
- end
-
- return "{#{checktype}}" + sum.to_s
- end
-
- # At this point, we don't actually modify the system, we modify
- # the stored state to reflect the current state, and then kick
- # off an event to mark any changes.
- def handlesum
- currentvalue = self.retrieve
- if currentvalue.nil?
- raise Puppet::Error, "Checksum state for %s is somehow nil" %
- @resource.title
- end
-
- if self.insync?(currentvalue)
- self.debug "Checksum is already in sync"
- return nil
- end
- # @resource.debug "%s(%s): after refresh, is '%s'" %
- # [self.class.name, at resource.name, at is]
-
- # If we still can't retrieve a checksum, it means that
- # the file still doesn't exist
- if currentvalue == :absent
- # if they're copying, then we won't worry about the file
- # not existing yet
- unless @resource.property(:source)
- self.warning("File %s does not exist -- cannot checksum" %
- @resource[:path]
- )
- end
- return nil
- end
-
- # If the sums are different, then return an event.
- if self.updatesum(currentvalue)
- return :file_changed
- else
- return nil
- end
- end
-
- def insync?(currentvalue)
- @should = [checktype()]
- if cache(checktype())
- return currentvalue == currentsum()
- else
- # If there's no cached sum, then we don't want to generate
- # an event.
- return true
- end
- end
-
- # Even though they can specify multiple checksums, the insync?
- # mechanism can really only test against one, so we'll just retrieve
- # the first specified sum type.
- def retrieve(usecache = false)
- # When the 'source' is retrieving, it passes "true" here so
- # that we aren't reading the file twice in quick succession, yo.
- currentvalue = currentsum()
- if usecache and currentvalue
- return currentvalue
- end
-
- stat = nil
- unless stat = @resource.stat
- return :absent
- end
-
- if stat.ftype == "link" and @resource[:links] != :follow
- self.debug "Not checksumming symlink"
- # @resource.delete(:checksum)
- return currentvalue
- end
-
- # Just use the first allowed check type
- currentvalue = getsum(checktype())
-
- # If there is no sum defined, then store the current value
- # into the cache, so that we're not marked as being
- # out of sync. We don't want to generate an event the first
- # time we get a sum.
- unless cache(checktype())
- # FIXME we should support an updatechecksums-like mechanism
- self.updatesum(currentvalue)
- end
-
- # @resource.debug "checksum state is %s" % self.is
- return currentvalue
- end
-
- # Store the new sum to the state db.
- def updatesum(newvalue)
- result = false
-
- if newvalue.is_a?(Symbol)
- raise Puppet::Error, "%s has invalid checksum" % @resource.title
- end
-
- # if we're replacing, vs. updating
- if sum = cache(checktype())
- # unless defined? @should
- # raise Puppet::Error.new(
- # ("@should is not initialized for %s, even though we " +
- # "found a checksum") % @resource[:path]
- # )
- # end
-
- if newvalue == sum
- return false
- end
-
- self.debug "Replacing %s checksum %s with %s" %
- [@resource.title, sum, newvalue]
- # @resource.debug "currentvalue: %s; @should: %s" %
- # [newvalue, at should]
- result = true
- else
- @resource.debug "Creating checksum %s" % newvalue
- result = false
- end
-
- # Cache the sum so the log message can be right if possible.
- @cached = sum
- cache(checktype(), newvalue)
- return result
- end
- end
-end
-
diff --git a/lib/puppet/type/service.rb b/lib/puppet/type/service.rb
index c41a788..1b625cc 100644
--- a/lib/puppet/type/service.rb
+++ b/lib/puppet/type/service.rb
@@ -28,6 +28,8 @@ module Puppet
feature :enableable, "The provider can enable and disable the service",
:methods => [:disable, :enable, :enabled?]
+ feature :controllable, "The provider uses a control variable."
+
newproperty(:enable, :required_features => :enableable) do
desc "Whether a service should be enabled to start at boot.
This property behaves quite differently depending on the platform;
@@ -163,6 +165,13 @@ module Puppet
desc "Specify a *stop* command manually."
end
+ newparam(:control) do
+ desc "The control variable used to manage services (originally for HP-UX).
+ Defaults to the upcased service name plus ``START`` replacing dots with
+ underscores, for those providers that support the ``controllable`` feature."
+ defaultto { resource.name.gsub(".","_").upcase + "_START" if resource.provider.controllable? }
+ end
+
newparam :hasrestart do
desc "Specify that an init script has a ``restart`` option. Otherwise,
the init script's ``stop`` and ``start`` methods are used."
diff --git a/lib/puppet/type/sshkey.rb b/lib/puppet/type/sshkey.rb
index bf4b0aa..c2bdd39 100755
--- a/lib/puppet/type/sshkey.rb
+++ b/lib/puppet/type/sshkey.rb
@@ -53,14 +53,14 @@ module Puppet
end
newparam(:name) do
- desc "The host name."
+ desc "The host name that the key is associated with."
isnamevar
end
newproperty(:target) do
- desc "The file in which to store the mount table. Only used by
- those providers that write to disk (i.e., not NetInfo)."
+ desc "The file in which to store the ssh key. Only used by
+ the ``parsed`` provider."
defaultto { if @resource.class.defaultprovider.ancestors.include?(Puppet::Provider::ParsedFile)
@resource.class.defaultprovider.default_target
diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb
index a525755..535d9ef 100644
--- a/lib/puppet/util/autoload.rb
+++ b/lib/puppet/util/autoload.rb
@@ -1,6 +1,9 @@
+require 'puppet/util/warnings'
+
# Autoload paths, either based on names or all at once.
class Puppet::Util::Autoload
include Puppet::Util
+ include Puppet::Util::Warnings
@autoloaders = {}
@loaded = []
@@ -109,9 +112,8 @@ class Puppet::Util::Autoload
Dir.glob("#{dir}/*.rb").each do |file|
name = File.basename(file).sub(".rb", '').intern
next if loaded?(name)
- rubypath = File.join(@path, name.to_s)
begin
- Kernel.require rubypath
+ Kernel.require file
loaded(name, file)
rescue => detail
if Puppet[:trace]
@@ -123,8 +125,6 @@ class Puppet::Util::Autoload
end
end
- private
-
# Yield each subdir in turn.
def eachdir
searchpath.each do |dir|
@@ -137,7 +137,7 @@ class Puppet::Util::Autoload
def searchpath
# JJM: Search for optional lib directories in each module bundle.
module_lib_dirs = Puppet[:modulepath].split(":").collect do |d|
- Dir.glob("%s/*/lib" % d).select do |f|
+ Dir.glob("%s/*/{plugins,lib}" % d).select do |f|
FileTest.directory?(f)
end
end.flatten
diff --git a/lib/puppet/util/checksums.rb b/lib/puppet/util/checksums.rb
index 6f6ea59..15d2ead 100644
--- a/lib/puppet/util/checksums.rb
+++ b/lib/puppet/util/checksums.rb
@@ -1,37 +1,75 @@
+# A stand-alone module for calculating checksums
+# in a generic way.
module Puppet::Util::Checksums
+ # Calculate a checksum using Digest::MD5.
def md5(content)
require 'digest/md5'
Digest::MD5.hexdigest(content)
end
- def md5_file(filename)
+ # Calculate a checksum of the first 500 chars of the content using Digest::MD5.
+ def md5lite(content)
+ md5(content[0..511])
+ end
+
+ # Calculate a checksum of a file's content using Digest::MD5.
+ def md5_file(filename, lite = false)
require 'digest/md5'
- incr_digest = Digest::MD5.new()
- File.open(filename, 'r') do |file|
- file.each_line do |line|
- incr_digest << line
- end
- end
+ digest = Digest::MD5.new()
+ return checksum_file(digest, filename, lite)
+ end
+
+ # Calculate a checksum of the first 500 chars of a file's content using Digest::MD5.
+ def md5lite_file(filename)
+ md5_file(filename, true)
+ end
- return incr_digest.hexdigest
+ # Return the :mtime timestamp of a file.
+ def mtime_file(filename)
+ File.stat(filename).send(:mtime)
end
+ # Calculate a checksum using Digest::SHA1.
def sha1(content)
require 'digest/sha1'
Digest::SHA1.hexdigest(content)
end
- def sha1_file(filename)
+ # Calculate a checksum of the first 500 chars of the content using Digest::SHA1.
+ def sha1lite(content)
+ sha1(content[0..511])
+ end
+
+ # Calculate a checksum of a file's content using Digest::SHA1.
+ def sha1_file(filename, lite = false)
require 'digest/sha1'
- incr_digest = Digest::SHA1.new()
+ digest = Digest::SHA1.new()
+ return checksum_file(digest, filename, lite)
+ end
+
+ # Calculate a checksum of the first 500 chars of a file's content using Digest::SHA1.
+ def sha1lite_file(filename)
+ sha1_file(filename, true)
+ end
+
+ # Return the :ctime of a file.
+ def ctime_file(filename)
+ File.stat(filename).send(:ctime)
+ end
+
+ private
+
+ # Perform an incremental checksum on a file.
+ def checksum_file(digest, filename, lite = false)
File.open(filename, 'r') do |file|
- file.each_line do |line|
- incr_digest << line
+ while content = file.read(512)
+ digest << content
+ break if lite
end
end
- return incr_digest.hexdigest
+ return digest.hexdigest
end
end
diff --git a/lib/puppet/util/constant_inflector.rb b/lib/puppet/util/constant_inflector.rb
new file mode 100644
index 0000000..8b08395
--- /dev/null
+++ b/lib/puppet/util/constant_inflector.rb
@@ -0,0 +1,14 @@
+# Created on 2008-02-12
+# Copyright Luke Kanies
+
+# A common module for converting between constants and
+# file names.
+module Puppet::Util::ConstantInflector
+ def file2constant(file)
+ file.split("/").collect { |name| name.capitalize }.join("::").gsub(/_+(.)/) { |term| $1.capitalize }
+ end
+
+ def constant2file(constant)
+ constant.to_s.gsub(/([a-z])([A-Z])/) { |term| $1 + "_" + $2 }.gsub("::", "/").downcase
+ end
+end
diff --git a/lib/puppet/util/filetype.rb b/lib/puppet/util/filetype.rb
index 1c7734c..bbc837e 100755
--- a/lib/puppet/util/filetype.rb
+++ b/lib/puppet/util/filetype.rb
@@ -165,7 +165,7 @@ class Puppet::Util::FileType
# Remove a specific @path's cron tab.
def remove
- if Facter.value("operatingsystem") == "FreeBSD"
+ if %w{Darwin FreeBSD}.include?(Facter.value("operatingsystem"))
%x{/bin/echo yes | #{cmdbase()} -r 2>/dev/null}
else
%x{#{cmdbase()} -r 2>/dev/null}
diff --git a/lib/puppet/util/graph.rb b/lib/puppet/util/graph.rb
index 028df55..d1ef36f 100644
--- a/lib/puppet/util/graph.rb
+++ b/lib/puppet/util/graph.rb
@@ -16,21 +16,15 @@ module Puppet::Util::Graph
self.each do |child|
unless block_given? and ! yield(child)
- graph.add_edge!(self, child)
-
- if graph.cyclic?
- raise Puppet::Error, "%s created a cyclic graph" % self
- end
+ graph.add_edge(self, child)
if child.respond_to?(:to_graph)
child.to_graph(graph, &block)
end
end
end
-
- if graph.cyclic?
- raise Puppet::Error, "%s created a cyclic graph" % self
- end
+
+ # Do a topsort, which will throw an exception if the graph is cyclic.
graph
end
diff --git a/lib/puppet/util/nagios_maker.rb b/lib/puppet/util/nagios_maker.rb
new file mode 100644
index 0000000..a7aae4e
--- /dev/null
+++ b/lib/puppet/util/nagios_maker.rb
@@ -0,0 +1,57 @@
+require 'puppet/external/nagios'
+require 'puppet/external/nagios/base'
+require 'puppet/provider/naginator'
+
+module Puppet::Util::NagiosMaker
+ # Create a new nagios type, using all of the parameters
+ # from the parser.
+ def self.create_nagios_type(name)
+ name = name.to_sym
+ full_name = ("nagios_" + name.to_s).to_sym
+
+ raise(Puppet::DevError, "No nagios type for %s" % name) unless nagtype = Nagios::Base.type(name)
+
+ type = Puppet::Type.newtype(full_name) {}
+
+ type.ensurable
+
+ type.newparam(nagtype.namevar, :namevar => true) do
+ desc "The name parameter for Nagios type %s" % nagtype.name
+ end
+
+ # We deduplicate the parameters because it makes sense to allow Naginator to have dupes.
+ nagtype.parameters.uniq.each do |param|
+ next if param == nagtype.namevar
+
+ # We can't turn these parameter names into constants, so at least for now they aren't
+ # supported.
+ next if param.to_s =~ /^[0-9]/
+
+ type.newproperty(param) do
+ desc "Nagios configuration file parameter."
+ end
+ end
+
+ type.newproperty(:target) do
+ desc 'target'
+
+ defaultto do
+ resource.class.defaultprovider.default_target
+ end
+ end
+
+ target = "/etc/nagios/#{full_name.to_s}.cfg"
+ provider = type.provide(:naginator, :parent => Puppet::Provider::Naginator, :default_target => target) {}
+
+ type.desc "The Nagios type #{name.to_s}. This resource type is autogenerated using the
+ model developed in Naginator_, and all of the Nagios types are generated using the
+ same code and the same library.
+
+ This type generates Nagios configuration statements in Nagios-parseable configuration
+ files. By default, the statements will be added to ``#{target}``, but
+ you can send them to a different file by setting their ``target`` attribute.
+
+ .. _naginator: http://reductivelabs.com/trac/naginator
+ "
+ end
+end
diff --git a/lib/puppet/util/settings.rb b/lib/puppet/util/settings.rb
index b672d95..259e204 100644
--- a/lib/puppet/util/settings.rb
+++ b/lib/puppet/util/settings.rb
@@ -243,14 +243,7 @@ class Puppet::Util::Settings
# Make a directory with the appropriate user, group, and mode
def mkdir(default)
- obj = nil
- unless obj = @config[default]
- raise ArgumentError, "Unknown default %s" % default
- end
-
- unless obj.is_a? CFile
- raise ArgumentError, "Default %s is not a file" % default
- end
+ obj = get_config_default(default)
Puppet::Util::SUIDManager.asuser(obj.owner, obj.group) do
mode = obj.mode || 0750
@@ -509,19 +502,19 @@ class Puppet::Util::Settings
objects += add_user_resources(section, obj, done)
end
+ value = obj.value
+
# Only files are convertable to transportable resources.
- if obj.respond_to? :to_transportable
- next if value(obj.name) =~ /^\/dev/
- transobjects = obj.to_transportable
- transobjects = [transobjects] unless transobjects.is_a? Array
- transobjects.each do |trans|
- # transportable could return nil
- next unless trans
- unless done[:file].include? trans.name
- @created << trans.name
- objects << trans
- done[:file][trans.name] = trans
- end
+ next unless obj.respond_to? :to_transportable and transobjects = obj.to_transportable
+
+ transobjects = [transobjects] unless transobjects.is_a? Array
+ transobjects.each do |trans|
+ # transportable could return nil
+ next unless trans
+ unless done[:file].include? trans.name
+ @created << trans.name
+ objects << trans
+ done[:file][trans.name] = trans
end
end
end
@@ -737,49 +730,15 @@ Generated on #{Time.now}.
end
# Open a file with the appropriate user, group, and mode
- def write(default, *args)
- obj = nil
- unless obj = @config[default]
- raise ArgumentError, "Unknown default %s" % default
- end
-
- unless obj.is_a? CFile
- raise ArgumentError, "Default %s is not a file" % default
- end
-
- chown = nil
- if Puppet::Util::SUIDManager.uid == 0
- chown = [obj.owner, obj.group]
- else
- chown = [nil, nil]
- end
- Puppet::Util::SUIDManager.asuser(*chown) do
- mode = obj.mode || 0640
-
- if args.empty?
- args << "w"
- end
-
- args << mode
-
- File.open(value(obj.name), *args) do |file|
- yield file
- end
- end
+ def write(default, *args, &bloc)
+ obj = get_config_default(default)
+ writesub(default, value(obj.name), *args, &bloc)
end
# Open a non-default file under a default dir with the appropriate user,
# group, and mode
- def writesub(default, file, *args)
- obj = nil
- unless obj = @config[default]
- raise ArgumentError, "Unknown default %s" % default
- end
-
- unless obj.is_a? CFile
- raise ArgumentError, "Default %s is not a file" % default
- end
-
+ def writesub(default, file, *args, &bloc)
+ obj = get_config_default(default)
chown = nil
if Puppet::Util::SUIDManager.uid == 0
chown = [obj.owner, obj.group]
@@ -804,8 +763,51 @@ Generated on #{Time.now}.
end
end
+ def readwritelock(default, *args, &bloc)
+ file = value(get_config_default(default).name)
+ tmpfile = file + ".tmp"
+ sync = Sync.new
+ unless FileTest.directory?(File.dirname(tmpfile))
+ raise Puppet::DevError, "Cannot create %s; directory %s does not exist" %
+ [file, File.dirname(file)]
+ end
+
+ sync.synchronize(Sync::EX) do
+ File.open(file, "r+", 0600) do |rf|
+ rf.lock_exclusive do
+ if File.exist?(tmpfile)
+ raise Puppet::Error, ".tmp file already exists for %s; Aborting locked write. Check the .tmp file and delete if appropriate" %
+ [file]
+ end
+
+ writesub(default, tmpfile, *args, &bloc)
+
+ begin
+ File.rename(tmpfile, file)
+ rescue => detail
+ Puppet.err "Could not rename %s to %s: %s" %
+ [file, tmpfile, detail]
+ end
+ end
+ end
+ end
+ end
+
private
+ def get_config_default(default)
+ obj = nil
+ unless obj = @config[default]
+ raise ArgumentError, "Unknown default %s" % default
+ end
+
+ unless obj.is_a? CFile
+ raise ArgumentError, "Default %s is not a file" % default
+ end
+
+ return obj
+ end
+
# Create the transportable objects for users and groups.
def add_user_resources(section, obj, done)
resources = []
@@ -1124,7 +1126,7 @@ Generated on #{Time.now}.
# the variable 'dir', or adding a slash at the end.
def munge(value)
# If it's not a fully qualified path...
- if value.is_a?(String) and value !~ /^\$/ and value !~ /^\//
+ if value.is_a?(String) and value !~ /^\$/ and value !~ /^\// and value != 'false'
# Make it one
value = File.join(Dir.getwd, value)
end
@@ -1153,12 +1155,15 @@ Generated on #{Time.now}.
def to_transportable
type = self.type
return nil unless type
- path = @parent.value(self.name).split(File::SEPARATOR)
- path.shift # remove the leading nil
- objects = []
path = self.value
+ return nil unless path.is_a?(String)
+ return nil if path =~ /^\/dev/
+ return nil if Puppet::Type.type(:file)[path] # skip files that are in our global resource list.
+
+ objects = []
+
# Skip plain files that don't exist, since we won't be managing them anyway.
return nil unless self.name.to_s =~ /dir$/ or File.exist?(path) or self.create
obj = Puppet::TransObject.new(path, "file")
diff --git a/lib/puppet/util/tagging.rb b/lib/puppet/util/tagging.rb
new file mode 100644
index 0000000..8a50f34
--- /dev/null
+++ b/lib/puppet/util/tagging.rb
@@ -0,0 +1,39 @@
+# Created on 2008-01-19
+# Copyright Luke Kanies
+
+# A common module to handle tagging.
+module Puppet::Util::Tagging
+ # Add a tag to our current list. These tags will be added to all
+ # of the objects contained in this scope.
+ def tag(*ary)
+ @tags ||= []
+
+ qualified = []
+
+ ary.collect { |tag| tag.to_s.downcase }.each do |tag|
+ fail(Puppet::ParseError, "Invalid tag %s" % tag.inspect) unless valid_tag?(tag)
+ qualified << tag if tag.include?("::")
+ @tags << tag unless @tags.include?(tag)
+ end
+
+ qualified.collect { |name| name.split("::") }.flatten.each { |tag| @tags << tag unless @tags.include?(tag) }
+ end
+
+ # Are we tagged with the provided tag?
+ def tagged?(tag)
+ defined?(@tags) and @tags.include?(tag.to_s)
+ end
+
+ # Return a copy of the tag list, so someone can't ask for our tags
+ # and then modify them.
+ def tags
+ @tags ||= []
+ @tags.dup
+ end
+
+ private
+
+ def valid_tag?(tag)
+ tag =~ /^\w[-\w:.]*$/
+ end
+end
diff --git a/man/man8/puppet.8 b/man/man8/puppet.8
new file mode 100644
index 0000000..53e5270
--- /dev/null
+++ b/man/man8/puppet.8
@@ -0,0 +1,513 @@
+.\" -*- nroff -*-
+.\" This file may be copied under the terms of the GNU Public License.
+.\"
+.TH PUPPET 8 "Jan 2007" "Reductive Labs"
+.SH NAME
+puppet, puppetmasterd, ca \- automated configuration management
+.SH SYNOPSIS
+.B puppet
+.RI [options]
+.br
+.B puppetmasterd
+.RI [options]
+.br
+.B ca
+.RI [options]
+.SH DESCRIPTION
+This document is intended as a secondary reference only. Please refer to the complete documentation on the
+.B puppet
+website:
+.PP
+\h"4"http://www.reductivelabs.com/trac/puppet/wiki/DocumentationStart
+.PP
+Every
+.B puppet
+executable (with the exception of
+.B puppetdoc
+) accepts all of the arguments below, but not all of the arguments make sense for every executable. Each argument has a section listed with it in parentheses; often, that section will map to an executable (e.g.,
+.B puppetd
+), in which case it probably only makes sense for that one executable. If
+.B puppet
+is listed as the section, it is most likely an option that is valid for everyone.
+.PP
+This will not always be the case. I have tried to be as thorough as possible in the descriptions of the arguments, so it should be obvious whether an argument is appropriate or not.
+.PP
+These arguments can be supplied to the executables either as command-line arugments or in the configuration file for the appropriate executable. For instance, the command-line invocation below would set the configuration directory to /private/puppet:
+.PP
+\h"4"$ puppetd --confdir=/private/puppet
+.PP
+Note that boolean options are turned on and off with a slightly different syntax on the command line:
+.PP
+\h"4"$ puppetd --storeconfigs
+.PP
+\h"4"$ puppetd --no-storeconfigs
+.PP
+The invocations above will enable and disable, respectively, the storage of the client configuration.
+.PP
+As mentioned above, the configuration parameters can also be stored in a configuration file located in the configuration directory (/etc/puppet by default). The file is called puppet.conf.
+.PP
+The file, which follows INI-style formatting, should contain a bracketed heading named for each executable, followed by pairs of parameters with their values. Here is an example of a very simple puppet.conf file:
+.PP
+\h"4"[puppetd]
+.br
+\h"4"confdir = /private/puppet
+.br
+\h"4"storeconfigs = true
+.br
+.PP
+Note that boolean parameters must be explicitly specified as true or false as seen above.
+.PP
+If you're starting out with a fresh configuration, you may wish to let the executable generate a template configuration file for you by invoking the executable in question with the --genconfig command. The executable will print a template configuration to standard output, which can be redirected to a file like so:
+.PP
+\h"4"$ puppetd --genconfig > /etc/puppet/puppet.conf
+.PP
+Note that this invocation will "clobber" (throw away) the contents of any pre-existing puppet.conf file, so make a backup of your present config if it contains valuable information.
+.PP
+Like the --genconfig argument, the executables also accept a --genmanifest argument, which will generate a manifest that can be used to manage all of
+.B Puppet's
+directories and files and prints it to standard output. This can likewise be redirected to a file:
+.PP
+\h"4"$ puppetd --genmanifest > /etc/puppet/manifests/site.pp
+.PP
+.B Puppet
+can also create user and group accounts for itself (one puppet group and one puppet user) if it is invoked as root with the --mkusers argument:
+.PP
+\h"4"$ puppetd --mkusers
+.PP
+.SH SIGNALS
+The
+.B puppetd
+and
+.B puppetmasterd
+executables catch some signals for special handling. Both daemons catch (SIGHUP), which forces the server to restart tself. Predictably, interrupt and terminate (SIGINT and SIGHUP) will shut down the server, whether it be an instance of
+.B puppetd
+or
+.B puppetmasterd.
+.PP
+Sending the SIGUSR1 signal to an instance of
+.B puppetd
+will cause it to immediately begin a new configuration transaction with the server. This signal has no effect on
+.B puppetmasterd.
+.SH OPTIONS
+.TP
+.B \-\-authconfig
+(puppet) The configuration file that defines the rights to the different namespaces and methods. This can be used as a coarse-grained authorization system for both
+.B puppetd
+and
+.B puppetmasterd
+. Default value is: /etc/puppet/namespaceauth.conf
+.TP
+.B \-\-autoflush
+(puppet) Whether log files should always flush to disk.
+.TP
+.B \-\-autosign
+(ca) Whether to enable autosign. Valid values are true (which autosigns any key request, and is a very bad idea), false (which never autosigns any key request), and the path to a file, which uses that configuration file to determine which keys to sign. Default value is: /etc/puppet/autosign.conf
+.TP
+.B \-\-bucketdir
+(puppetmasterd) Where FileBucket files are stored. Default value is: /var/puppet/bucket
+.TP
+.B \-\-ca_days
+(ca) How long a certificate should be valid. This parameter is deprecated, use ca_ttl instead
+.TP
+.B \-\-ca_md
+(ca) The type of hash used in certificates. Default value is: md5
+.TP
+.B \-\-ca_ttl
+(ca) The default TTL for new certificates; valid values must be an integer, optionally followed by one of the units 'y' (years of 365 days), 'd' (days), 'h' (hours), or 's' (seconds). The unit defaults to seconds. If this parameter is set, ca_days is ignored. Examples are '3600' (one hour) and '1825d', which is the same as '5y' (5 years) 5y
+.TP
+.B \-\-cacert
+(ca) The CA certificate. Default value is: /etc/puppet/ssl/ca/ca_crt.pem
+.TP
+.B \-\-cacrl
+(ca) The certificate revocation list (CRL) for the CA. Set this to 'none' if you do not want to use a CRL. Default value is: /etc/puppet/ssl/ca/ca_crl.pem
+.TP
+.B \-\-cadir
+(ca) The root directory for the certificate authority. Default value is: /etc/puppet/ssl/ca
+.TP
+.B \-\-cakey
+(ca) The CA private key. Default value is: /etc/puppet/ssl/ca/ca_key.pem
+.TP
+.B \-\-capass
+(ca) Where the CA stores the password for the private key. Default value is: /etc/puppet/ssl/ca/private/ca.pass
+.TP
+.B \-\-caprivatedir
+(ca) Where the CA stores private certificate information. Default value is: /etc/puppet/ssl/ca/private
+.TP
+.B \-\-capub
+(ca) The CA public key. Default value is: /etc/puppet/ssl/ca/ca_pub.pem
+.TP
+.B \-\-casesensitive
+(puppet) Whether matching in case statements and selectors should be case-sensitive. Case insensitivity is handled by downcasing all values before comparison.
+.TP
+.B \-\-cert_inventory
+(ca) A Complete listing of all certificates. Default value is: /etc/puppet/ssl/ca/inventory.txt
+.TP
+.B \-\-certdir
+(certificates) The certificate directory. Default value is: /etc/puppet/ssl/certs
+.TP
+.B \-\-classfile
+(puppetd) The file in which
+.B puppetd
+stores a list of the classes associated with the retrieved configuratiion. Can be loaded in the separate puppet executable using the --loadclasses option. Default value is: /etc/puppet/classes.txt
+.TP
+.B \-\-clientbucketdir
+(filebucket) Where FileBucket files are stored locally. Default value is: /var/puppet/clientbucket
+.TP
+.B \-\-color
+(puppet) Whether to use colors when logging to the console. Valid values are ansi (equivalent to true), html (mostly used during testing with TextMate), and false, which produces no color. Default value is: ansi
+.TP
+.B \-\-confdir
+(puppet) The main Puppet configuration directory. Default value is: /etc/puppet
+.TP
+.B \-\-config
+(puppetdoc) The configuration file for puppetdoc. Default value is: /etc/puppet/puppetdoc.conf
+.TP
+.B \-\-configprint
+(puppet) Print the value of a specific configuration parameter. If a parameter is provided for this, then the value is printed and puppet exits. Comma-separate mul.TPle values. For a list of all values, specify 'all'. This feature is only available in Puppet versions higher than 0.18.4.
+.TP
+.B \-\-csrdir
+(ca) Where the CA stores certificate requests Default value is: /etc/puppet/ssl/ca/requests
+.TP
+.B \-\-dbadapter
+(puppetmaster) The type of database to use. Default value is: sqlite3
+.TP
+.B \-\-dblocation
+(puppetmaster) The database cache for client configurations. Used for querying within the language. Default value is: /var/puppet/state/clientconfigs.sqlite3
+.TP
+.B \-\-dbmigrate
+(puppetmaster) Whether to automatically migrate the database.
+.TP
+.B \-\-dbname
+(puppetmaster) The name of the database to use. Default value is: puppet
+.TP
+.B \-\-dbpassword
+(puppetmaster) The database password for Client caching. Only used when networked databases are used. Default value is: puppet
+.TP
+.B \-\-dbserver
+(puppetmaster) The database server for Client caching. Only used when networked databases are used. Default value is: localhost
+.TP
+.B \-\-dbuser
+(puppetmaster) The database user for Client caching. Only used when networked databases are used. Default value is: puppet
+.TP
+.B \-\-evaltrace
+(transaction) Whether each resource should log when it is being evaluated. This allows you to interactively see exactly what is being done.
+.TP
+.B \-\-external_nodes
+(puppet) An external command that can produce node information. The first line of output must be either the parent node or blank, and if there is a second line of output it should be a list of whitespace-separated classes to include on that node. This command makes it straightforward to store your node mapping information in other data sources like databases. For unknown nodes, the commands should exit with an exit code of 1. Default value is: none
+.TP
+.B \-\-factdest
+(puppet) Where Puppet should store facts that it pulls down from the central server. Default value is: /var/puppet/facts
+.TP
+.B \-\-factpath
+(puppet) Where Puppet should look for facts. Mul.TPle directories should be colon-separated, like normal PATH variables. Default value is: /var/puppet/facts
+.TP
+.B \-\-factsignore
+(puppet) What files to ignore when pulling down facts. Default value is: .svn CVS
+.TP
+.B \-\-factsource
+(puppet) From where to retrieve facts. The standard Puppet file type is used for retrieval, so anything that is a valid file source can be used here. Default value is: puppet://puppet/facts
+.TP
+.B \-\-factsync
+(puppet) Whether facts should be synced with the central server.
+.TP
+.B \-\-fileserverconfig
+(fileserver) Where the fileserver configuration is stored. Default value is: /etc/puppet/fileserver.conf
+.TP
+.B \-\-filetimeout
+(puppet) The minimum time to wait between checking for updates in configuration files. Default value is: 15
+.TP
+.B \-\-genconfig
+(puppet) Whether to just print a configuration to stdout and exit. Only makes sense when used interactively. Takes into account arguments specified on the CLI.
+.TP
+.B \-\-genmanifest
+(puppet) Whether to just print a manifest to stdout and exit. Only makes sense when used interactively. Takes into account arguments specified on the CLI.
+.TP
+.B \-\-graph
+(puppet) Whether to create dot graph files for the different configuration graphs. These dot files can be interpreted by tools like OmniGraffle or dot (which is part of ImageMagick).
+.TP
+.B \-\-graphdir
+(puppet) Where to store dot-outputted graphs. Default value is: /var/puppet/state/graphs
+.TP
+.B \-\-group
+(puppetmasterd) The group
+.B puppetmasterd
+ should run as. Default value is: puppet
+.TP
+.B \-\-hostcert
+(certificates) Where individual hosts store and look for their certificates. Default value is: /etc/puppet/ssl/certs/culain.madstop.com.pem
+.TP
+.B \-\-hostprivkey
+(certificates) Where individual hosts store and look for their private key. Default value is: /etc/puppet/ssl/private_keys/culain.madstop.com.pem
+.TP
+.B \-\-hostpubkey
+(certificates) Where individual hosts store and look for their public key. Default value is: /etc/puppet/ssl/public_keys/culain.madstop.com.pem
+.TP
+.B \-\-httplog
+(puppetd) Where the
+.B puppetd
+web server logs. Default value is: /var/puppet/log/http.log
+.TP
+.B \-\-ignoreschedules
+(puppetd) Boolean; whether
+.B puppetd
+should ignore schedules. Default value is: This is useful for initial
+.B puppetd
+runs.
+.TP
+.B \-\-keylength
+(ca) The bit length of keys. Default value is: 1024
+.TP
+.B \-\-ldapattrs
+(ldap) The LDAP attributes to use to define Puppet classes. Values should be comma-separated. Default value is: puppetclass
+.TP
+.B \-\-ldapbase
+(ldap) The search base for LDAP searches. It's impossible to provide a meaningful default here, although the LDAP libraries might have one already set. Generally, it should be the 'ou=Hosts' branch under your main directory.
+.TP
+.B \-\-ldapnodes
+(ldap) Whether to search for node configurations in LDAP.
+.TP
+.B \-\-ldapparentattr
+(ldap) The attribute to use to define the parent node. Default value is: parentnode
+.TP
+.B \-\-ldappassword
+(ldap) The password to use to connect to LDAP.
+.TP
+.B \-\-ldapport
+(ldap) The LDAP port. Only used if ldapnodes is enabled. Default value is: 389
+.TP
+.B \-\-ldapserver
+(ldap) The LDAP server. Only used if ldapnodes is enabled. Default value is: ldap
+.TP
+.B \-\-ldapssl
+(ldap) Whether SSL should be used when searching for nodes. Defaults to false because SSL usually requires certificates to be set up on the client side.
+.TP
+.B \-\-ldapstring
+Default value is: (ldap)
+.TP
+.B \-\-The search string used to find an LDAP node.
+Default value is: (&(objectclass=puppetClient)(cn=%s))
+.TP
+.B \-\-ldaptls
+(ldap) Whether TLS should be used when searching for nodes. Defaults to false because TLS usually requires certificates to be set up on the client side.
+.TP
+.B \-\-ldapuser
+(ldap) The user to use to connect to LDAP. Must be specified as a full DN.
+.TP
+.B \-\-lexical
+(puppet) Whether to use lexical scoping (vs. dynamic).
+.TP
+.B \-\-listen
+(puppetd) Whether
+.B puppetd
+should listen for connections. If this is true, then by default only the runner server is started, which allows remote authorized and authenticated nodes to connect and trigger
+.B puppetd
+runs.
+.TP
+.B \-\-localcacert
+(certificates) Where each client stores the CA certificate. Default value is: /etc/puppet/ssl/certs/ca.pem
+.TP
+.B \-\-localconfig
+(puppetd) Where
+.B puppetd
+caches the local configuration. An extension indicating the cache format is added automatically. Default value is: /etc/puppet/localconfig
+.TP
+.B \-\-lockdir
+(puppet) Where lock files are kept. Default value is: /var/puppet/locks
+.TP
+.B \-\-logdir
+(puppet) The Puppet log directory. Default value is: /var/puppet/log
+.TP
+.B \-\-manifest
+(puppetmasterd) The entry-point manifest for
+.B puppetmasterd
+. Default value is: /etc/puppet/manifests/site.pp
+.TP
+.B \-\-manifestdir
+(puppetmasterd) Where
+.B puppetmasterd
+ looks for its manifests. Default value is: /etc/puppet/manifests
+.TP
+.B \-\-masterhttplog
+(puppetmasterd) Where the
+.B puppetmasterd
+ web server logs. Default value is: /var/puppet/log/masterhttp.log
+.TP
+.B \-\-masterlog
+(puppetmasterd) Where
+.B puppetmasterd
+ logs. This is generally not used, since syslog is the default log destination. Default value is: /var/puppet/log/puppetmaster.log
+.TP
+.B \-\-masterport
+(puppetmasterd) Which port
+.B puppetmasterd
+ listens on. Default value is: 8140
+.TP
+.B \-\-mkusers
+(puppet) Whether to create the necessary user and group that
+.B puppetd
+will run as.
+.TP
+.B \-\-node_name
+(puppetmasterd) How the puppetmaster determines the client's identity and sets the 'hostname' fact for use in the manifest, in particular for determining which 'node' statement applies to the client. Possible values are 'cert' (use the subject's CN in the client's certificate) and 'facter' (use the hostname that the client reported in its facts) Default value is: cert
+.TP
+.B \-\-noop
+(puppetd) Whether
+.B puppetd
+should be run in noop mode.
+.TP
+.B \-\-paramcheck
+(ast) Whether to validate parameters during parsing. Default value is: true
+.TP
+.B \-\-parseonly
+(puppetmasterd) Just check the syntax of the manifests.
+.TP
+.B \-\-passfile
+(certificates) Where
+.B puppetd
+stores the password for its private key. Generally unused. Default value is: /etc/puppet/ssl/private/password
+.TP
+.B \-\-path
+(puppet) The shell search path. Defaults to whatever is inherited from the parent process. Default value is: none
+.TP
+.B \-\-plugindest
+(puppet) Where Puppet should store plugins that it pulls down from the central server. Default value is: /var/puppet/plugins
+.TP
+.B \-\-pluginpath
+(puppet) Where Puppet should look for plugins. Mul.TPle directories should be colon-separated, like normal PATH variables. Default value is: /var/puppet/plugins
+.TP
+.B \-\-pluginsignore
+(puppet) What files to ignore when pulling down plugins. Default value is: .svn CVS
+.TP
+.B \-\-pluginsource
+(puppet) From where to retrieve plugins. The standard Puppet file type is used for retrieval, so anything that is a valid file source can be used here. Default value is: puppet://puppet/plugins
+.TP
+.B \-\-pluginsync
+(puppet) Whether plugins should be synced with the central server.
+.TP
+.B \-\-privatedir
+(certificates) Where the client stores private certificate information. Default value is: /etc/puppet/ssl/private
+.TP
+.B \-\-privatekeydir
+(certificates) The private key directory. Default value is: /etc/puppet/ssl/private_keys
+.TP
+.B \-\-publickeydir
+(certificates) The public key directory. Default value is: /etc/puppet/ssl/public_keys
+.TP
+.B \-\-puppetdlockfile
+(puppetd) A lock file to temporarily stop
+.B puppetd
+from doing anything. Default value is: /var/puppet/state/puppetdlock
+.TP
+.B \-\-puppetdlog
+(puppetd) The log file for puppetd. This is generally not used. Default value is: /var/puppet/log/puppetd.log
+.TP
+.B \-\-puppetport
+(puppetd) Which port
+.B puppetd
+listens on. Default value is: 8139
+.TP
+.B \-\-railslog
+(puppetmaster) Where Rails-specific logs are sent Default value is: /var/puppet/log/rails.log
+.TP
+.B \-\-report
+(puppetd) Whether to send reports after every transaction.
+.TP
+.B \-\-reportdir
+(reporting) The directory in which to store reports received from the client. Each client gets a separate subdirectory. /var/puppet/reports
+.TP
+.B \-\-reports
+(reporting) The list of reports to generate. All reports are looked for in puppet/reports/.rb, and mul.TPle report names should be comma-separated (whitespace is okay). Default value is: store
+.TP
+.B \-\-reportserver
+(puppetd) The server to which to send transaction reports. Default value is: puppet
+.TP
+.B \-\-req_bits
+(ca) The bit length of the certificates. Default value is: 2048
+.TP
+.B \-\-rrddir
+(metrics) The directory where RRD database files are stored. Directories for each reporting host will be created under this directory. Default value is: /var/puppet/rrd
+.TP
+.B \-\-rrdgraph
+(metrics) Whether RRD information should be graphed.
+.TP
+.B \-\-rrdinterval
+(metrics) How often RRD should expect data. This should match how often the hosts report back to the server. Default value is: 1800
+.TP
+.B \-\-rundir
+(puppet) Where Puppet PID files are kept. Default value is: /var/puppet/run
+.TP
+.B \-\-runinterval
+(puppetd) How often
+.B puppetd
+applies the client configuration; in seconds Default value is: 1800
+.TP
+.B \-\-serial
+(ca) Where the serial number for certificates is stored. Default value is: /etc/puppet/ssl/ca/serial
+.TP
+.B \-\-server
+(puppetd) The server to which server
+.B puppetd
+should connect puppet
+.TP
+.B \-\-setpidfile
+(puppet) Whether to store a PID file for the daemon. Default value is: true
+.TP
+.B \-\-signeddir
+(ca) Where the CA stores signed certificates. Default value is: /etc/puppet/ssl/ca/signed
+.TP
+.B \-\-ssldir
+(puppet) Where SSL certificates are kept. Default value is: /etc/puppet/ssl
+.TP
+.B \-\-statedir
+(puppet) The directory where Puppet state is stored. Generally, this directory can be removed without causing harm (although it might result in spurious service restarts). Default value is: /var/puppet/state
+.TP
+.B \-\-statefile
+(puppet) Where
+.B puppetd
+and
+.B puppetmasterd
+ store state associated with the running configuration. In the case of puppetmasterd, this file reflects the state discovered through interacting with clients. Default value is: /var/puppet/state/state.yaml
+.TP
+.B \-\-storeconfigs
+(puppetmaster) Whether to store each client's configuration. This requires ActiveRecord from Ruby on Rails.
+.TP
+.B \-\-syslogfacility
+(puppet) What syslog facility to use when logging to syslog. Syslog has a fixed list of valid facilities, and you must choose one of those; you cannot just make one up. daemon
+.TP
+.B \-\-tags
+(transaction) Tags to use to find resources. If this is set, then only resources tagged with the specified tags will be applied. Values must be comma-separated.
+.TP
+.B \-\-templatedir
+(puppet) Where Puppet looks for template files. Default value is: /var/puppet/templates
+.TP
+.B \-\-trace
+(puppet) Whether to print stack traces on some errors
+.TP
+.B \-\-typecheck
+(ast) Whether to validate types during parsing. Default value is: true
+.TP
+.B \-\-usecacheonfailure
+(puppetd) Whether to use the cached configuration when the remote configuration will not compile. This option is useful for testing new configurations, where you want to fix the broken configuration rather than reverting to a known-good one. Default value is: true
+.TP
+.B \-\-user
+(puppetmasterd) The user
+.B puppetmasterd
+ should run as. Default value is: puppet
+.TP
+.B \-\-vardir
+(puppet) Where Puppet stores dynamic and growing data. Default value is: /var/puppet
+.SH SEE ALSO
+.br
+http://www.reductivelabs.com/projects/puppet
+.br
+http://www.reductivelabs.com/trac/puppet/wiki/DocumentationStart
+.PP
+.SH AUTHOR
+.B puppet
+was written by Luke Kanies (luke at reductivelabs.com) along with contributions from a great many tireless developers.
+.SH AVAILABILITY
+.B puppet
+is available from http://www.reductivelabs.com/downloads/.
+.SH SEE ALSO
+.BR facter (8)
+
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..82a749a
--- /dev/null
+++ b/test/README
@@ -0,0 +1,24 @@
+$Id$
+
+To run all tests, run: 'rake test'. To run an individual suite, run the file
+directly. e.g. cd test/util; ./utiltest.rb
+
+You might need to run some tests as root.
+
+If you do not have rake installed:
+ gem install rake
+
+## The following information is possibly out of date?
+
+Tests are organized into a dual hierarchy: each subdirectory is
+considered a test suite, and each file in the subdirectory is considered
+a test case. You can use any test case as an example of how to write
+more of them, but basically the only requirements are that they each have
+their own class names, their names each match /tc_.+\.r/, and that they have
+the following header:
+
+if __FILE__ == $0
+ $:.unshift '..'
+ $:.unshift '../../lib'
+ $blinkbase = "../.."
+end
diff --git a/test/data/failers/badclassnoparam b/test/data/failers/badclassnoparam
new file mode 100644
index 0000000..a0397aa
--- /dev/null
+++ b/test/data/failers/badclassnoparam
@@ -0,0 +1,10 @@
+class comp() {
+ file { "/etc/passwd":
+ mode => 644
+ }
+}
+
+# this argument is invalid, thus we should get a falure
+comp {
+ fakearg => "yay"
+}
diff --git a/test/data/failers/badclassparam b/test/data/failers/badclassparam
new file mode 100644
index 0000000..4c9ff61
--- /dev/null
+++ b/test/data/failers/badclassparam
@@ -0,0 +1,10 @@
+class comp(arg1) {
+ file { "/etc/passwd":
+ mode => 644
+ }
+}
+
+# i've specified an arg but it's an invalid one
+comp {
+ fakearg => "yay"
+}
diff --git a/test/data/failers/badcompnoparam b/test/data/failers/badcompnoparam
new file mode 100644
index 0000000..fd25c94
--- /dev/null
+++ b/test/data/failers/badcompnoparam
@@ -0,0 +1,9 @@
+define comp() {
+ file { "/etc/passwd":
+ mode => 644
+ }
+}
+
+comp {
+ fakearg => "yay"
+}
diff --git a/test/data/failers/badcompparam b/test/data/failers/badcompparam
new file mode 100644
index 0000000..346e64b
--- /dev/null
+++ b/test/data/failers/badcompparam
@@ -0,0 +1,9 @@
+define comp($arg1) {
+ file { "/etc/passwd":
+ mode => 644
+ }
+}
+
+comp {
+ fakearg => "yay"
+}
diff --git a/test/data/failers/badtypeparam b/test/data/failers/badtypeparam
new file mode 100644
index 0000000..4634f20
--- /dev/null
+++ b/test/data/failers/badtypeparam
@@ -0,0 +1,3 @@
+file { "/etc/passwd":
+ fakeparam => 644
+}
diff --git a/test/data/failers/noobjectrvalue b/test/data/failers/noobjectrvalue
new file mode 100644
index 0000000..ef60647
--- /dev/null
+++ b/test/data/failers/noobjectrvalue
@@ -0,0 +1 @@
+$variable = file { "/etc/passwd": owner => root }
diff --git a/test/data/providers/cron/crontab.allthree b/test/data/providers/cron/crontab.allthree
new file mode 100644
index 0000000..dd2a404
--- /dev/null
+++ b/test/data/providers/cron/crontab.allthree
@@ -0,0 +1,17 @@
+---
+- |
+ # comment 1
+ # Puppet Name: name2
+ env3=val
+ * * * * * command4
+ # comment 5
+
+- - :record_type: :comment
+ :line: "# comment 1"
+ - :command: command4
+ :environment:
+ - env3=val
+ :name: name2
+ :record_type: :crontab
+ - :record_type: :comment
+ :line: "# comment 5"
diff --git a/test/data/providers/cron/crontab.envNcomment b/test/data/providers/cron/crontab.envNcomment
new file mode 100644
index 0000000..63effe0
--- /dev/null
+++ b/test/data/providers/cron/crontab.envNcomment
@@ -0,0 +1,12 @@
+---
+- |
+ # comment 9
+ env10=val
+ * * * * * command11
+
+- - :record_type: :comment
+ :line: "# comment 9"
+ - :record_type: :environment
+ :line: env10=val
+ - :command: command11
+ :record_type: :crontab
diff --git a/test/data/providers/cron/crontab.envNname b/test/data/providers/cron/crontab.envNname
new file mode 100644
index 0000000..cc05824
--- /dev/null
+++ b/test/data/providers/cron/crontab.envNname
@@ -0,0 +1,11 @@
+---
+- |
+ env6=val
+ # Puppet Name: name7
+ * * * * * command8
+
+- - :record_type: :environment
+ :line: env6=val
+ - :command: command8
+ :record_type: :crontab
+ :name: name7
diff --git a/test/data/providers/cron/crontab.multirecords b/test/data/providers/cron/crontab.multirecords
new file mode 100644
index 0000000..63effe0
--- /dev/null
+++ b/test/data/providers/cron/crontab.multirecords
@@ -0,0 +1,12 @@
+---
+- |
+ # comment 9
+ env10=val
+ * * * * * command11
+
+- - :record_type: :comment
+ :line: "# comment 9"
+ - :record_type: :environment
+ :line: env10=val
+ - :command: command11
+ :record_type: :crontab
diff --git a/test/data/providers/cron/crontab_collections.yaml b/test/data/providers/cron/crontab_collections.yaml
new file mode 100644
index 0000000..45c8eaf
--- /dev/null
+++ b/test/data/providers/cron/crontab_collections.yaml
@@ -0,0 +1,44 @@
+---
+:with_name:
+- :name
+- :spaces_in_command_with_times
+:with_env:
+- :environment
+- :spaces_in_command_with_times
+:simple:
+- :spaces_in_command_with_times
+:with_multiple_envs:
+- :environment
+- :lowercase_environment
+- :spaces_in_command_with_times
+:with_name_and_env:
+- :name_with_spaces
+- :another_env
+- :spaces_in_command_with_times
+:with_name_and_multiple_envs:
+- :long_name
+- :another_env
+- :fourth_env
+- :spaces_in_command_with_times
+---
+:with_name:
+- :name
+- :spaces_in_command_with_times
+:with_env:
+- :environment
+- :spaces_in_command_with_times
+:simple:
+- :spaces_in_command_with_times
+:with_multiple_envs:
+- :environment
+- :lowercase_environment
+- :spaces_in_command_with_times
+:with_name_and_env:
+- :name_with_spaces
+- :another_env
+- :spaces_in_command_with_times
+:with_name_and_multiple_envs:
+- :long_name
+- :another_env
+- :fourth_env
+- :spaces_in_command_with_times
diff --git a/test/data/providers/cron/crontab_multiple_with_env.yaml b/test/data/providers/cron/crontab_multiple_with_env.yaml
new file mode 100644
index 0000000..8573bd4
--- /dev/null
+++ b/test/data/providers/cron/crontab_multiple_with_env.yaml
@@ -0,0 +1,54 @@
+---
+- |
+ # comment 1
+ # Puppet Name: name2
+ env3=val
+ * * * * * command4
+ # Puppet Name: name with spaces
+ env3=val
+ env4=other
+ * * * * * command5
+ # comment 5
+
+- - :record_type: :comment
+ :line: "# comment 1"
+ - :command: command4
+ :environment:
+ - env3=val
+ :name: name2
+ :record_type: :crontab
+ - :command: command5
+ :environment:
+ - env3=val
+ - env4=other
+ :name: name with spaces
+ :record_type: :crontab
+ - :record_type: :comment
+ :line: "# comment 5"
+---
+- |
+ # comment 1
+ # Puppet Name: name2
+ env3=val
+ * * * * * command4
+ # Puppet Name: name with spaces
+ env3=val
+ env4=other
+ * * * * * command5
+ # comment 5
+
+- - :record_type: :comment
+ :line: "# comment 1"
+ - :command: command4
+ :environment:
+ - env3=val
+ :name: name2
+ :record_type: :crontab
+ - :command: command5
+ :environment:
+ - env3=val
+ - env4=other
+ :name: name with spaces
+ :record_type: :crontab
+ - :record_type: :comment
+ :line: "# comment 5"
diff --git a/test/data/providers/cron/crontab_sample_records.yaml b/test/data/providers/cron/crontab_sample_records.yaml
new file mode 100644
index 0000000..cafe9de
--- /dev/null
+++ b/test/data/providers/cron/crontab_sample_records.yaml
@@ -0,0 +1,272 @@
+---
+:longcommment:
+ :text: "# This is a comment"
+ :record:
+ :line: "# This is a comment"
+ :record_type: :comment
+:special:
+ :text: "@hourly /bin/date"
+ :record:
+ :special: hourly
+ :command: /bin/date
+ :record_type: :freebsd_special
+:long_name:
+ :text: "# Puppet Name: long_name"
+ :record:
+ :line: "# Puppet Name: long_name"
+ :name: long_name
+ :record_type: :comment
+:multiple_minutes:
+ :text: 5,15 * * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ - "15"
+ :command: /bin/date
+ :record_type: :crontab
+:environment:
+ :text: ONE=TWO
+ :record:
+ :line: ONE=TWO
+ :record_type: :environment
+:empty:
+ :text: ""
+ :record:
+ :line: ""
+ :record_type: :blank
+:simple:
+ :text: "* * * * * /bin/date"
+ :record:
+ :command: /bin/date
+ :record_type: :crontab
+:whitespace:
+ :text: " "
+ :record:
+ :line: " "
+ :record_type: :blank
+:minute_and_hour:
+ :text: 5 15 * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ :hour:
+ - "15"
+ :command: /bin/date
+ :record_type: :crontab
+:lowercase_environment:
+ :text: a=b
+ :record:
+ :line: a=b
+ :record_type: :environment
+:special_with_spaces:
+ :text: "@daily /bin/echo testing"
+ :record:
+ :special: daily
+ :command: /bin/echo testing
+ :record_type: :freebsd_special
+:tabs:
+ :text: !binary |
+ CQ==
+
+ :record:
+ :line: !binary |
+ CQ==
+
+ :record_type: :blank
+:multiple_minute_and_hour:
+ :text: 5,10 15,20 * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ - "10"
+ :hour:
+ - "15"
+ - "20"
+ :command: /bin/date
+ :record_type: :crontab
+:name:
+ :text: "# Puppet Name: testing"
+ :record:
+ :line: "# Puppet Name: testing"
+ :name: testing
+ :record_type: :comment
+:another_env:
+ :text: Testing=True
+ :record:
+ :line: Testing=True
+ :record_type: :environment
+:shortcomment:
+ :text: "#"
+ :record:
+ :line: "#"
+ :record_type: :comment
+:spaces_in_command:
+ :text: "* * * * * /bin/echo testing"
+ :record:
+ :command: /bin/echo testing
+ :record_type: :crontab
+:fourth_env:
+ :text: True=False
+ :record:
+ :line: True=False
+ :record_type: :environment
+:simple_with_minute:
+ :text: 5 * * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ :command: /bin/date
+ :record_type: :crontab
+:spaces_in_command_with_times:
+ :text: 5,10 15,20 * * * /bin/echo testing
+ :record:
+ :minute:
+ - "5"
+ - "10"
+ :hour:
+ - "15"
+ - "20"
+ :command: /bin/echo testing
+ :record_type: :crontab
+:name_with_spaces:
+ :text: "# Puppet Name: another name"
+ :record:
+ :line: "# Puppet Name: another name"
+ :name: another name
+ :record_type: :comment
+---
+:longcommment:
+ :text: "# This is a comment"
+ :record:
+ :line: "# This is a comment"
+ :record_type: :comment
+:special:
+ :text: "@hourly /bin/date"
+ :record:
+ :special: hourly
+ :command: /bin/date
+ :record_type: :freebsd_special
+:long_name:
+ :text: "# Puppet Name: long_name"
+ :record:
+ :line: "# Puppet Name: long_name"
+ :name: long_name
+ :record_type: :comment
+:multiple_minutes:
+ :text: 5,15 * * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ - "15"
+ :command: /bin/date
+ :record_type: :crontab
+:environment:
+ :text: ONE=TWO
+ :record:
+ :line: ONE=TWO
+ :record_type: :environment
+:empty:
+ :text: ""
+ :record:
+ :line: ""
+ :record_type: :blank
+:simple:
+ :text: "* * * * * /bin/date"
+ :record:
+ :command: /bin/date
+ :record_type: :crontab
+:whitespace:
+ :text: " "
+ :record:
+ :line: " "
+ :record_type: :blank
+:minute_and_hour:
+ :text: 5 15 * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ :hour:
+ - "15"
+ :command: /bin/date
+ :record_type: :crontab
+:lowercase_environment:
+ :text: a=b
+ :record:
+ :line: a=b
+ :record_type: :environment
+:special_with_spaces:
+ :text: "@daily /bin/echo testing"
+ :record:
+ :special: daily
+ :command: /bin/echo testing
+ :record_type: :freebsd_special
+:tabs:
+ :text: !binary |
+ CQ==
+
+ :record:
+ :line: !binary |
+ CQ==
+
+ :record_type: :blank
+:multiple_minute_and_hour:
+ :text: 5,10 15,20 * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ - "10"
+ :hour:
+ - "15"
+ - "20"
+ :command: /bin/date
+ :record_type: :crontab
+:name:
+ :text: "# Puppet Name: testing"
+ :record:
+ :line: "# Puppet Name: testing"
+ :name: testing
+ :record_type: :comment
+:another_env:
+ :text: Testing=True
+ :record:
+ :line: Testing=True
+ :record_type: :environment
+:shortcomment:
+ :text: "#"
+ :record:
+ :line: "#"
+ :record_type: :comment
+:spaces_in_command:
+ :text: "* * * * * /bin/echo testing"
+ :record:
+ :command: /bin/echo testing
+ :record_type: :crontab
+:fourth_env:
+ :text: True=False
+ :record:
+ :line: True=False
+ :record_type: :environment
+:simple_with_minute:
+ :text: 5 * * * * /bin/date
+ :record:
+ :minute:
+ - "5"
+ :command: /bin/date
+ :record_type: :crontab
+:spaces_in_command_with_times:
+ :text: 5,10 15,20 * * * /bin/echo testing
+ :record:
+ :minute:
+ - "5"
+ - "10"
+ :hour:
+ - "15"
+ - "20"
+ :command: /bin/echo testing
+ :record_type: :crontab
+:name_with_spaces:
+ :text: "# Puppet Name: another name"
+ :record:
+ :line: "# Puppet Name: another name"
+ :name: another name
+ :record_type: :comment
diff --git a/test/data/providers/cron/examples/freebsd b/test/data/providers/cron/examples/freebsd
new file mode 100644
index 0000000..fba1e31
--- /dev/null
+++ b/test/data/providers/cron/examples/freebsd
@@ -0,0 +1,2 @@
+ at daily /path/to/some/job
+ at reboot /path/to/some/job
diff --git a/test/data/providers/cron/examples/one b/test/data/providers/cron/examples/one
new file mode 100644
index 0000000..9cddf97
--- /dev/null
+++ b/test/data/providers/cron/examples/one
@@ -0,0 +1,14 @@
+TZ=Europe/Paris
+#
+# Some comments
+# and more comments
+#
+SHELL=/bin/sh
+0 0 * * * /usr/local/bin/savelogs --period --postmovehook="/usr/local/apache/bin/apachectl graceful" --apacheconf=/www/conf/httpd.conf
+58 23 * * * /usr/bin/diff /var/log/slow-queries.log /backup/var/log/slow-queries.log
+59 23 * * * /usr/bin/diff /var/db/mysql/*.err /backup/var/db/mysql/*.err
+0 7 * * Mon cd /usr/local/install; find . -maxdepth 1 -type f -mtime -30 -exec ls -l {} \; | mail -E -s 'Recent vinstall kits' vinstall at domain.com
+#* * * * * /bin/ls|mail -s 'test !!' gg at domain.com
+47 4 * * 1 /usr/local/bin/wget 'ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY' -O /home/installman/www/install.domain.com/inst/MIRRORED.BY
+25 */2 * * * /usr/local/bin/freshclam --quiet
+#* * * * * /root/top.sh
diff --git a/test/data/providers/cron/examples/openbsd b/test/data/providers/cron/examples/openbsd
new file mode 100644
index 0000000..d77597d
--- /dev/null
+++ b/test/data/providers/cron/examples/openbsd
@@ -0,0 +1,20 @@
+#
+SHELL=/bin/sh
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+HOME=/var/log
+#
+#minute hour mday month wday command
+#
+# sendmail clientmqueue runner
+*/30 * * * * /usr/sbin/sendmail -L sm-msp-queue -Ac -q
+#
+# rotate log files every hour, if necessary
+0 * * * * /usr/bin/newsyslog
+# send log file notifications, if necessary
+#1-59 * * * * /usr/bin/newsyslog -m
+#
+# do daily/weekly/monthly maintenance
+30 1 * * * /bin/sh /etc/daily 2>&1 | tee /var/log/daily.out | mail -s "`/bin/hostname` daily output" root
+30 3 * * 6 /bin/sh /etc/weekly 2>&1 | tee /var/log/weekly.out | mail -s "`/bin/hostname` weekly output" root
+30 5 1 * * /bin/sh /etc/monthly 2>&1 | tee /var/log/monthly.out | mail -s "`/bin/hostname` monthly output" root
+#0 * * * * /usr/libexec/spamd-setup
diff --git a/test/data/providers/package/testpackages.yaml b/test/data/providers/package/testpackages.yaml
new file mode 100644
index 0000000..8d8935e
--- /dev/null
+++ b/test/data/providers/package/testpackages.yaml
@@ -0,0 +1,65 @@
+---
+- :operatingsystem: Solaris
+ :files:
+ - /usr/local/pkg/rdesktop-1.3.1-sol10-intel-local
+ - /usr/local/pkg/rdesktop-1.4.1-sol10-x86-local
+ :hardwareisa: i386
+ :name: SMCrdesk
+ :operatingsystemrelease: "5.10"
+ :provider: :sun
+- :operatingsystem: Solaris
+ :name: cabextract
+ :provider: :blastwave
+- :operatingsystem: Solaris
+ :files:
+ - /usr/local/pkg/arc-5.21e-sol8-sparc-local
+ :hardwareisa: sparc
+ :name: SMCarc
+ :operatingsystemrelease: "5.8"
+ :provider: :sun
+- :operatingsystem: Solaris
+ :files:
+ - /usr/local/pkg/arc-5.21e-sol8-intel-local
+ :hardwareisa: i386
+ :name: SMCarc
+ :operatingsystemrelease: "5.8"
+ :provider: :sun
+- :operatingsystem: OpenBSD
+ :files:
+ - ftp://ftp.usa.openbsd.org/pub/OpenBSD/3.8/packages/i386/aalib-1.2-no_x11.tgz
+ :name: aalib
+ :provider: :openbsd
+- :operatingsystem: Debian
+ :name: zec
+ :provider: :apt
+- :operatingsystem: Debian
+ :name: zec
+ :provider: :aptitude
+- :operatingsystem: Fedora
+ :name: wv
+ :provider: :yum
+- :operatingsystem:
+ - Fedora
+ - CentOS
+ - RedHat
+ :files:
+ - /home/luke/rpm/RPMS/noarch/enhost-1.0.1-1.noarch.rpm
+ - /home/luke/rpm/RPMS/noarch/enhost-1.0.2-1.noarch.rpm
+ :name: enhost
+ :provider: :rpm
+- :operatingsystem: Darwin
+ :name: aop
+ :provider: :darwinports
+- :operatingsystem: FreeBSD
+ :name: yahtzee
+ :provider: :ports
+- :provider: :apple
+ :files:
+ - /Users/luke/Documents/Puppet/pkgtesting.pkg
+ :name: pkgtesting
+ :cleanup: rm -rf /Library/Receipts/pkgtesting.pkg/ /tmp/file
+- :provider: :gem
+ :name: wxrubylayouts
+ :versions:
+ - 0.0.2
+ - 0.0.3
diff --git a/test/data/reports/1.yaml b/test/data/reports/1.yaml
new file mode 100644
index 0000000..3805e90
--- /dev/null
+++ b/test/data/reports/1.yaml
@@ -0,0 +1,108 @@
+--- !ruby/object:Puppet::Transaction::Report
+host: culain.madstop.com
+logs:
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: executed successfully
+ objectsource: true
+ source: //culain.madstop.com/puppetserver/exec=/bin/echo testing/returns
+ tags:
+ - :puppetserver
+ - :puppetserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :exec
+ - :returns
+ time: 2006-09-21 13:06:59.867782 -05:00
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: ensure changed 'stopped' to 'running'
+ objectsource: true
+ source: //culain.madstop.com/mailserver/service=spamassassin/ensure
+ tags:
+ - :mailserver
+ - :mailserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :service
+ - :ensure
+ time: 2006-09-21 13:07:01.336511 -05:00
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: ensure changed 'stopped' to 'running'
+ objectsource: true
+ source: //culain.madstop.com/mailserver/service=courier-imap-ssl/ensure
+ tags:
+ - :mailserver
+ - :mailserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :service
+ - :ensure
+ time: 2006-09-21 13:07:01.573506 -05:00
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: ensure changed 'stopped' to 'running'
+ objectsource: true
+ source: //culain.madstop.com/mailserver/service=courier-authdaemon/ensure
+ tags:
+ - :mailserver
+ - :mailserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :service
+ - :ensure
+ time: 2006-09-21 13:07:01.680440 -05:00
+metrics:
+ time: !ruby/object:Puppet::Metric
+ label: Time
+ name: time
+ values:
+ - - :config_retrieval
+ - Config retrieval
+ - 2.26467204093933
+ - - :total
+ - Total
+ - 21.7894113063812
+ changes: !ruby/object:Puppet::Metric
+ label: Changes
+ name: changes
+ values:
+ - - :total
+ - Total
+ - 4
+ objects: !ruby/object:Puppet::Metric
+ label: Objects
+ name: objects
+ values:
+ - - :scheduled
+ - Scheduled
+ - 78
+ - - :applied
+ - Applied
+ - 4
+ - - :restarted
+ - Restarted
+ - 0
+ - - :skipped
+ - Skipped
+ - 0
+ - - :failed_restarts
+ - Failed restarts
+ - 0
+ - - :out_of_sync
+ - Out of sync
+ - 4
+ - - :failed
+ - Failed
+ - 0
+ - - :total
+ - Total
+ - 79
+records: {}
+
+time: 2006-09-21 13:07:06.825337 -05:00
diff --git a/test/data/reports/2.yaml b/test/data/reports/2.yaml
new file mode 100644
index 0000000..3805e90
--- /dev/null
+++ b/test/data/reports/2.yaml
@@ -0,0 +1,108 @@
+--- !ruby/object:Puppet::Transaction::Report
+host: culain.madstop.com
+logs:
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: executed successfully
+ objectsource: true
+ source: //culain.madstop.com/puppetserver/exec=/bin/echo testing/returns
+ tags:
+ - :puppetserver
+ - :puppetserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :exec
+ - :returns
+ time: 2006-09-21 13:06:59.867782 -05:00
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: ensure changed 'stopped' to 'running'
+ objectsource: true
+ source: //culain.madstop.com/mailserver/service=spamassassin/ensure
+ tags:
+ - :mailserver
+ - :mailserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :service
+ - :ensure
+ time: 2006-09-21 13:07:01.336511 -05:00
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: ensure changed 'stopped' to 'running'
+ objectsource: true
+ source: //culain.madstop.com/mailserver/service=courier-imap-ssl/ensure
+ tags:
+ - :mailserver
+ - :mailserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :service
+ - :ensure
+ time: 2006-09-21 13:07:01.573506 -05:00
+- !ruby/object:Puppet::Log
+ level: :notice
+ message: ensure changed 'stopped' to 'running'
+ objectsource: true
+ source: //culain.madstop.com/mailserver/service=courier-authdaemon/ensure
+ tags:
+ - :mailserver
+ - :mailserver
+ - :basenode
+ - :"culain.madstop.com"
+ - :puppet
+ - :service
+ - :ensure
+ time: 2006-09-21 13:07:01.680440 -05:00
+metrics:
+ time: !ruby/object:Puppet::Metric
+ label: Time
+ name: time
+ values:
+ - - :config_retrieval
+ - Config retrieval
+ - 2.26467204093933
+ - - :total
+ - Total
+ - 21.7894113063812
+ changes: !ruby/object:Puppet::Metric
+ label: Changes
+ name: changes
+ values:
+ - - :total
+ - Total
+ - 4
+ objects: !ruby/object:Puppet::Metric
+ label: Objects
+ name: objects
+ values:
+ - - :scheduled
+ - Scheduled
+ - 78
+ - - :applied
+ - Applied
+ - 4
+ - - :restarted
+ - Restarted
+ - 0
+ - - :skipped
+ - Skipped
+ - 0
+ - - :failed_restarts
+ - Failed restarts
+ - 0
+ - - :out_of_sync
+ - Out of sync
+ - 4
+ - - :failed
+ - Failed
+ - 0
+ - - :total
+ - Total
+ - 79
+records: {}
+
+time: 2006-09-21 13:07:06.825337 -05:00
diff --git a/test/data/reports/tagmail_failers.conf b/test/data/reports/tagmail_failers.conf
new file mode 100644
index 0000000..d116b5f
--- /dev/null
+++ b/test/data/reports/tagmail_failers.conf
@@ -0,0 +1,3 @@
+tag:
+: abuse at domain.com
+invalid!tag: abuse at domain.com
diff --git a/test/data/reports/tagmail_passers.conf b/test/data/reports/tagmail_passers.conf
new file mode 100644
index 0000000..6cadf03
--- /dev/null
+++ b/test/data/reports/tagmail_passers.conf
@@ -0,0 +1,30 @@
+# A comment
+# or maybe two
+# plus some blank lines
+ # with some blanks plus a comment
+
+# a simple tag report
+one: abuse at domain.com
+
+# with weird spacing
+ one : abuse at domain.com
+
+# with multiple tags
+one, two: abuse at domain.com
+
+# again with the weird syntax
+ one , two : abuse at domain.com
+
+# Some negations
+one, !two: abuse at domain.com
+
+# some oddly-formatted tags
+one, two-three, !four-five, !six: abuse at domain.com
+
+# multiple addresses
+one, two: abuse at domain.com, testing at domain.com
+
+# and with weird spacing
+one, two: abuse at domain.com , testing at domain.com
+
+# and a trailing comment
diff --git a/test/data/snippets/aliastest.pp b/test/data/snippets/aliastest.pp
new file mode 100644
index 0000000..f2b6159
--- /dev/null
+++ b/test/data/snippets/aliastest.pp
@@ -0,0 +1,16 @@
+file { "a file":
+ path => "/tmp/aliastest",
+ ensure => file
+}
+
+file { "another":
+ path => "/tmp/aliastest2",
+ ensure => file,
+ require => File["a file"]
+}
+
+file { "a third":
+ path => "/tmp/aliastest3",
+ ensure => file,
+ require => File["/tmp/aliastest"]
+}
diff --git a/test/data/snippets/argumentdefaults b/test/data/snippets/argumentdefaults
new file mode 100644
index 0000000..eac9dd7
--- /dev/null
+++ b/test/data/snippets/argumentdefaults
@@ -0,0 +1,14 @@
+# $Id$
+
+define testargs($file, $mode = 755) {
+ file { $file: ensure => file, mode => $mode }
+}
+
+testargs { "testingname":
+ file => "/tmp/argumenttest1"
+}
+
+testargs { "testingother":
+ file => "/tmp/argumenttest2",
+ mode => 644
+}
diff --git a/test/data/snippets/casestatement.pp b/test/data/snippets/casestatement.pp
new file mode 100644
index 0000000..4fcf2e4
--- /dev/null
+++ b/test/data/snippets/casestatement.pp
@@ -0,0 +1,58 @@
+# $Id$
+
+$var = "value"
+
+case $var {
+ "nope": {
+ file { "/tmp/fakefile": mode => 644, ensure => file }
+ }
+ "value": {
+ file { "/tmp/existsfile": mode => 755, ensure => file }
+ }
+}
+
+$ovar = "yayness"
+
+case $ovar {
+ "fooness": {
+ file { "/tmp/nostillexistsfile": mode => 644, ensure => file }
+ }
+ "booness", "yayness": {
+ case $var {
+ "nep": {
+ file { "/tmp/noexistsfile": mode => 644, ensure => file }
+ }
+ "value": {
+ file { "/tmp/existsfile2": mode => 755, ensure => file }
+ }
+ }
+ }
+}
+
+case $ovar {
+ "fooness": {
+ file { "/tmp/nostillexistsfile": mode => 644, ensure => file }
+ }
+ default: {
+ file { "/tmp/existsfile3": mode => 755, ensure => file }
+ }
+}
+
+$bool = true
+
+case $bool {
+ true: {
+ file { "/tmp/existsfile4": mode => 755, ensure => file }
+ }
+}
+
+$yay = yay
+$a = yay
+$b = boo
+
+case $yay {
+ $a: { file { "/tmp/existsfile5": mode => 755, ensure => file } }
+ $b: { file { "/tmp/existsfile5": mode => 644, ensure => file } }
+ default: { file { "/tmp/existsfile5": mode => 711, ensure => file } }
+
+}
diff --git a/test/data/snippets/classheirarchy.pp b/test/data/snippets/classheirarchy.pp
new file mode 100644
index 0000000..36619d8
--- /dev/null
+++ b/test/data/snippets/classheirarchy.pp
@@ -0,0 +1,15 @@
+# $Id$
+
+class base {
+ file { "/tmp/classheir1": ensure => file, mode => 755 }
+}
+
+class sub1 inherits base {
+ file { "/tmp/classheir2": ensure => file, mode => 755 }
+}
+
+class sub2 inherits base {
+ file { "/tmp/classheir3": ensure => file, mode => 755 }
+}
+
+include sub1, sub2
diff --git a/test/data/snippets/classincludes.pp b/test/data/snippets/classincludes.pp
new file mode 100644
index 0000000..9278005
--- /dev/null
+++ b/test/data/snippets/classincludes.pp
@@ -0,0 +1,17 @@
+# $Id$
+
+class base {
+ file { "/tmp/classincludes1": ensure => file, mode => 755 }
+}
+
+class sub1 inherits base {
+ file { "/tmp/classincludes2": ensure => file, mode => 755 }
+}
+
+class sub2 inherits base {
+ file { "/tmp/classincludes3": ensure => file, mode => 755 }
+}
+
+$sub = "sub2"
+
+include sub1, $sub
diff --git a/test/data/snippets/classpathtest b/test/data/snippets/classpathtest
new file mode 100644
index 0000000..5803333
--- /dev/null
+++ b/test/data/snippets/classpathtest
@@ -0,0 +1,11 @@
+# $Id$
+
+define mytype {
+ file { "/tmp/classtest": ensure => file, mode => 755 }
+}
+
+class testing {
+ mytype { "componentname": }
+}
+
+include testing
diff --git a/test/data/snippets/collection.pp b/test/data/snippets/collection.pp
new file mode 100644
index 0000000..bc29510
--- /dev/null
+++ b/test/data/snippets/collection.pp
@@ -0,0 +1,10 @@
+class one {
+ @file { "/tmp/colltest1": content => "one" }
+ @file { "/tmp/colltest2": content => "two" }
+}
+
+class two {
+ File <| content == "one" |>
+}
+
+include one, two
diff --git a/test/data/snippets/collection_within_virtual_definitions.pp b/test/data/snippets/collection_within_virtual_definitions.pp
new file mode 100644
index 0000000..3c21468
--- /dev/null
+++ b/test/data/snippets/collection_within_virtual_definitions.pp
@@ -0,0 +1,20 @@
+define test($name) {
+ file {"/tmp/collection_within_virtual_definitions1_$name.txt":
+ content => "File name $name\n"
+ }
+ Test2 <||>
+}
+
+define test2() {
+ file {"/tmp/collection_within_virtual_definitions2_$name.txt":
+ content => "This is a test\n"
+ }
+}
+
+node default {
+ @test {"foo":
+ name => "foo"
+ }
+ @test2 {"foo2": }
+ Test <||>
+}
diff --git a/test/data/snippets/componentmetaparams.pp b/test/data/snippets/componentmetaparams.pp
new file mode 100644
index 0000000..7d9f0c2
--- /dev/null
+++ b/test/data/snippets/componentmetaparams.pp
@@ -0,0 +1,11 @@
+file { "/tmp/component1":
+ ensure => file
+}
+
+define thing {
+ file { $name: ensure => file }
+}
+
+thing { "/tmp/component2":
+ require => File["/tmp/component1"]
+}
diff --git a/test/data/snippets/componentrequire.pp b/test/data/snippets/componentrequire.pp
new file mode 100644
index 0000000..a61d205
--- /dev/null
+++ b/test/data/snippets/componentrequire.pp
@@ -0,0 +1,8 @@
+define testfile($mode) {
+ file { $name: mode => $mode, ensure => present }
+}
+
+testfile { "/tmp/testing_component_requires2": mode => 755 }
+
+file { "/tmp/testing_component_requires1": mode => 755, ensure => present,
+ require => Testfile["/tmp/testing_component_requires2"] }
diff --git a/test/data/snippets/deepclassheirarchy.pp b/test/data/snippets/deepclassheirarchy.pp
new file mode 100644
index 0000000..249e633
--- /dev/null
+++ b/test/data/snippets/deepclassheirarchy.pp
@@ -0,0 +1,23 @@
+# $Id$
+
+class base {
+ file { "/tmp/deepclassheir1": ensure => file, mode => 755 }
+}
+
+class sub1 inherits base {
+ file { "/tmp/deepclassheir2": ensure => file, mode => 755 }
+}
+
+class sub2 inherits sub1 {
+ file { "/tmp/deepclassheir3": ensure => file, mode => 755 }
+}
+
+class sub3 inherits sub2 {
+ file { "/tmp/deepclassheir4": ensure => file, mode => 755 }
+}
+
+class sub4 inherits sub3 {
+ file { "/tmp/deepclassheir5": ensure => file, mode => 755 }
+}
+
+include sub4
diff --git a/test/data/snippets/defineoverrides.pp b/test/data/snippets/defineoverrides.pp
new file mode 100644
index 0000000..c68b139
--- /dev/null
+++ b/test/data/snippets/defineoverrides.pp
@@ -0,0 +1,17 @@
+# $Id$
+
+$file = "/tmp/defineoverrides1"
+
+define myfile($mode) {
+ file { $name: ensure => file, mode => $mode }
+}
+
+class base {
+ myfile { $file: mode => 644 }
+}
+
+class sub inherits base {
+ Myfile[$file] { mode => 755, } # test the end-comma
+}
+
+include sub
diff --git a/test/data/snippets/emptyclass.pp b/test/data/snippets/emptyclass.pp
new file mode 100644
index 0000000..48047e7
--- /dev/null
+++ b/test/data/snippets/emptyclass.pp
@@ -0,0 +1,9 @@
+# $Id$
+
+define component {
+}
+
+class testing {
+}
+
+include testing
diff --git a/test/data/snippets/emptyexec.pp b/test/data/snippets/emptyexec.pp
new file mode 100644
index 0000000..847a30d
--- /dev/null
+++ b/test/data/snippets/emptyexec.pp
@@ -0,0 +1,3 @@
+exec { "touch /tmp/emptyexectest":
+ path => "/usr/bin:/bin"
+}
diff --git a/test/data/snippets/falsevalues.pp b/test/data/snippets/falsevalues.pp
new file mode 100644
index 0000000..2143b79
--- /dev/null
+++ b/test/data/snippets/falsevalues.pp
@@ -0,0 +1,3 @@
+$value = false
+
+file { "/tmp/falsevalues$value": ensure => file }
diff --git a/test/data/snippets/filecreate b/test/data/snippets/filecreate
new file mode 100644
index 0000000..d7972c2
--- /dev/null
+++ b/test/data/snippets/filecreate
@@ -0,0 +1,11 @@
+# $Id$
+
+file {
+ "/tmp/createatest": ensure => file, mode => 755;
+ "/tmp/createbtest": ensure => file, mode => 755
+}
+
+file {
+ "/tmp/createctest": ensure => file;
+ "/tmp/createdtest": ensure => file;
+}
diff --git a/test/data/snippets/fqdefinition.pp b/test/data/snippets/fqdefinition.pp
new file mode 100644
index 0000000..ddb0675
--- /dev/null
+++ b/test/data/snippets/fqdefinition.pp
@@ -0,0 +1,5 @@
+define one::two($ensure) {
+ file { "/tmp/fqdefinition": ensure => $ensure }
+}
+
+one::two { "/tmp/fqdefinition": ensure => file }
diff --git a/test/data/snippets/fqparents.pp b/test/data/snippets/fqparents.pp
new file mode 100644
index 0000000..40fb933
--- /dev/null
+++ b/test/data/snippets/fqparents.pp
@@ -0,0 +1,11 @@
+class base {
+ class one {
+ file { "/tmp/fqparent1": ensure => file }
+ }
+}
+
+class two::three inherits base::one {
+ file { "/tmp/fqparent2": ensure => file }
+}
+
+include two::three
diff --git a/test/data/snippets/implicititeration b/test/data/snippets/implicititeration
new file mode 100644
index 0000000..6f34cb2
--- /dev/null
+++ b/test/data/snippets/implicititeration
@@ -0,0 +1,15 @@
+# $Id$
+
+$files = ["/tmp/iterationatest", "/tmp/iterationbtest"]
+
+file { $files: ensure => file, mode => 755 }
+
+file { ["/tmp/iterationctest", "/tmp/iterationdtest"]:
+ ensure => file,
+ mode => 755
+}
+
+file {
+ ["/tmp/iterationetest", "/tmp/iterationftest"]: ensure => file, mode => 755;
+ ["/tmp/iterationgtest", "/tmp/iterationhtest"]: ensure => file, mode => 755;
+}
diff --git a/test/data/snippets/multipleinstances b/test/data/snippets/multipleinstances
new file mode 100644
index 0000000..2f9b3c2
--- /dev/null
+++ b/test/data/snippets/multipleinstances
@@ -0,0 +1,7 @@
+# $Id$
+
+file {
+ "/tmp/multipleinstancesa": ensure => file, mode => 755;
+ "/tmp/multipleinstancesb": ensure => file, mode => 755;
+ "/tmp/multipleinstancesc": ensure => file, mode => 755;
+}
diff --git a/test/data/snippets/multisubs.pp b/test/data/snippets/multisubs.pp
new file mode 100644
index 0000000..bcec69e
--- /dev/null
+++ b/test/data/snippets/multisubs.pp
@@ -0,0 +1,13 @@
+class base {
+ file { "/tmp/multisubtest": content => "base", mode => 644 }
+}
+
+class sub1 inherits base {
+ File["/tmp/multisubtest"] { mode => 755 }
+}
+
+class sub2 inherits base {
+ File["/tmp/multisubtest"] { content => sub2 }
+}
+
+include sub1, sub2
diff --git a/test/data/snippets/namevartest b/test/data/snippets/namevartest
new file mode 100644
index 0000000..dbee1c3
--- /dev/null
+++ b/test/data/snippets/namevartest
@@ -0,0 +1,9 @@
+define filetest($mode, $ensure = file) {
+ file { $name:
+ mode => $mode,
+ ensure => $ensure
+ }
+}
+
+filetest { "/tmp/testfiletest": mode => 644}
+filetest { "/tmp/testdirtest": mode => 755, ensure => directory}
diff --git a/test/data/snippets/scopetest b/test/data/snippets/scopetest
new file mode 100644
index 0000000..3314917
--- /dev/null
+++ b/test/data/snippets/scopetest
@@ -0,0 +1,13 @@
+
+$mode = 640
+
+define thing {
+ file { "/tmp/$name": ensure => file, mode => $mode }
+}
+
+class testing {
+ $mode = 755
+ thing {scopetest: }
+}
+
+include testing
diff --git a/test/data/snippets/selectorvalues.pp b/test/data/snippets/selectorvalues.pp
new file mode 100644
index 0000000..cd8cf77
--- /dev/null
+++ b/test/data/snippets/selectorvalues.pp
@@ -0,0 +1,42 @@
+$value1 = ""
+$value2 = true
+$value3 = false
+$value4 = yay
+
+$test = "yay"
+
+$mode1 = $value1 ? {
+ "" => 755,
+ default => 644
+}
+
+$mode2 = $value2 ? {
+ true => 755,
+ default => 644
+}
+
+$mode3 = $value3 ? {
+ false => 755,
+ default => 644
+}
+
+$mode4 = $value4 ? {
+ $test => 755,
+ default => 644
+}
+
+$mode5 = yay ? {
+ $test => 755,
+ default => 644
+}
+
+$mode6 = $mode5 ? {
+ 755 => 755
+}
+
+file { "/tmp/selectorvalues1": ensure => file, mode => $mode1 }
+file { "/tmp/selectorvalues2": ensure => file, mode => $mode2 }
+file { "/tmp/selectorvalues3": ensure => file, mode => $mode3 }
+file { "/tmp/selectorvalues4": ensure => file, mode => $mode4 }
+file { "/tmp/selectorvalues5": ensure => file, mode => $mode5 }
+file { "/tmp/selectorvalues6": ensure => file, mode => $mode6 }
diff --git a/test/data/snippets/simpledefaults b/test/data/snippets/simpledefaults
new file mode 100644
index 0000000..63d199a
--- /dev/null
+++ b/test/data/snippets/simpledefaults
@@ -0,0 +1,5 @@
+# $Id$
+
+File { mode => 755 }
+
+file { "/tmp/defaulttest": ensure => file }
diff --git a/test/data/snippets/simpleselector b/test/data/snippets/simpleselector
new file mode 100644
index 0000000..8b9bc72
--- /dev/null
+++ b/test/data/snippets/simpleselector
@@ -0,0 +1,38 @@
+# $Id$
+
+$var = "value"
+
+file { "/tmp/snippetselectatest":
+ ensure => file,
+ mode => $var ? {
+ nottrue => 641,
+ value => 755
+ }
+}
+
+file { "/tmp/snippetselectbtest":
+ ensure => file,
+ mode => $var ? {
+ nottrue => 644,
+ default => 755
+ }
+}
+
+$othervar = "complex value"
+
+file { "/tmp/snippetselectctest":
+ ensure => file,
+ mode => $othervar ? {
+ "complex value" => 755,
+ default => 644
+ }
+}
+$anothervar = Yayness
+
+file { "/tmp/snippetselectdtest":
+ ensure => file,
+ mode => $anothervar ? {
+ Yayness => 755,
+ default => 644
+ }
+}
diff --git a/test/data/snippets/singleary.pp b/test/data/snippets/singleary.pp
new file mode 100644
index 0000000..9ce56dd
--- /dev/null
+++ b/test/data/snippets/singleary.pp
@@ -0,0 +1,19 @@
+# $Id$
+
+file { "/tmp/singleary1":
+ ensure => file
+}
+
+file { "/tmp/singleary2":
+ ensure => file
+}
+
+file { "/tmp/singleary3":
+ ensure => file,
+ require => [File["/tmp/singleary1"], File["/tmp/singleary2"]]
+}
+
+file { "/tmp/singleary4":
+ ensure => file,
+ require => [File["/tmp/singleary1"]]
+}
diff --git a/test/data/snippets/singlequote.pp b/test/data/snippets/singlequote.pp
new file mode 100644
index 0000000..dc876a2
--- /dev/null
+++ b/test/data/snippets/singlequote.pp
@@ -0,0 +1,11 @@
+# $Id$
+
+file { "/tmp/singlequote1":
+ ensure => file,
+ content => 'a $quote'
+}
+
+file { "/tmp/singlequote2":
+ ensure => file,
+ content => 'some "\yayness\"'
+}
diff --git a/test/data/snippets/singleselector.pp b/test/data/snippets/singleselector.pp
new file mode 100644
index 0000000..520a140
--- /dev/null
+++ b/test/data/snippets/singleselector.pp
@@ -0,0 +1,22 @@
+$value1 = ""
+$value2 = true
+$value3 = false
+$value4 = yay
+
+$test = "yay"
+
+$mode1 = $value1 ? {
+ "" => 755
+}
+
+$mode2 = $value2 ? {
+ true => 755
+}
+
+$mode3 = $value3 ? {
+ default => 755
+}
+
+file { "/tmp/singleselector1": ensure => file, mode => $mode1 }
+file { "/tmp/singleselector2": ensure => file, mode => $mode2 }
+file { "/tmp/singleselector3": ensure => file, mode => $mode3 }
diff --git a/test/data/snippets/subclass_name_duplication.pp b/test/data/snippets/subclass_name_duplication.pp
new file mode 100755
index 0000000..10f1d75
--- /dev/null
+++ b/test/data/snippets/subclass_name_duplication.pp
@@ -0,0 +1,11 @@
+#!/usr/bin/env puppet
+
+class one::fake {
+ file { "/tmp/subclass_name_duplication1": ensure => present }
+}
+
+class two::fake {
+ file { "/tmp/subclass_name_duplication2": ensure => present }
+}
+
+include one::fake, two::fake
diff --git a/test/data/snippets/tag.pp b/test/data/snippets/tag.pp
new file mode 100644
index 0000000..e6e770d
--- /dev/null
+++ b/test/data/snippets/tag.pp
@@ -0,0 +1,9 @@
+# $Id$
+
+$variable = value
+
+tag yayness, rahness
+
+tag booness, $variable
+
+file { "/tmp/settestingness": ensure => file }
diff --git a/test/data/snippets/tagged.pp b/test/data/snippets/tagged.pp
new file mode 100644
index 0000000..7bf90a6
--- /dev/null
+++ b/test/data/snippets/tagged.pp
@@ -0,0 +1,35 @@
+# $Id$
+
+tag testing
+tag(funtest)
+
+class tagdefine {
+ $path = tagged(tagdefine) ? {
+ true => "true", false => "false"
+ }
+
+ file { "/tmp/taggeddefine$path": ensure => file }
+}
+
+include tagdefine
+
+$yayness = tagged(yayness) ? {
+ true => "true", false => "false"
+}
+
+$funtest = tagged(testing) ? {
+ true => "true", false => "false"
+}
+
+$both = tagged(testing, yayness) ? {
+ true => "true", false => "false"
+}
+
+$bothtrue = tagged(testing, testing) ? {
+ true => "true", false => "false"
+}
+
+file { "/tmp/taggedyayness$yayness": ensure => file }
+file { "/tmp/taggedtesting$funtest": ensure => file }
+file { "/tmp/taggedboth$both": ensure => file }
+file { "/tmp/taggedbothtrue$bothtrue": ensure => file }
diff --git a/test/data/snippets/virtualresources.pp b/test/data/snippets/virtualresources.pp
new file mode 100644
index 0000000..a29406b
--- /dev/null
+++ b/test/data/snippets/virtualresources.pp
@@ -0,0 +1,14 @@
+class one {
+ @file { "/tmp/virtualtest1": content => "one" }
+ @file { "/tmp/virtualtest2": content => "two" }
+ @file { "/tmp/virtualtest3": content => "three" }
+ @file { "/tmp/virtualtest4": content => "four" }
+}
+
+class two {
+ File <| content == "one" |>
+ realize File["/tmp/virtualtest2"]
+ realize(File["/tmp/virtualtest3"], File["/tmp/virtualtest4"])
+}
+
+include one, two
diff --git a/test/data/types/hosts/1 b/test/data/types/hosts/1
new file mode 100644
index 0000000..f0b27f3
--- /dev/null
+++ b/test/data/types/hosts/1
@@ -0,0 +1,3 @@
+# Do not remove the following line, or various programs
+# that require network functionality will fail.
+127.0.0.1 hostname.domain.net hostname localhost.localdomain localhost
diff --git a/test/data/types/hosts/2 b/test/data/types/hosts/2
new file mode 100644
index 0000000..a25c39c
--- /dev/null
+++ b/test/data/types/hosts/2
@@ -0,0 +1,13 @@
+127.0.0.1 localhost
+192.168.0.3 culain.madstop.com culain
+192.168.0.100 yaytest
+
+# The following lines are desirable for IPv6 capable hosts
+# (added automatically by netbase upgrade)
+
+::1 ip6-localhost ip6-loopback
+fe00::0 ip6-localnet
+ff00::0 ip6-mcastprefix
+ff02::1 ip6-allnodes
+ff02::2 ip6-allrouters
+ff02::3 ip6-allhosts
diff --git a/test/data/types/hosts/solaris b/test/data/types/hosts/solaris
new file mode 100644
index 0000000..be3b97f
--- /dev/null
+++ b/test/data/types/hosts/solaris
@@ -0,0 +1,5 @@
+#
+# Internet host table
+#
+127.0.0.1 localhost
+192.168.0.50 sol10b
diff --git a/test/data/types/mailalias/file1 b/test/data/types/mailalias/file1
new file mode 100644
index 0000000..a7cbd4e
--- /dev/null
+++ b/test/data/types/mailalias/file1
@@ -0,0 +1,183 @@
+# This is the aliases file - it says who gets mail for whom.
+# It was originally generated by `eximconfig', part of the exim package
+# distributed with Debian, but it may edited by the mail system administrator.
+# This file originally generated by eximconfig at Tue Jul 12345 12345:12345:12345 CDT 12345
+# See exim info section for details of the things that can be configured here.
+
+# Local aliases
+eight-phone: 12345 at domain.com
+eight-pager: eight-phone
+eight-sms: eight-phone
+cindy-phone: 12345 at domain.com
+cindy-pager: cindy-phone
+cindy-sms: cindy-phone
+
+ben-phone: 12345 at txt.att.net
+ben: eight
+ajax: eight
+
+teyo: teyo at brainfinger.org
+
+#----------------#
+# Family aliases #
+#----------------#
+
+smithes: eight,six,two,seven,isaiah,kristen,cindy,three
+smith: smithes
+#morris: morrisbpaddlin at hotmail.com
+#six: grendelwench at hotmail.com
+two: twosmith at thirddomain.com
+seven: sevensmith at thirddomain.com
+isaiah: ismith at thirddomain.com
+kristen: kristenwells at thirddomain.com
+one-phone: 12345 at otherdomain.com
+one-pager: one-phone
+seven-phone: 12345 at otherdomain.com
+seven-pager: seven-phone
+seven-sms: seven-phone
+ike-phone: 12345 at otherdomain.com
+ike-page: ike-phone
+ike-sms: ike-phone
+six-phone: 12345 at otherdomain.com
+six-page: six-phone
+six-sms: six-phone
+three: tferguson at mmc.edu
+three-phone: 12345 at otherdomain.com
+three-page: three-phone
+three-sms: three-phone
+four-phone: 12345 at otherdomain.com
+four-page: four-phone
+four-sms: four-phone
+two-phone: 12345 at otherdomain.com
+two-page: two-phone
+two-sms: two-phone
+five-phone: 12345 at otherdomain.com
+five-page: five-phone
+five-sms: five-phone
+
+#----------------#
+# work aliases #
+#----------------#
+consulting: eight
+svn: eight
+info: eight
+blog: eight
+paypal: eight
+trac: puppet-dev
+dev: eight
+sales: eight
+training: eight
+support: eight
+faq: eight
+puppet-docs: eight,nine at domain.com,ten at domain.com,eleven at other.com
+docs: puppet-docs
+jobs: eight
+
+# System stuff
+postmaster: eight
+root: eight
+
+daemon: root
+bin: root
+sys: root
+sync: root
+games: root
+man: root
+lp: root
+mail: root
+news: root
+uucp: root
+proxy: root
+postgres: root
+www-data: root
+backup: root
+operator: root
+list: root
+irc: root
+gnats: root
+nobody: root
+
+filemaker: eight
+
+hostmaster: root
+usenet: root
+webmaster: root
+www: root
+ftp: root
+abuse: root
+noc: root
+security: root
+
+mailer-daemon: postmaster
+
+tap: one at two.com,two at three.com,three at four.com,four at five.com,five at six.com
+
+mailman: "|/var/lib/mailman/mail/mailman post mailman"
+mailman-admin: "|/var/lib/mailman/mail/mailman admin mailman"
+mailman-bounces: "|/var/lib/mailman/mail/mailman bounces mailman"
+mailman-confirm: "|/var/lib/mailman/mail/mailman confirm mailman"
+mailman-join: "|/var/lib/mailman/mail/mailman join mailman"
+mailman-leave: "|/var/lib/mailman/mail/mailman leave mailman"
+mailman-owner: "|/var/lib/mailman/mail/mailman owner mailman"
+mailman-request: "|/var/lib/mailman/mail/mailman request mailman"
+mailman-subscribe: "|/var/lib/mailman/mail/mailman subscribe mailman"
+mailman-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe mailman"
+
+puppet-dev: "|/var/lib/mailman/mail/mailman post puppet-dev"
+puppet-dev-admin: "|/var/lib/mailman/mail/mailman admin puppet-dev"
+puppet-dev-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-dev"
+puppet-dev-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-dev"
+puppet-dev-join: "|/var/lib/mailman/mail/mailman join puppet-dev"
+puppet-dev-leave: "|/var/lib/mailman/mail/mailman leave puppet-dev"
+puppet-dev-owner: "|/var/lib/mailman/mail/mailman owner puppet-dev"
+puppet-dev-request: "|/var/lib/mailman/mail/mailman request puppet-dev"
+puppet-dev-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-dev"
+puppet-dev-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-dev"
+
+## puppet-commit mailing list
+puppet-commit: "|/var/lib/mailman/mail/mailman post puppet-commit"
+puppet-commit-admin: "|/var/lib/mailman/mail/mailman admin puppet-commit"
+puppet-commit-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-commit"
+puppet-commit-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-commit"
+puppet-commit-join: "|/var/lib/mailman/mail/mailman join puppet-commit"
+puppet-commit-leave: "|/var/lib/mailman/mail/mailman leave puppet-commit"
+puppet-commit-owner: "|/var/lib/mailman/mail/mailman owner puppet-commit"
+puppet-commit-request: "|/var/lib/mailman/mail/mailman request puppet-commit"
+puppet-commit-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-commit"
+puppet-commit-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-commit"
+
+## bnageek mailing list
+bnageek: "|/var/lib/mailman/mail/mailman post bnageek"
+bnageek-admin: "|/var/lib/mailman/mail/mailman admin bnageek"
+bnageek-bounces: "|/var/lib/mailman/mail/mailman bounces bnageek"
+bnageek-confirm: "|/var/lib/mailman/mail/mailman confirm bnageek"
+bnageek-join: "|/var/lib/mailman/mail/mailman join bnageek"
+bnageek-leave: "|/var/lib/mailman/mail/mailman leave bnageek"
+bnageek-owner: "|/var/lib/mailman/mail/mailman owner bnageek"
+bnageek-request: "|/var/lib/mailman/mail/mailman request bnageek"
+bnageek-subscribe: "|/var/lib/mailman/mail/mailman subscribe bnageek"
+bnageek-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe bnageek"
+
+## puppet-users mailing list
+puppet-users: "|/var/lib/mailman/mail/mailman post puppet-users"
+puppet-users-admin: "|/var/lib/mailman/mail/mailman admin puppet-users"
+puppet-users-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-users"
+puppet-users-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-users"
+puppet-users-join: "|/var/lib/mailman/mail/mailman join puppet-users"
+puppet-users-leave: "|/var/lib/mailman/mail/mailman leave puppet-users"
+puppet-users-owner: "|/var/lib/mailman/mail/mailman owner puppet-users"
+puppet-users-request: "|/var/lib/mailman/mail/mailman request puppet-users"
+puppet-users-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-users"
+puppet-users-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-users"
+
+## puppet-bugs mailing list
+puppet-bugs: "|/var/lib/mailman/mail/mailman post puppet-bugs"
+puppet-bugs-admin: "|/var/lib/mailman/mail/mailman admin puppet-bugs"
+puppet-bugs-bounces: "|/var/lib/mailman/mail/mailman bounces puppet-bugs"
+puppet-bugs-confirm: "|/var/lib/mailman/mail/mailman confirm puppet-bugs"
+puppet-bugs-join: "|/var/lib/mailman/mail/mailman join puppet-bugs"
+puppet-bugs-leave: "|/var/lib/mailman/mail/mailman leave puppet-bugs"
+puppet-bugs-owner: "|/var/lib/mailman/mail/mailman owner puppet-bugs"
+puppet-bugs-request: "|/var/lib/mailman/mail/mailman request puppet-bugs"
+puppet-bugs-subscribe: "|/var/lib/mailman/mail/mailman subscribe puppet-bugs"
+puppet-bugs-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe puppet-bugs"
diff --git a/test/data/types/mount/freebsd.fstab b/test/data/types/mount/freebsd.fstab
new file mode 100644
index 0000000..c39416b
--- /dev/null
+++ b/test/data/types/mount/freebsd.fstab
@@ -0,0 +1,7 @@
+# Device Mountpoint FStype Options Dump Pass#
+/dev/ad0s1b none swap sw 0 0
+/dev/ad0s1a / ufs rw 1 1
+/dev/ad0s1e /tmp ufs rw 2 2
+/dev/ad0s1f /usr ufs rw 2 2
+/dev/ad0s1d /var ufs rw 2 2
+/dev/acd0 /cdrom cd9660 ro,noauto 0 0
diff --git a/test/data/types/mount/linux.fstab b/test/data/types/mount/linux.fstab
new file mode 100644
index 0000000..b1debff
--- /dev/null
+++ b/test/data/types/mount/linux.fstab
@@ -0,0 +1,11 @@
+# A sample fstab, typical for a Fedora system
+/dev/vg00/lv00 / ext3 defaults 1 1
+LABEL=/boot /boot ext3 defaults 1 2
+devpts /dev/pts devpts gid=5,mode=620 0
+tmpfs /dev/shm tmpfs defaults 0
+LABEL=/home /home ext3 defaults 1 2
+/home /homes auto bind 0 2
+proc /proc proc defaults 0 0
+/dev/vg00/lv01 /spare ext3 defaults 1 2
+sysfs /sys sysfs defaults 0 0
+LABEL=SWAP-hda6 swap swap defaults 0 0
diff --git a/test/data/types/mount/solaris.fstab b/test/data/types/mount/solaris.fstab
new file mode 100644
index 0000000..c7de967
--- /dev/null
+++ b/test/data/types/mount/solaris.fstab
@@ -0,0 +1,11 @@
+#device device mount FS fsck mount mount
+#to mount to fsck point type pass at boot options
+#
+fd - /dev/fd fd - no -
+/proc - /proc proc - no -
+/dev/dsk/c0d0s0 /dev/rdsk/c0d0s0 / ufs 1 no -
+/dev/dsk/c0d0p0:boot - /boot pcfs - no -
+/devices - /devices devfs - no -
+ctfs - /system/contract ctfs - no -
+objfs - /system/object objfs - no -
+#swap - /tmp tmpfs - yes -
diff --git a/test/data/types/port/1 b/test/data/types/port/1
new file mode 100644
index 0000000..8fcc801
--- /dev/null
+++ b/test/data/types/port/1
@@ -0,0 +1,533 @@
+# Network services, Internet style
+#
+# Note that it is presently the policy of IANA to assign a single well-known
+# port number for both TCP and UDP; hence, officially ports have two entries
+# even if the protocol doesn't support UDP operations.
+#
+# Updated from http://www.iana.org/assignments/port-numbers and other
+# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
+# New ports will be added on request if they have been officially assigned
+# by IANA and used in the real-world or are needed by a debian package.
+# If you need a huge list of used numbers please install the nmap package.
+
+tcpmux 1/tcp # TCP port service multiplexer
+echo 7/tcp
+echo 7/udp
+discard 9/tcp sink null
+discard 9/udp sink null
+systat 11/tcp users
+daytime 13/tcp
+daytime 13/udp
+netstat 15/tcp
+qotd 17/tcp quote
+msp 18/tcp # message send protocol
+msp 18/udp
+chargen 19/tcp ttytst source
+chargen 19/udp ttytst source
+ftp-data 20/tcp
+ftp 21/tcp
+fsp 21/udp fspd
+ssh 22/tcp # SSH Remote Login Protocol
+ssh 22/udp
+telnet 23/tcp
+smtp 25/tcp mail
+time 37/tcp timserver
+time 37/udp timserver
+rlp 39/udp resource # resource location
+nameserver 42/tcp name # IEN 116
+whois 43/tcp nicname
+tacacs 49/tcp # Login Host Protocol (TACACS)
+tacacs 49/udp
+re-mail-ck 50/tcp # Remote Mail Checking Protocol
+re-mail-ck 50/udp
+domain 53/tcp nameserver # name-domain server
+domain 53/udp nameserver
+mtp 57/tcp # deprecated
+tacacs-ds 65/tcp # TACACS-Database Service
+tacacs-ds 65/udp
+bootps 67/tcp # BOOTP server
+bootps 67/udp
+bootpc 68/tcp # BOOTP client
+bootpc 68/udp
+tftp 69/udp
+gopher 70/tcp # Internet Gopher
+gopher 70/udp
+rje 77/tcp netrjs
+finger 79/tcp
+www 80/tcp http # WorldWideWeb HTTP
+www 80/udp # HyperText Transfer Protocol
+link 87/tcp ttylink
+kerberos 88/tcp kerberos5 krb5 kerberos-sec # Kerberos v5
+kerberos 88/udp kerberos5 krb5 kerberos-sec # Kerberos v5
+supdup 95/tcp
+hostnames 101/tcp hostname # usually from sri-nic
+iso-tsap 102/tcp tsap # part of ISODE
+acr-nema 104/tcp dicom # Digital Imag. & Comm. 300
+acr-nema 104/udp dicom # Digital Imag. & Comm. 300
+csnet-ns 105/tcp cso-ns # also used by CSO name server
+csnet-ns 105/udp cso-ns
+rtelnet 107/tcp # Remote Telnet
+rtelnet 107/udp
+pop2 109/tcp postoffice pop-2 # POP version 2
+pop2 109/udp pop-2
+pop3 110/tcp pop-3 # POP version 3
+pop3 110/udp pop-3
+sunrpc 111/tcp portmapper # RPC 4.0 portmapper
+sunrpc 111/udp portmapper
+auth 113/tcp authentication tap ident
+sftp 115/tcp
+uucp-path 117/tcp
+nntp 119/tcp readnews untp # USENET News Transfer Protocol
+ntp 123/tcp
+ntp 123/udp # Network Time Protocol
+pwdgen 129/tcp # PWDGEN service
+pwdgen 129/udp # PWDGEN service
+loc-srv 135/tcp epmap # Location Service
+loc-srv 135/udp epmap
+netbios-ns 137/tcp # NETBIOS Name Service
+netbios-ns 137/udp
+netbios-dgm 138/tcp # NETBIOS Datagram Service
+netbios-dgm 138/udp
+netbios-ssn 139/tcp # NETBIOS session service
+netbios-ssn 139/udp
+imap2 143/tcp imap # Interim Mail Access P 2 and 4
+imap2 143/udp imap
+snmp 161/tcp # Simple Net Mgmt Protocol
+snmp 161/udp # Simple Net Mgmt Protocol
+snmp-trap 162/tcp snmptrap # Traps for SNMP
+snmp-trap 162/udp snmptrap # Traps for SNMP
+cmip-man 163/tcp # ISO mgmt over IP (CMOT)
+cmip-man 163/udp
+cmip-agent 164/tcp
+cmip-agent 164/udp
+mailq 174/tcp # Mailer transport queue for Zmailer
+mailq 174/udp # Mailer transport queue for Zmailer
+xdmcp 177/tcp # X Display Mgr. Control Proto
+xdmcp 177/udp
+nextstep 178/tcp NeXTStep NextStep # NeXTStep window
+nextstep 178/udp NeXTStep NextStep # server
+bgp 179/tcp # Border Gateway Protocol
+bgp 179/udp
+prospero 191/tcp # Cliff Neuman's Prospero
+prospero 191/udp
+irc 194/tcp # Internet Relay Chat
+irc 194/udp
+smux 199/tcp # SNMP Unix Multiplexer
+smux 199/udp
+at-rtmp 201/tcp # AppleTalk routing
+at-rtmp 201/udp
+at-nbp 202/tcp # AppleTalk name binding
+at-nbp 202/udp
+at-echo 204/tcp # AppleTalk echo
+at-echo 204/udp
+at-zis 206/tcp # AppleTalk zone information
+at-zis 206/udp
+qmtp 209/tcp # Quick Mail Transfer Protocol
+qmtp 209/udp # Quick Mail Transfer Protocol
+z3950 210/tcp wais # NISO Z39.50 database
+z3950 210/udp wais
+ipx 213/tcp # IPX
+ipx 213/udp
+imap3 220/tcp # Interactive Mail Access
+imap3 220/udp # Protocol v3
+pawserv 345/tcp # Perf Analysis Workbench
+pawserv 345/udp
+zserv 346/tcp # Zebra server
+zserv 346/udp
+fatserv 347/tcp # Fatmen Server
+fatserv 347/udp
+rpc2portmap 369/tcp
+rpc2portmap 369/udp # Coda portmapper
+codaauth2 370/tcp
+codaauth2 370/udp # Coda authentication server
+clearcase 371/tcp Clearcase
+clearcase 371/udp Clearcase
+ulistserv 372/tcp # UNIX Listserv
+ulistserv 372/udp
+ldap 389/tcp # Lightweight Directory Access Protocol
+ldap 389/udp
+imsp 406/tcp # Interactive Mail Support Protocol
+imsp 406/udp
+https 443/tcp # http protocol over TLS/SSL
+https 443/udp
+snpp 444/tcp # Simple Network Paging Protocol
+snpp 444/udp
+microsoft-ds 445/tcp # Microsoft Naked CIFS
+microsoft-ds 445/udp
+saft 487/tcp # Simple Asynchronous File Transfer
+saft 487/udp
+isakmp 500/tcp # IPsec - Internet Security Association
+isakmp 500/udp # and Key Management Protocol
+rtsp 554/tcp # Real Time Stream Control Protocol
+rtsp 554/udp # Real Time Stream Control Protocol
+nqs 607/tcp # Network Queuing system
+nqs 607/udp
+npmp-local 610/tcp dqs313_qmaster # npmp-local / DQS
+npmp-local 610/udp dqs313_qmaster
+npmp-gui 611/tcp dqs313_execd # npmp-gui / DQS
+npmp-gui 611/udp dqs313_execd
+hmmp-ind 612/tcp dqs313_intercell # HMMP Indication / DQS
+hmmp-ind 612/udp dqs313_intercell
+ipp 631/tcp # Internet Printing Protocol
+ipp 631/udp
+#
+# UNIX specific services
+#
+exec 512/tcp
+biff 512/udp comsat
+login 513/tcp
+who 513/udp whod
+shell 514/tcp cmd # no passwords used
+syslog 514/udp
+printer 515/tcp spooler # line printer spooler
+talk 517/udp
+ntalk 518/udp
+route 520/udp router routed # RIP
+timed 525/udp timeserver
+tempo 526/tcp newdate
+courier 530/tcp rpc
+conference 531/tcp chat
+netnews 532/tcp readnews
+netwall 533/udp # for emergency broadcasts
+gdomap 538/tcp # GNUstep distributed objects
+gdomap 538/udp
+uucp 540/tcp uucpd # uucp daemon
+klogin 543/tcp # Kerberized `rlogin' (v5)
+kshell 544/tcp krcmd # Kerberized `rsh' (v5)
+afpovertcp 548/tcp # AFP over TCP
+afpovertcp 548/udp
+remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem
+nntps 563/tcp snntp # NNTP over SSL
+nntps 563/udp snntp
+submission 587/tcp # Submission [RFC2476]
+submission 587/udp
+ldaps 636/tcp # LDAP over SSL
+ldaps 636/udp
+tinc 655/tcp # tinc control port
+tinc 655/udp
+silc 706/tcp
+silc 706/udp
+kerberos-adm 749/tcp # Kerberos `kadmin' (v5)
+#
+webster 765/tcp # Network dictionary
+webster 765/udp
+rsync 873/tcp
+rsync 873/udp
+ftps-data 989/tcp # FTP over SSL (data)
+ftps 990/tcp
+telnets 992/tcp # Telnet over SSL
+telnets 992/udp
+imaps 993/tcp # IMAP over SSL
+imaps 993/udp
+ircs 994/tcp # IRC over SSL
+ircs 994/udp
+pop3s 995/tcp # POP-3 over SSL
+pop3s 995/udp
+#
+# From ``Assigned Numbers'':
+#
+#> The Registered Ports are not controlled by the IANA and on most systems
+#> can be used by ordinary user processes or programs executed by ordinary
+#> users.
+#
+#> Ports are used in the TCP [45,106] to name the ends of logical
+#> connections which carry long term conversations. For the purpose of
+#> providing services to unknown callers, a service contact port is
+#> defined. This list specifies the port used by the server process as its
+#> contact port. While the IANA can not control uses of these ports it
+#> does register or list uses of these ports as a convienence to the
+#> community.
+#
+socks 1080/tcp # socks proxy server
+socks 1080/udp
+proofd 1093/tcp
+proofd 1093/udp
+rootd 1094/tcp
+rootd 1094/udp
+openvpn 1194/tcp
+openvpn 1194/udp
+rmiregistry 1099/tcp # Java RMI Registry
+rmiregistry 1099/udp
+kazaa 1214/tcp
+kazaa 1214/udp
+nessus 1241/tcp # Nessus vulnerability
+nessus 1241/udp # assessment scanner
+lotusnote 1352/tcp lotusnotes # Lotus Note
+lotusnote 1352/udp lotusnotes
+ms-sql-s 1433/tcp # Microsoft SQL Server
+ms-sql-s 1433/udp
+ms-sql-m 1434/tcp # Microsoft SQL Monitor
+ms-sql-m 1434/udp
+ingreslock 1524/tcp
+ingreslock 1524/udp
+prospero-np 1525/tcp # Prospero non-privileged
+prospero-np 1525/udp
+datametrics 1645/tcp old-radius
+datametrics 1645/udp old-radius
+sa-msg-port 1646/tcp old-radacct
+sa-msg-port 1646/udp old-radacct
+kermit 1649/tcp
+kermit 1649/udp
+l2f 1701/tcp l2tp
+l2f 1701/udp l2tp
+radius 1812/tcp
+radius 1812/udp
+radius-acct 1813/tcp radacct # Radius Accounting
+radius-acct 1813/udp radacct
+unix-status 1957/tcp # remstats unix-status server
+log-server 1958/tcp # remstats log server
+remoteping 1959/tcp # remstats remoteping server
+rtcm-sc104 2101/tcp # RTCM SC-104 IANA 1/29/99
+rtcm-sc104 2101/udp
+cvspserver 2401/tcp # CVS client/server operations
+cvspserver 2401/udp
+venus 2430/tcp # codacon port
+venus 2430/udp # Venus callback/wbc interface
+venus-se 2431/tcp # tcp side effects
+venus-se 2431/udp # udp sftp side effect
+codasrv 2432/tcp # not used
+codasrv 2432/udp # server port
+codasrv-se 2433/tcp # tcp side effects
+codasrv-se 2433/udp # udp sftp side effect
+mon 2583/tcp # MON
+mon 2583/udp
+dict 2628/tcp # Dictionary server
+dict 2628/udp
+gpsd 2947/tcp
+gpsd 2947/udp
+gds_db 3050/tcp # InterBase server
+gds_db 3050/udp
+icpv2 3130/tcp icp # Internet Cache Protocol
+icpv2 3130/udp icp
+mysql 3306/tcp
+mysql 3306/udp
+nut 3493/tcp # Network UPS Tools
+nut 3493/udp
+distcc 3632/tcp # distributed compiler
+distcc 3632/udp
+daap 3689/tcp # Digital Audio Access Protocol
+daap 3689/udp
+svn 3690/tcp subversion # Subversion protocol
+svn 3690/udp subversion
+iax 4569/tcp # Inter-Asterisk eXchange
+iax 4569/udp
+radmin-port 4899/tcp # RAdmin Port
+radmin-port 4899/udp
+rfe 5002/udp # Radio Free Ethernet
+rfe 5002/tcp
+sip 5060/tcp # Session Initiation Protocol
+sip 5060/udp
+sip-tls 5061/tcp
+sip-tls 5061/udp
+xmpp-client 5222/tcp jabber-client # Jabber Client Connection
+xmpp-client 5222/udp jabber-client
+xmpp-server 5269/tcp jabber-server # Jabber Server Connection
+xmpp-server 5269/udp jabber-server
+cfengine 5308/tcp
+cfengine 5308/udp
+postgresql 5432/tcp postgres # PostgreSQL Database
+postgresql 5432/udp postgres
+x11 6000/tcp x11-0 # X Window System
+x11 6000/udp x11-0
+x11-1 6001/tcp
+x11-1 6001/udp
+x11-2 6002/tcp
+x11-2 6002/udp
+x11-3 6003/tcp
+x11-3 6003/udp
+x11-4 6004/tcp
+x11-4 6004/udp
+x11-5 6005/tcp
+x11-5 6005/udp
+x11-6 6006/tcp
+x11-6 6006/udp
+x11-7 6007/tcp
+x11-7 6007/udp
+gnutella-svc 6346/tcp # gnutella
+gnutella-svc 6346/udp
+gnutella-rtr 6347/tcp # gnutella
+gnutella-rtr 6347/udp
+afs3-fileserver 7000/tcp bbs # file server itself
+afs3-fileserver 7000/udp bbs
+afs3-callback 7001/tcp # callbacks to cache managers
+afs3-callback 7001/udp
+afs3-prserver 7002/tcp # users & groups database
+afs3-prserver 7002/udp
+afs3-vlserver 7003/tcp # volume location database
+afs3-vlserver 7003/udp
+afs3-kaserver 7004/tcp # AFS/Kerberos authentication
+afs3-kaserver 7004/udp
+afs3-volser 7005/tcp # volume managment server
+afs3-volser 7005/udp
+afs3-errors 7006/tcp # error interpretation service
+afs3-errors 7006/udp
+afs3-bos 7007/tcp # basic overseer process
+afs3-bos 7007/udp
+afs3-update 7008/tcp # server-to-server updater
+afs3-update 7008/udp
+afs3-rmtsys 7009/tcp # remote cache manager service
+afs3-rmtsys 7009/udp
+font-service 7100/tcp xfs # X Font Service
+font-service 7100/udp xfs
+bacula-dir 9101/tcp # Bacula Director
+bacula-dir 9101/udp
+bacula-fd 9102/tcp # Bacula File Daemon
+bacula-fd 9102/udp
+bacula-sd 9103/tcp # Bacula Storage Daemon
+bacula-sd 9103/udp
+amanda 10080/tcp # amanda backup services
+amanda 10080/udp
+hkp 11371/tcp # OpenPGP HTTP Keyserver
+hkp 11371/udp # OpenPGP HTTP Keyserver
+bprd 13720/tcp # VERITAS NetBackup
+bprd 13720/udp
+bpdbm 13721/tcp # VERITAS NetBackup
+bpdbm 13721/udp
+bpjava-msvc 13722/tcp # BP Java MSVC Protocol
+bpjava-msvc 13722/udp
+vnetd 13724/tcp # Veritas Network Utility
+vnetd 13724/udp
+bpcd 13782/tcp # VERITAS NetBackup
+bpcd 13782/udp
+vopied 13783/tcp # VERITAS NetBackup
+vopied 13783/udp
+wnn6 22273/tcp # wnn6
+wnn6 22273/udp
+
+#
+# Datagram Delivery Protocol services
+#
+rtmp 1/ddp # Routing Table Maintenance Protocol
+nbp 2/ddp # Name Binding Protocol
+echo 4/ddp # AppleTalk Echo Protocol
+zip 6/ddp # Zone Information Protocol
+
+#=========================================================================
+# The remaining port numbers are not as allocated by IANA.
+#=========================================================================
+
+# Kerberos (Project Athena/MIT) services
+# Note that these are for Kerberos v4, and are unofficial. Sites running
+# v4 should uncomment these and comment out the v5 entries above.
+#
+kerberos4 750/udp kerberos-iv kdc # Kerberos (server)
+kerberos4 750/tcp kerberos-iv kdc
+kerberos_master 751/udp # Kerberos authentication
+kerberos_master 751/tcp
+passwd_server 752/udp # Kerberos passwd server
+krb_prop 754/tcp krb5_prop hprop # Kerberos slave propagation
+krbupdate 760/tcp kreg # Kerberos registration
+kpasswd 761/tcp kpwd # Kerberos "passwd"
+swat 901/tcp # swat
+kpop 1109/tcp # Pop with Kerberos
+knetd 2053/tcp # Kerberos de-multiplexor
+zephyr-srv 2102/udp # Zephyr server
+zephyr-clt 2103/udp # Zephyr serv-hm connection
+zephyr-hm 2104/udp # Zephyr hostmanager
+eklogin 2105/tcp # Kerberos encrypted rlogin
+# Hmmm. Are we using Kv4 or Kv5 now? Worrying.
+# The following is probably Kerberos v5 --- ajt at debian.org (11/02/2000)
+kx 2111/tcp # X over Kerberos
+iprop 2121/tcp # incremental propagation
+#
+# Unofficial but necessary (for NetBSD) services
+#
+supfilesrv 871/tcp # SUP server
+supfiledbg 1127/tcp # SUP debugging
+
+#
+# Services added for the Debian GNU/Linux distribution
+#
+linuxconf 98/tcp # LinuxConf
+poppassd 106/tcp # Eudora
+poppassd 106/udp
+ssmtp 465/tcp smtps # SMTP over SSL
+moira_db 775/tcp # Moira database
+moira_update 777/tcp # Moira update protocol
+moira_ureg 779/udp # Moira user registration
+spamd 783/tcp # spamassassin daemon
+omirr 808/tcp omirrd # online mirror
+omirr 808/udp omirrd
+customs 1001/tcp # pmake customs server
+customs 1001/udp
+skkserv 1178/tcp # skk jisho server port
+predict 1210/udp # predict -- satellite tracking
+rmtcfg 1236/tcp # Gracilis Packeten remote config server
+wipld 1300/tcp # Wipl network monitor
+xtel 1313/tcp # french minitel
+xtelw 1314/tcp # french minitel
+support 1529/tcp # GNATS
+sieve 2000/tcp # Sieve mail filter daemon
+cfinger 2003/tcp # GNU Finger
+ndtp 2010/tcp # Network dictionary transfer protocol
+frox 2121/tcp # frox: caching ftp proxy
+ninstall 2150/tcp # ninstall service
+ninstall 2150/udp
+zebrasrv 2600/tcp # zebra service
+zebra 2601/tcp # zebra vty
+ripd 2602/tcp # ripd vty (zebra)
+ripngd 2603/tcp # ripngd vty (zebra)
+ospfd 2604/tcp # ospfd vty (zebra)
+bgpd 2605/tcp # bgpd vty (zebra)
+ospf6d 2606/tcp # ospf6d vty (zebra)
+ospfapi 2607/tcp # OSPF-API
+isisd 2608/tcp # ISISd vty (zebra)
+afbackup 2988/tcp # Afbackup system
+afbackup 2988/udp
+afmbackup 2989/tcp # Afmbackup system
+afmbackup 2989/udp
+xtell 4224/tcp # xtell server
+fax 4557/tcp # FAX transmission service (old)
+hylafax 4559/tcp # HylaFAX client-server protocol (new)
+distmp3 4600/tcp # distmp3host daemon
+munin 4949/tcp lrrd # Munin
+enbd-cstatd 5051/tcp # ENBD client statd
+enbd-sstatd 5052/tcp # ENBD server statd
+pcrd 5151/tcp # PCR-1000 Daemon
+noclog 5354/tcp # noclogd with TCP (nocol)
+noclog 5354/udp # noclogd with UDP (nocol)
+hostmon 5355/tcp # hostmon uses TCP (nocol)
+hostmon 5355/udp # hostmon uses UDP (nocol)
+rplay 5555/udp # RPlay audio service
+rplay 5555/tcp
+rptp 5556/udp # Remote Play Transfer Protocol
+rptp 5556/tcp
+nsca 5667/tcp # Nagios Agent - NSCA
+mrtd 5674/tcp # MRT Routing Daemon
+bgpsim 5675/tcp # MRT Routing Simulator
+canna 5680/tcp # cannaserver
+sane-port 6566/tcp sane saned # SANE network scanner daemon
+ircd 6667/tcp # Internet Relay Chat
+zope-ftp 8021/tcp # zope management by ftp
+webcache 8080/tcp # WWW caching service
+tproxy 8081/tcp # Transparent Proxy
+omniorb 8088/tcp # OmniORB
+omniorb 8088/udp
+clc-build-daemon 8990/tcp # Common lisp build daemon
+xinetd 9098/tcp
+mandelspawn 9359/udp mandelbrot # network mandelbrot
+zope 9673/tcp # zope server
+kamanda 10081/tcp # amanda backup services (Kerberos)
+kamanda 10081/udp
+amandaidx 10082/tcp # amanda backup services
+amidxtape 10083/tcp # amanda backup services
+smsqp 11201/tcp # Alamin SMS gateway
+smsqp 11201/udp
+xpilot 15345/tcp # XPilot Contact Port
+xpilot 15345/udp
+sgi-cmsd 17001/udp # Cluster membership services daemon
+sgi-crsd 17002/udp
+sgi-gcd 17003/udp # SGI Group membership daemon
+sgi-cad 17004/tcp # Cluster Admin daemon
+isdnlog 20011/tcp # isdn logging system
+isdnlog 20011/udp
+vboxd 20012/tcp # voice box system
+vboxd 20012/udp
+binkp 24554/tcp # binkp fidonet protocol
+asp 27374/tcp # Address Search Protocol
+asp 27374/udp
+dircproxy 57000/tcp # Detachable IRC Proxy
+tfido 60177/tcp # fidonet EMSI over telnet
+fido 60179/tcp # fidonet EMSI over TCP
+
+# Local services
diff --git a/test/data/types/port/darwin b/test/data/types/port/darwin
new file mode 100644
index 0000000..8c6b355
--- /dev/null
+++ b/test/data/types/port/darwin
@@ -0,0 +1,11866 @@
+#
+# Network services, Internet style
+#
+# Note that it is presently the policy of IANA to assign a single well-known
+# port number for both TCP and UDP; hence, most entries here have two entries
+# even if the protocol doesn't support UDP operations.
+#
+# The latest IANA port assignments can be gotten from
+#
+# http://www.iana.org/assignments/port-numbers
+#
+# The Well Known Ports are those from 0 through 1023.
+# The Registered Ports are those from 1024 through 49151
+# The Dynamic and/or Private Ports are those from 49152 through 65535
+#
+# $FreeBSD: src/etc/services,v 1.89 2002/12/17 23:59:10 eric Exp $
+# From: @(#)services 5.8 (Berkeley) 5/9/91
+#
+# WELL KNOWN PORT NUMBERS
+#
+rtmp 1/ddp #Routing Table Maintenance Protocol
+tcpmux 1/udp # TCP Port Service Multiplexer
+tcpmux 1/tcp # TCP Port Service Multiplexer
+# Mark Lottor <MKL at nisc.sri.com>
+nbp 2/ddp #Name Binding Protocol
+compressnet 2/udp # Management Utility
+compressnet 2/tcp # Management Utility
+compressnet 3/udp # Compression Process
+compressnet 3/tcp # Compression Process
+# Bernie Volz <VOLZ at PROCESS.COM>
+echo 4/ddp #AppleTalk Echo Protocol
+# 4/tcp Unassigned
+# 4/udp Unassigned
+rje 5/udp # Remote Job Entry
+rje 5/tcp # Remote Job Entry
+# Jon Postel <postel at isi.edu>
+zip 6/ddp #Zone Information Protocol
+# 6/tcp Unassigned
+# 6/udp Unassigned
+echo 7/udp # Echo
+echo 7/tcp # Echo
+# Jon Postel <postel at isi.edu>
+# 8/tcp Unassigned
+# 8/udp Unassigned
+discard 9/udp # Discard
+discard 9/tcp # Discard
+# Jon Postel <postel at isi.edu>
+# 10/tcp Unassigned
+# 10/udp Unassigned
+systat 11/udp # Active Users
+systat 11/tcp # Active Users
+# Jon Postel <postel at isi.edu>
+# 12/tcp Unassigned
+# 12/udp Unassigned
+daytime 13/udp # Daytime (RFC 867)
+daytime 13/tcp # Daytime (RFC 867)
+# Jon Postel <postel at isi.edu>
+# 14/tcp Unassigned
+# 14/udp Unassigned
+# 15/tcp Unassigned [was netstat]
+# 15/udp Unassigned
+# 16/tcp Unassigned
+# 16/udp Unassigned
+qotd 17/udp # Quote of the Day
+qotd 17/tcp # Quote of the Day
+# Jon Postel <postel at isi.edu>
+msp 18/udp # Message Send Protocol
+msp 18/tcp # Message Send Protocol
+# Rina Nethaniel <---none--->
+chargen 19/udp # Character Generator
+chargen 19/tcp # Character Generator
+ftp-data 20/udp # File Transfer [Default Data]
+ftp-data 20/tcp # File Transfer [Default Data]
+ftp 21/udp # File Transfer [Control]
+ftp 21/tcp # File Transfer [Control]
+# Jon Postel <postel at isi.edu>
+ssh 22/udp # SSH Remote Login Protocol
+ssh 22/tcp # SSH Remote Login Protocol
+# Tatu Ylonen <ylo at cs.hut.fi>
+telnet 23/udp # Telnet
+telnet 23/tcp # Telnet
+# Jon Postel <postel at isi.edu>
+ 24/udp # any private mail system
+ 24/tcp # any private mail system
+# Rick Adams <rick at UUNET.UU.NET>
+smtp 25/udp # Simple Mail Transfer
+smtp 25/tcp # Simple Mail Transfer
+# Jon Postel <postel at isi.edu>
+# 26/tcp Unassigned
+# 26/udp Unassigned
+nsw-fe 27/udp # NSW User System FE
+nsw-fe 27/tcp # NSW User System FE
+# Robert Thomas <BThomas at F.BBN.COM>
+# 28/tcp Unassigned
+# 28/udp Unassigned
+msg-icp 29/udp # MSG ICP
+msg-icp 29/tcp # MSG ICP
+# Robert Thomas <BThomas at F.BBN.COM>
+# 30/tcp Unassigned
+# 30/udp Unassigned
+msg-auth 31/udp # MSG Authentication
+msg-auth 31/tcp # MSG Authentication
+# Robert Thomas <BThomas at F.BBN.COM>
+# 32/tcp Unassigned
+# 32/udp Unassigned
+dsp 33/udp # Display Support Protocol
+dsp 33/tcp # Display Support Protocol
+# Ed Cain <cain at edn-unix.dca.mil>
+# 34/tcp Unassigned
+# 34/udp Unassigned
+ 35/udp # any private printer server
+ 35/tcp # any private printer server
+# Jon Postel <postel at isi.edu>
+# 36/tcp Unassigned
+# 36/udp Unassigned
+time 37/udp # Time
+time 37/tcp # Time
+# Jon Postel <postel at isi.edu>
+rap 38/udp # Route Access Protocol
+rap 38/tcp # Route Access Protocol
+# Robert Ullmann <ariel at world.std.com>
+rlp 39/udp # Resource Location Protocol
+rlp 39/tcp # Resource Location Protocol
+# Mike Accetta <MIKE.ACCETTA at CMU-CS-A.EDU>
+# 40/tcp Unassigned
+# 40/udp Unassigned
+graphics 41/udp # Graphics
+graphics 41/tcp # Graphics
+name 42/udp nameserver # Host Name Server
+name 42/tcp nameserver # Host Name Server
+nicname 43/udp # Who Is
+nicname 43/tcp # Who Is
+mpm-flags 44/udp # MPM FLAGS Protocol
+mpm-flags 44/tcp # MPM FLAGS Protocol
+mpm 45/udp # Message Processing Module [recv]
+mpm 45/tcp # Message Processing Module [recv]
+mpm-snd 46/udp # MPM [default send]
+mpm-snd 46/tcp # MPM [default send]
+# Jon Postel <postel at isi.edu>
+ni-ftp 47/udp # NI FTP
+ni-ftp 47/tcp # NI FTP
+# Steve Kille <S.Kille at isode.com>
+auditd 48/udp # Digital Audit Daemon
+auditd 48/tcp # Digital Audit Daemon
+# Larry Scott <scott at zk3.dec.com>
+tacacs 49/udp # Login Host Protocol (TACACS)
+tacacs 49/tcp # Login Host Protocol (TACACS)
+# Pieter Ditmars <pditmars at BBN.COM>
+re-mail-ck 50/udp # Remote Mail Checking Protocol
+re-mail-ck 50/tcp # Remote Mail Checking Protocol
+# Steve Dorner <s-dorner at UIUC.EDU>
+la-maint 51/udp # IMP Logical Address Maintenance
+la-maint 51/tcp # IMP Logical Address Maintenance
+# Andy Malis <malis_a at timeplex.com>
+xns-time 52/udp # XNS Time Protocol
+xns-time 52/tcp # XNS Time Protocol
+# Susie Armstrong <Armstrong.wbst128 at XEROX>
+domain 53/udp # Domain Name Server
+domain 53/tcp # Domain Name Server
+# Paul Mockapetris <PVM at ISI.EDU>
+xns-ch 54/udp # XNS Clearinghouse
+xns-ch 54/tcp # XNS Clearinghouse
+# Susie Armstrong <Armstrong.wbst128 at XEROX>
+isi-gl 55/udp # ISI Graphics Language
+isi-gl 55/tcp # ISI Graphics Language
+xns-auth 56/udp # XNS Authentication
+xns-auth 56/tcp # XNS Authentication
+# Susie Armstrong <Armstrong.wbst128 at XEROX>
+ 57/udp # any private terminal access
+ 57/tcp # any private terminal access
+# Jon Postel <postel at isi.edu>
+xns-mail 58/udp # XNS Mail
+xns-mail 58/tcp # XNS Mail
+# Susie Armstrong <Armstrong.wbst128 at XEROX>
+ 59/udp # any private file service
+ 59/tcp # any private file service
+# Jon Postel <postel at isi.edu>
+ 60/udp # Unassigned
+ 60/tcp # Unassigned
+ni-mail 61/udp # NI MAIL
+ni-mail 61/tcp # NI MAIL
+# Steve Kille <S.Kille at isode.com>
+acas 62/udp # ACA Services
+acas 62/tcp # ACA Services
+# E. Wald <ewald at via.enet.dec.com>
+whois++ 63/udp # whois++
+whois++ 63/tcp # whois++
+# Rickard Schoultz <schoultz at sunet.se>
+covia 64/udp # Communications Integrator (CI)
+covia 64/tcp # Communications Integrator (CI)
+# Dan Smith <dan.smith at den.galileo.com>
+tacacs-ds 65/udp # TACACS-Database Service
+tacacs-ds 65/tcp # TACACS-Database Service
+# Kathy Huber <khuber at bbn.com>
+sql*net 66/udp # Oracle SQL*NET
+sql*net 66/tcp # Oracle SQL*NET
+# Jack Haverty <jhaverty at ORACLE.COM>
+bootps 67/udp # Bootstrap Protocol Server
+bootps 67/tcp # Bootstrap Protocol Server
+bootpc 68/udp # Bootstrap Protocol Client
+bootpc 68/tcp # Bootstrap Protocol Client
+# Bill Croft <Croft at SUMEX-AIM.STANFORD.EDU>
+tftp 69/udp # Trivial File Transfer
+tftp 69/tcp # Trivial File Transfer
+# David Clark <ddc at LCS.MIT.EDU>
+gopher 70/udp # Gopher
+gopher 70/tcp # Gopher
+# Mark McCahill <mpm at boombox.micro.umn.edu>
+netrjs-1 71/udp # Remote Job Service
+netrjs-1 71/tcp # Remote Job Service
+netrjs-2 72/udp # Remote Job Service
+netrjs-2 72/tcp # Remote Job Service
+netrjs-3 73/udp # Remote Job Service
+netrjs-3 73/tcp # Remote Job Service
+netrjs-4 74/udp # Remote Job Service
+netrjs-4 74/tcp # Remote Job Service
+# Bob Braden <Braden at ISI.EDU>
+ 75/udp # any private dial out service
+ 75/tcp # any private dial out service
+# Jon Postel <postel at isi.edu>
+deos 76/udp # Distributed External Object Store
+deos 76/tcp # Distributed External Object Store
+# Robert Ullmann <ariel at world.std.com>
+ 77/udp # any private RJE service
+ 77/tcp # any private RJE service
+# Jon Postel <postel at isi.edu>
+vettcp 78/udp # vettcp
+vettcp 78/tcp # vettcp
+# Christopher Leong <leong at kolmod.mlo.dec.com>
+finger 79/udp # Finger
+finger 79/tcp # Finger
+# David Zimmerman <dpz at RUTGERS.EDU>
+http 80/udp www www-http # World Wide Web HTTP
+http 80/tcp www www-http # World Wide Web HTTP
+# Tim Berners-Lee <timbl at W3.org>
+hosts2-ns 81/udp # HOSTS2 Name Server
+hosts2-ns 81/tcp # HOSTS2 Name Server
+# Earl Killian <EAK at MORDOR.S1.GOV>
+xfer 82/udp # XFER Utility
+xfer 82/tcp # XFER Utility
+# Thomas M. Smith <Thomas.M.Smith at lmco.com>
+mit-ml-dev 83/udp # MIT ML Device
+mit-ml-dev 83/tcp # MIT ML Device
+# David Reed <--none--->
+ctf 84/udp # Common Trace Facility
+ctf 84/tcp # Common Trace Facility
+# Hugh Thomas <thomas at oils.enet.dec.com>
+mit-ml-dev 85/udp # MIT ML Device
+mit-ml-dev 85/tcp # MIT ML Device
+# David Reed <--none--->
+mfcobol 86/udp # Micro Focus Cobol
+mfcobol 86/tcp # Micro Focus Cobol
+# Simon Edwards <--none--->
+ 87/udp # any private terminal link
+ 87/tcp # any private terminal link
+# Jon Postel <postel at isi.edu>
+kerberos 88/udp # Kerberos
+kerberos 88/tcp # Kerberos
+# B. Clifford Neuman <bcn at isi.edu>
+su-mit-tg 89/udp # SU/MIT Telnet Gateway
+su-mit-tg 89/tcp # SU/MIT Telnet Gateway
+# Mark Crispin <MRC at PANDA.COM>
+########### PORT 90 also being used unofficially by Pointcast #########
+dnsix 90/udp # DNSIX Securit Attribute Token Map
+dnsix 90/tcp # DNSIX Securit Attribute Token Map
+# Charles Watt <watt at sware.com>
+mit-dov 91/udp # MIT Dover Spooler
+mit-dov 91/tcp # MIT Dover Spooler
+# Eliot Moss <EBM at XX.LCS.MIT.EDU>
+npp 92/udp # Network Printing Protocol
+npp 92/tcp # Network Printing Protocol
+# Louis Mamakos <louie at sayshell.umd.edu>
+dcp 93/udp # Device Control Protocol
+dcp 93/tcp # Device Control Protocol
+# Daniel Tappan <Tappan at BBN.COM>
+objcall 94/udp # Tivoli Object Dispatcher
+objcall 94/tcp # Tivoli Object Dispatcher
+# Tom Bereiter <--none--->
+supdup 95/udp # SUPDUP
+supdup 95/tcp # SUPDUP
+# Mark Crispin <MRC at PANDA.COM>
+dixie 96/udp # DIXIE Protocol Specification
+dixie 96/tcp # DIXIE Protocol Specification
+# Tim Howes <Tim.Howes at terminator.cc.umich.edu>
+swift-rvf 97/udp # Swift Remote Virtural File Protocol
+swift-rvf 97/tcp # Swift Remote Virtural File Protocol
+# Maurice R. Turcotte
+# <mailrus!uflorida!rm1!dnmrt%rmatl at uunet.UU.NET>
+tacnews 98/udp # TAC News
+tacnews 98/tcp # TAC News
+# Jon Postel <postel at isi.edu>
+metagram 99/udp # Metagram Relay
+metagram 99/tcp # Metagram Relay
+# Geoff Goodfellow <Geoff at FERNWOOD.MPK.CA.US>
+newacct 100/tcp # [unauthorized use]
+hostname 101/udp # NIC Host Name Server
+hostname 101/tcp # NIC Host Name Server
+# Jon Postel <postel at isi.edu>
+iso-tsap 102/udp # ISO-TSAP Class 0
+iso-tsap 102/tcp # ISO-TSAP Class 0
+# Marshall Rose <mrose at dbc.mtview.ca.us>
+gppitnp 103/udp # Genesis Point-to-Point Trans Net
+gppitnp 103/tcp # Genesis Point-to-Point Trans Net
+acr-nema 104/udp # ACR-NEMA Digital Imag. & Comm. 300
+acr-nema 104/tcp # ACR-NEMA Digital Imag. & Comm. 300
+# Patrick McNamee <--none--->
+cso 105/udp # CCSO name server protocol
+cso 105/tcp # CCSO name server protocol
+# Martin Hamilton <martin at mrrl.lut.as.uk>
+csnet-ns 105/udp # Mailbox Name Nameserver
+csnet-ns 105/tcp # Mailbox Name Nameserver
+# Marvin Solomon <solomon at CS.WISC.EDU>
+3com-tsmux 106/udp # 3COM-TSMUX
+3com-tsmux 106/tcp # 3COM-TSMUX
+# Jeremy Siegel <jzs at NSD.3Com.COM>
+########## 106 Unauthorized use by insecure poppassd protocol
+rtelnet 107/udp # Remote Telnet Service
+rtelnet 107/tcp # Remote Telnet Service
+# Jon Postel <postel at isi.edu>
+snagas 108/udp # SNA Gateway Access Server
+snagas 108/tcp # SNA Gateway Access Server
+# Kevin Murphy <murphy at sevens.lkg.dec.com>
+pop2 109/udp # Post Office Protocol - Version 2
+pop2 109/tcp # Post Office Protocol - Version 2
+# Joyce K. Reynolds <jkrey at isi.edu>
+pop3 110/udp # Post Office Protocol - Version 3
+pop3 110/tcp # Post Office Protocol - Version 3
+# Marshall Rose <mrose at dbc.mtview.ca.us>
+sunrpc 111/udp # SUN Remote Procedure Call
+sunrpc 111/tcp # SUN Remote Procedure Call
+# Chuck McManis <cmcmanis at freegate.net>
+mcidas 112/udp # McIDAS Data Transmission Protocol
+mcidas 112/tcp # McIDAS Data Transmission Protocol
+# Glenn Davis <support at unidata.ucar.edu>
+auth 113/udp # Authentication Service
+ident 113/tcp auth #
+# Mike St. Johns <stjohns at arpa.mil>
+audionews 114/udp # Audio News Multicast
+audionews 114/tcp # Audio News Multicast
+# Martin Forssen <maf at dtek.chalmers.se>
+sftp 115/udp # Simple File Transfer Protocol
+sftp 115/tcp # Simple File Transfer Protocol
+# Mark Lottor <MKL at nisc.sri.com>
+ansanotify 116/udp # ANSA REX Notify
+ansanotify 116/tcp # ANSA REX Notify
+# Nicola J. Howarth <njh at ansa.co.uk>
+uucp-path 117/udp # UUCP Path Service
+uucp-path 117/tcp # UUCP Path Service
+sqlserv 118/udp # SQL Services
+sqlserv 118/tcp # SQL Services
+# Larry Barnes <barnes at broke.enet.dec.com>
+nntp 119/udp # Network News Transfer Protocol
+nntp 119/tcp # Network News Transfer Protocol
+# Phil Lapsley <phil at UCBARPA.BERKELEY.EDU>
+cfdptkt 120/udp # CFDPTKT
+cfdptkt 120/tcp # CFDPTKT
+# John Ioannidis <ji at close.cs.columbia.ed>
+erpc 121/udp # Encore Expedited Remote Pro.Call
+erpc 121/tcp # Encore Expedited Remote Pro.Call
+# Jack O'Neil <---none--->
+smakynet 122/udp # SMAKYNET
+smakynet 122/tcp # SMAKYNET
+# Pierre Arnaud <pierre.arnaud at iname.com>
+ntp 123/udp # Network Time Protocol
+ntp 123/tcp # Network Time Protocol
+# Dave Mills <Mills at HUEY.UDEL.EDU>
+ansatrader 124/udp # ANSA REX Trader
+ansatrader 124/tcp # ANSA REX Trader
+# Nicola J. Howarth <njh at ansa.co.uk>
+locus-map 125/udp # Locus PC-Interface Net Map Ser
+locus-map 125/tcp # Locus PC-Interface Net Map Ser
+# Eric Peterson <lcc.eric at SEAS.UCLA.EDU>
+nxedit 126/udp # NXEdit
+nxedit 126/tcp # NXEdit
+# Don Payette <Don.Payette at unisys.com>
+###########Port 126 Previously assigned to application below#######
+#unitary 126/tcp Unisys Unitary Login
+#unitary 126/udp Unisys Unitary Login
+# <feil at kronos.nisd.cam.unisys.com>
+###########Port 126 Previously assigned to application above#######
+locus-con 127/udp # Locus PC-Interface Conn Server
+locus-con 127/tcp # Locus PC-Interface Conn Server
+# Eric Peterson <lcc.eric at SEAS.UCLA.EDU>
+gss-xlicen 128/udp # GSS X License Verification
+gss-xlicen 128/tcp # GSS X License Verification
+# John Light <johnl at gssc.gss.com>
+pwdgen 129/udp # Password Generator Protocol
+pwdgen 129/tcp # Password Generator Protocol
+# Frank J. Wacho <WANCHO at WSMR-SIMTEL20.ARMY.MIL>
+cisco-fna 130/udp # cisco FNATIVE
+cisco-fna 130/tcp # cisco FNATIVE
+cisco-tna 131/udp # cisco TNATIVE
+cisco-tna 131/tcp # cisco TNATIVE
+cisco-sys 132/udp # cisco SYSMAINT
+cisco-sys 132/tcp # cisco SYSMAINT
+statsrv 133/udp # Statistics Service
+statsrv 133/tcp # Statistics Service
+# Dave Mills <Mills at HUEY.UDEL.EDU>
+ingres-net 134/udp # INGRES-NET Service
+ingres-net 134/tcp # INGRES-NET Service
+# Mike Berrow <---none--->
+epmap 135/udp # DCE endpoint resolution
+epmap 135/tcp # DCE endpoint resolution
+# Joe Pato <pato at apollo.hp.com>
+profile 136/udp # PROFILE Naming System
+profile 136/tcp # PROFILE Naming System
+# Larry Peterson <llp at ARIZONA.EDU>
+netbios-ns 137/udp # NETBIOS Name Service
+netbios-ns 137/tcp # NETBIOS Name Service
+netbios-dgm 138/udp # NETBIOS Datagram Service
+netbios-dgm 138/tcp # NETBIOS Datagram Service
+netbios-ssn 139/udp # NETBIOS Session Service
+netbios-ssn 139/tcp # NETBIOS Session Service
+# Jon Postel <postel at isi.edu>
+emfis-data 140/udp # EMFIS Data Service
+emfis-data 140/tcp # EMFIS Data Service
+emfis-cntl 141/udp # EMFIS Control Service
+emfis-cntl 141/tcp # EMFIS Control Service
+# Gerd Beling <GBELING at ISI.EDU>
+bl-idm 142/udp # Britton-Lee IDM
+bl-idm 142/tcp # Britton-Lee IDM
+# Susie Snitzer <---none--->
+imap 143/udp # Internet Message Access Protocol
+imap 143/tcp # Internet Message Access Protocol
+# Mark Crispin <MRC at CAC.Washington.EDU>
+uma 144/udp # Universal Management Architecture
+uma 144/tcp # Universal Management Architecture
+# Jay Whitney <jw at powercenter.com>
+uaac 145/udp # UAAC Protocol
+uaac 145/tcp # UAAC Protocol
+# David A. Gomberg <gomberg at GATEWAY.MITRE.ORG>
+iso-tp0 146/udp # ISO-IP0
+iso-tp0 146/tcp # ISO-IP0
+iso-ip 147/udp # ISO-IP
+iso-ip 147/tcp # ISO-IP
+# Marshall Rose <mrose at dbc.mtview.ca.us>
+jargon 148/udp # Jargon
+jargon 148/tcp # Jargon
+# Bill Weinman <wew at bearnet.com>
+aed-512 149/udp # AED 512 Emulation Service
+aed-512 149/tcp # AED 512 Emulation Service
+# Albert G. Broscius <broscius at DSL.CIS.UPENN.EDU>
+sql-net 150/udp # SQL-NET
+sql-net 150/tcp # SQL-NET
+# Martin Picard <<---none--->
+hems 151/udp # HEMS
+hems 151/tcp # HEMS
+bftp 152/udp # Background File Transfer Program
+bftp 152/tcp # Background File Transfer Program
+# Annette DeSchon <DESCHON at ISI.EDU>
+sgmp 153/udp # SGMP
+sgmp 153/tcp # SGMP
+# Marty Schoffstahl <schoff at NISC.NYSER.NET>
+netsc-prod 154/udp # NETSC
+netsc-prod 154/tcp # NETSC
+netsc-dev 155/udp # NETSC
+netsc-dev 155/tcp # NETSC
+# Sergio Heker <heker at JVNCC.CSC.ORG>
+sqlsrv 156/udp # SQL Service
+sqlsrv 156/tcp # SQL Service
+# Craig Rogers <Rogers at ISI.EDU>
+knet-cmp 157/udp # KNET/VM Command/Message Protocol
+knet-cmp 157/tcp # KNET/VM Command/Message Protocol
+# Gary S. Malkin <GMALKIN at XYLOGICS.COM>
+pcmail-srv 158/udp # PCMail Server
+pcmail-srv 158/tcp # PCMail Server
+# Mark L. Lambert <markl at PTT.LCS.MIT.EDU>
+nss-routing 159/udp # NSS-Routing
+nss-routing 159/tcp # NSS-Routing
+# Yakov Rekhter <Yakov at IBM.COM>
+sgmp-traps 160/udp # SGMP-TRAPS
+sgmp-traps 160/tcp # SGMP-TRAPS
+# Marty Schoffstahl <schoff at NISC.NYSER.NET>
+snmp 161/udp # SNMP
+snmp 161/tcp # SNMP
+snmptrap 162/udp # SNMPTRAP
+snmptrap 162/tcp # SNMPTRAP
+# Marshall Rose <mrose at dbc.mtview.ca.us>
+cmip-man 163/udp # CMIP/TCP Manager
+cmip-man 163/tcp # CMIP/TCP Manager
+cmip-agent 164/udp # CMIP/TCP Agent
+cmip-agent 164/tcp # CMIP/TCP Agent
+# Amatzia Ben-Artzi <---none--->
+xns-courier 165/udp # Xerox
+xns-courier 165/tcp # Xerox
+# Susie Armstrong <Armstrong.wbst128 at XEROX.COM>
+s-net 166/udp # Sirius Systems
+s-net 166/tcp # Sirius Systems
+# Brian Lloyd <brian at lloyd.com>
+namp 167/udp # NAMP
+namp 167/tcp # NAMP
+# Marty Schoffstahl <schoff at NISC.NYSER.NET>
+rsvd 168/udp # RSVD
+rsvd 168/tcp # RSVD
+# Neil Todd <mcvax!ist.co.uk!neil at UUNET.UU.NET>
+send 169/udp # SEND
+send 169/tcp # SEND
+# William D. Wisner <wisner at HAYES.FAI.ALASKA.EDU>
+print-srv 170/udp # Network PostScript
+print-srv 170/tcp # Network PostScript
+# Brian Reid <reid at DECWRL.DEC.COM>
+multiplex 171/udp # Network Innovations Multiplex
+multiplex 171/tcp # Network Innovations Multiplex
+cl/1 172/udp # Network Innovations CL/1
+cl/1 172/tcp # Network Innovations CL/1
+# Kevin DeVault <<---none--->
+xyplex-mux 173/udp # Xyplex
+xyplex-mux 173/tcp # Xyplex
+# Bob Stewart <STEWART at XYPLEX.COM>
+mailq 174/udp # MAILQ
+mailq 174/tcp # MAILQ
+# Rayan Zachariassen <rayan at AI.TORONTO.EDU>
+vmnet 175/udp # VMNET
+vmnet 175/tcp # VMNET
+# Christopher Tengi <tengi at Princeton.EDU>
+genrad-mux 176/udp # GENRAD-MUX
+genrad-mux 176/tcp # GENRAD-MUX
+# Ron Thornton <thornton at qm7501.genrad.com>
+xdmcp 177/udp # X Display Manager Control Protocol
+xdmcp 177/tcp # X Display Manager Control Protocol
+# Robert W. Scheifler <RWS at XX.LCS.MIT.EDU>
+nextstep 178/udp # NextStep Window Server
+nextstep 178/tcp # NextStep Window Server
+# Leo Hourvitz <leo at NEXT.COM>
+bgp 179/udp # Border Gateway Protocol
+bgp 179/tcp # Border Gateway Protocol
+# Kirk Lougheed <LOUGHEED at MATHOM.CISCO.COM>
+ris 180/udp # Intergraph
+ris 180/tcp # Intergraph
+# Dave Buehmann <ingr!daveb at UUNET.UU.NET>
+unify 181/udp # Unify
+unify 181/tcp # Unify
+# Mark Ainsley <ianaportmaster at unify.com>
+audit 182/udp # Unisys Audit SITP
+audit 182/tcp # Unisys Audit SITP
+# Gil Greenbaum <gcole at nisd.cam.unisys.com>
+ocbinder 183/udp # OCBinder
+ocbinder 183/tcp # OCBinder
+ocserver 184/udp # OCServer
+ocserver 184/tcp # OCServer
+# Jerrilynn Okamura <--none--->
+remote-kis 185/udp # Remote-KIS
+remote-kis 185/tcp # Remote-KIS
+kis 186/udp # KIS Protocol
+kis 186/tcp # KIS Protocol
+# Ralph Droms <rdroms at NRI.RESTON.VA.US>
+aci 187/udp # Application Communication Interface
+aci 187/tcp # Application Communication Interface
+# Rick Carlos <rick.ticipa.csc.ti.com>
+mumps 188/udp # Plus Five's MUMPS
+mumps 188/tcp # Plus Five's MUMPS
+# Hokey Stenn <hokey at PLUS5.COM>
+qft 189/udp # Queued File Transport
+qft 189/tcp # Queued File Transport
+# Wayne Schroeder <schroeder at SDS.SDSC.EDU>
+gacp 190/udp # Gateway Access Control Protocol
+gacp 190/tcp # Gateway Access Control Protocol
+# C. Philip Wood <cpw at LANL.GOV>
+prospero 191/udp # Prospero Directory Service
+prospero 191/tcp # Prospero Directory Service
+# B. Clifford Neuman <bcn at isi.edu>
+osu-nms 192/udp # OSU Network Monitoring System
+osu-nms 192/tcp # OSU Network Monitoring System
+# Doug Karl <KARL-D at OSU-20.IRCC.OHIO-STATE.EDU>
+srmp 193/udp # Spider Remote Monitoring Protocol
+srmp 193/tcp # Spider Remote Monitoring Protocol
+# Ted J. Socolofsky <Teds at SPIDER.CO.UK>
+irc 194/udp # Internet Relay Chat Protocol
+irc 194/tcp # Internet Relay Chat Protocol
+# Jarkko Oikarinen <jto at TOLSUN.OULU.FI>
+dn6-nlm-aud 195/udp # DNSIX Network Level Module Audit
+dn6-nlm-aud 195/tcp # DNSIX Network Level Module Audit
+dn6-smm-red 196/udp # DNSIX Session Mgt Module Audit Redir
+dn6-smm-red 196/tcp # DNSIX Session Mgt Module Audit Redir
+# Lawrence Lebahn <DIA3 at PAXRV-NES.NAVY.MIL>
+dls 197/udp # Directory Location Service
+dls 197/tcp # Directory Location Service
+dls-mon 198/udp # Directory Location Service Monitor
+dls-mon 198/tcp # Directory Location Service Monitor
+# Scott Bellew <smb at cs.purdue.edu>
+smux 199/udp # SMUX
+smux 199/tcp # SMUX
+# Marshall Rose <mrose at dbc.mtview.ca.us>
+src 200/udp # IBM System Resource Controller
+src 200/tcp # IBM System Resource Controller
+# Gerald McBrearty <---none--->
+at-rtmp 201/udp # AppleTalk Routing Maintenance
+at-rtmp 201/tcp # AppleTalk Routing Maintenance
+at-nbp 202/udp # AppleTalk Name Binding
+at-nbp 202/tcp # AppleTalk Name Binding
+at-3 203/udp # AppleTalk Unused
+at-3 203/tcp # AppleTalk Unused
+at-echo 204/udp # AppleTalk Echo
+at-echo 204/tcp # AppleTalk Echo
+at-5 205/udp # AppleTalk Unused
+at-5 205/tcp # AppleTalk Unused
+at-zis 206/udp # AppleTalk Zone Information
+at-zis 206/tcp # AppleTalk Zone Information
+at-7 207/udp # AppleTalk Unused
+at-7 207/tcp # AppleTalk Unused
+at-8 208/udp # AppleTalk Unused
+at-8 208/tcp # AppleTalk Unused
+# Rob Chandhok <chandhok at gnome.cs.cmu.edu>
+qmtp 209/udp # The Quick Mail Transfer Protocol
+qmtp 209/tcp # The Quick Mail Transfer Protocol
+# Dan Bernstein <djb at silverton.berkeley.edu>
+z39.50 210/udp # ANSI Z39.50
+z39.50 210/tcp # ANSI Z39.50
+# Mark H. Needleman <markn at sirsi.com>
+914c/g 211/udp # Texas Instruments 914C/G Terminal
+914c/g 211/tcp # Texas Instruments 914C/G Terminal
+# Bill Harrell <---none--->
+anet 212/udp # ATEXSSTR
+anet 212/tcp # ATEXSSTR
+# Jim Taylor <taylor at heart.epps.kodak.com>
+ipx 213/udp # IPX
+ipx 213/tcp # IPX
+# Don Provan <donp at xlnvax.novell.com>
+vmpwscs 214/udp # VM PWSCS
+vmpwscs 214/tcp # VM PWSCS
+# Dan Shia <dset!shia at uunet.UU.NET>
+softpc 215/udp # Insignia Solutions
+softpc 215/tcp # Insignia Solutions
+# Martyn Thomas <---none--->
+CAIlic 216/udp # Computer Associates Int'l License Server
+CAIlic 216/tcp # Computer Associates Int'l License Server
+# Chuck Spitz <spich04 at cai.com>
+dbase 217/udp # dBASE Unix
+dbase 217/tcp # dBASE Unix
+# Don Gibson
+# <sequent!aero!twinsun!ashtate.A-T.COM!dong at uunet.UU.NET>
+mpp 218/udp # Netix Message Posting Protocol
+mpp 218/tcp # Netix Message Posting Protocol
+# Shannon Yeh <yeh at netix.com>
+uarps 219/udp # Unisys ARPs
+uarps 219/tcp # Unisys ARPs
+# Ashok Marwaha <---none--->
+imap3 220/udp # Interactive Mail Access Protocol v3
+imap3 220/tcp # Interactive Mail Access Protocol v3
+# James Rice <RICE at SUMEX-AIM.STANFORD.EDU>
+fln-spx 221/udp # Berkeley rlogind with SPX auth
+fln-spx 221/tcp # Berkeley rlogind with SPX auth
+rsh-spx 222/udp # Berkeley rshd with SPX auth
+rsh-spx 222/tcp # Berkeley rshd with SPX auth
+cdc 223/udp # Certificate Distribution Center
+cdc 223/tcp # Certificate Distribution Center
+# Kannan Alagappan <kannan at sejour.enet.dec.com>
+########### Possible Conflict of Port 222 with "Masqdialer"##############
+### Contact for Masqdialer is Charles Wright <cpwright at villagenet.com>###
+masqdialer 224/udp # masqdialer
+masqdialer 224/tcp # masqdialer
+# Charles Wright <cpwright at villagenet.com>
+# 225-241 Reserved
+# Jon Postel <postel at isi.edu>
+direct 242/udp # Direct
+direct 242/tcp # Direct
+# Herb Sutter <HerbS at cntc.com>
+sur-meas 243/udp # Survey Measurement
+sur-meas 243/tcp # Survey Measurement
+# Dave Clark <ddc at LCS.MIT.EDU>
+inbusiness 244/udp # inbusiness
+inbusiness 244/tcp # inbusiness
+# Derrick Hisatake <derrick.i.hisatake at intel.com>
+link 245/udp # LINK
+link 245/tcp # LINK
+dsp3270 246/udp # Display Systems Protocol
+dsp3270 246/tcp # Display Systems Protocol
+# Weldon J. Showalter <Gamma at MINTAKA.DCA.MIL>
+subntbcst_tftp 247/udp # SUBNTBCST_TFTP
+subntbcst_tftp 247/tcp # SUBNTBCST_TFTP
+# John Fake <fake at us.ibm.com>
+bhfhs 248/udp # bhfhs
+bhfhs 248/tcp # bhfhs
+# John Kelly <johnk at bellhow.com>
+# 249-255 Reserved
+# Jon Postel <postel at isi.edu>
+rap 256/udp # RAP
+rap 256/tcp # RAP
+# J.S. Greenfield <greeny at raleigh.ibm.com>
+set 257/udp # Secure Electronic Transaction
+set 257/tcp # Secure Electronic Transaction
+# Donald Eastlake <dee3 at torque.pothole.com>
+yak-chat 258/udp # Yak Winsock Personal Chat
+yak-chat 258/tcp # Yak Winsock Personal Chat
+# Brian Bandy <bbandy at swbell.net>
+esro-gen 259/udp # Efficient Short Remote Operations
+esro-gen 259/tcp # Efficient Short Remote Operations
+# Mohsen Banan <mohsen at rostam.neda.com>
+openport 260/udp # Openport
+openport 260/tcp # Openport
+# John Marland <jmarland at dean.openport.com>
+nsiiops 261/udp # IIOP Name Service over TLS/SSL
+nsiiops 261/tcp # IIOP Name Service over TLS/SSL
+# Jeff Stewart <jstewart at netscape.com>
+arcisdms 262/udp # Arcisdms
+arcisdms 262/tcp # Arcisdms
+# Russell Crook (rmc at sni.ca>
+hdap 263/udp # HDAP
+hdap 263/tcp # HDAP
+# Troy Gau <troy at zyxel.com>
+bgmp 264/udp # BGMP
+bgmp 264/tcp # BGMP
+# Dave Thaler <thalerd at eecs.umich.edu>
+x-bone-ctl 265/udp # X-Bone CTL
+x-bone-ctl 265/tcp # X-Bone CTL
+# Joe Touch <touch at isi.edu>
+sst 266/udp # SCSI on ST
+sst 266/tcp # SCSI on ST
+# Donald D. Woelz <don at genroco.com>
+td-service 267/udp # Tobit David Service Layer
+td-service 267/tcp # Tobit David Service Layer
+td-replica 268/udp # Tobit David Replica
+td-replica 268/tcp # Tobit David Replica
+# Franz-Josef Leuders <development at tobit.com>
+# 269-279 Unassigned
+http-mgmt 280/udp # http-mgmt
+http-mgmt 280/tcp # http-mgmt
+# Adrian Pell
+# <PELL_ADRIAN/HP-UnitedKingdom_om6 at hplb.hpl.hp.com>
+personal-link 281/udp # Personal Link
+personal-link 281/tcp # Personal Link
+# Dan Cummings <doc at cnr.com>
+cableport-ax 282/udp # Cable Port A/X
+cableport-ax 282/tcp # Cable Port A/X
+# Craig Langfahl <Craig_J_Langfahl at ccm.ch.intel.com>
+rescap 283/udp # rescap
+rescap 283/tcp # rescap
+# Paul Hoffman <phoffman at imc.org>
+corerjd 284/udp # corerjd
+corerjd 284/tcp # corerjd
+# Chris Thornhill <cjt at corenetworks.com>
+# 285 Unassigned
+fxp-1 286/udp # FXP-1
+fxp-1 286/tcp # FXP-1
+# James Darnall <jim at cennoid.com>
+k-block 287/udp # K-BLOCK
+k-block 287/tcp # K-BLOCK
+# Simon P Jackson <jacko at kring.co.uk>
+# 288-307 Unassigned
+novastorbakcup 308/udp # Novastor Backup
+novastorbakcup 308/tcp # Novastor Backup
+# Brian Dickman <brian at novastor.com>
+entrusttime 309/udp # EntrustTime
+entrusttime 309/tcp # EntrustTime
+# Peter Whittaker <pww at entrust.com>
+bhmds 310/udp # bhmds
+bhmds 310/tcp # bhmds
+# John Kelly <johnk at bellhow.com>
+asip-webadmin 311/udp # AppleShare IP WebAdmin
+asip-webadmin 311/tcp # AppleShare IP WebAdmin
+# Ann Huang <annhuang at apple.com>
+vslmp 312/udp # VSLMP
+vslmp 312/tcp # VSLMP
+# Gerben Wierda <Gerben_Wierda at RnA.nl>
+magenta-logic 313/udp # Magenta Logic
+magenta-logic 313/tcp # Magenta Logic
+# Karl Rousseau <kr at netfusion.co.uk>
+opalis-robot 314/udp # Opalis Robot
+opalis-robot 314/tcp # Opalis Robot
+# Laurent Domenech, Opalis <ldomenech at opalis.com>
+dpsi 315/udp # DPSI
+dpsi 315/tcp # DPSI
+# Tony Scamurra <Tony at DesktopPaging.com>
+decauth 316/udp # decAuth
+decauth 316/tcp # decAuth
+# Michael Agishtein <misha at unx.dec.com>
+zannet 317/udp # Zannet
+zannet 317/tcp # Zannet
+# Zan Oliphant <zan at accessone.com>
+pkix-timestamp 318/udp # PKIX TimeStamp
+pkix-timestamp 318/tcp # PKIX TimeStamp
+# Robert Zuccherato <robert.zuccherato at entrust.com>
+ptp-event 319/udp # PTP Event
+ptp-event 319/tcp # PTP Event
+ptp-general 320/udp # PTP General
+ptp-general 320/tcp # PTP General
+# John Eidson <eidson at hpl.hp.com>
+pip 321/udp # PIP
+pip 321/tcp # PIP
+# Gordon Mohr <gojomo at usa.net>
+rtsps 322/udp # RTSPS
+rtsps 322/tcp # RTSPS
+# Anders Klemets <anderskl at microsoft.com>
+# 323-332 Unassigned
+texar 333/udp # Texar Security Port
+texar 333/tcp # Texar Security Port
+# Eugen Bacic <ebacic at texar.com>
+# 334-343 Unassigned
+pdap 344/udp # Prospero Data Access Protocol
+pdap 344/tcp # Prospero Data Access Protocol
+# B. Clifford Neuman <bcn at isi.edu>
+pawserv 345/udp # Perf Analysis Workbench
+pawserv 345/tcp # Perf Analysis Workbench
+zserv 346/udp # Zebra server
+zserv 346/tcp # Zebra server
+fatserv 347/udp # Fatmen Server
+fatserv 347/tcp # Fatmen Server
+csi-sgwp 348/udp # Cabletron Management Protocol
+csi-sgwp 348/tcp # Cabletron Management Protocol
+mftp 349/udp # mftp
+mftp 349/tcp # mftp
+# Dave Feinleib <davefe at microsoft.com>
+matip-type-a 350/udp # MATIP Type A
+matip-type-a 350/tcp # MATIP Type A
+matip-type-b 351/udp # MATIP Type B
+matip-type-b 351/tcp # MATIP Type B
+# Alain Robert <arobert at par.sita.int>
+# The following entry records an unassigned but widespread use
+bhoetty 351/udp # bhoetty
+bhoetty 351/tcp # bhoetty (added 5/21/97)
+# John Kelly <johnk at bellhow.com>
+dtag-ste-sb 352/udp # DTAG
+dtag-ste-sb 352/tcp # DTAG (assigned long ago)
+# Ruediger Wald <wald at ez-darmstadt.telekom.de>
+# The following entry records an unassigned but widespread use
+bhoedap4 352/udp # bhoedap4
+bhoedap4 352/tcp # bhoedap4 (added 5/21/97)
+# John Kelly <johnk at bellhow.com>
+ndsauth 353/udp # NDSAUTH
+ndsauth 353/tcp # NDSAUTH
+# Jayakumar Ramalingam <jayakumar at novell.com>
+bh611 354/udp # bh611
+bh611 354/tcp # bh611
+# John Kelly <johnk at bellhow.com>
+datex-asn 355/udp # DATEX-ASN
+datex-asn 355/tcp # DATEX-ASN
+# Kenneth Vaughn <kvaughn at mail.viggen.com>
+cloanto-net-1 356/udp # Cloanto Net 1
+cloanto-net-1 356/tcp # Cloanto Net 1
+# Michael Battilana <mcb-iana at cloanto.com>
+bhevent 357/udp # bhevent
+bhevent 357/tcp # bhevent
+# John Kelly <johnk at bellhow.com>
+shrinkwrap 358/udp # Shrinkwrap
+shrinkwrap 358/tcp # Shrinkwrap
+# Bill Simpson <wsimpson at greendragon.com>
+nsrmp 359/udp # Network Security Risk Management Protocol
+nsrmp 359/tcp # Network Security Risk Management Protocol
+# Eric Jacksch <jacksch at tenebris.ca>
+scoi2odialog 360/udp # scoi2odialog
+scoi2odialog 360/tcp # scoi2odialog
+# Keith Petley <keithp at sco.COM>
+semantix 361/udp # Semantix
+semantix 361/tcp # Semantix
+# Semantix <xsSupport at semantix.com>
+srssend 362/udp # SRS Send
+srssend 362/tcp # SRS Send
+# Curt Mayer <curt at emergent.com>
+rsvp_tunnel 363/udp # RSVP Tunnel
+rsvp_tunnel 363/tcp # RSVP Tunnel
+# Andreas Terzis <terzis at cs.ucla.edu>
+aurora-cmgr 364/udp # Aurora CMGR
+aurora-cmgr 364/tcp # Aurora CMGR
+# Philip Budne <budne at auroratech.com>
+dtk 365/udp # DTK
+dtk 365/tcp # DTK
+# Fred Cohen <fc at all.net>
+odmr 366/udp # ODMR
+odmr 366/tcp # ODMR
+# Randall Gellens <randy at qualcomm.com>
+mortgageware 367/udp # MortgageWare
+mortgageware 367/tcp # MortgageWare
+# Ole Hellevik <oleh at interlinq.com>
+qbikgdp 368/udp # QbikGDP
+qbikgdp 368/tcp # QbikGDP
+# Adrien de Croy <adrien at qbik.com>
+rpc2portmap 369/udp # rpc2portmap
+rpc2portmap 369/tcp # rpc2portmap
+codaauth2 370/udp # codaauth2
+codaauth2 370/tcp # codaauth2
+# Robert Watson <robert at cyrus.watson.org>
+clearcase 371/udp # Clearcase
+clearcase 371/tcp # Clearcase
+# Dave LeBlang <leglang at atria.com>
+ulistproc 372/udp # ListProcessor
+ulistproc 372/tcp # ListProcessor
+# Anastasios Kotsikonas <tasos at cs.bu.edu>
+legent-1 373/udp # Legent Corporation
+legent-1 373/tcp # Legent Corporation
+legent-2 374/udp # Legent Corporation
+legent-2 374/tcp # Legent Corporation
+# Keith Boyce <---none--->
+hassle 375/udp # Hassle
+hassle 375/tcp # Hassle
+# Reinhard Doelz <doelz at comp.bioz.unibas.ch>
+nip 376/udp # Amiga Envoy Network Inquiry Proto
+nip 376/tcp # Amiga Envoy Network Inquiry Proto
+# Heinz Wrobel <hwrobel at gmx.de>
+tnETOS 377/udp # NEC Corporation
+tnETOS 377/tcp # NEC Corporation
+dsETOS 378/udp # NEC Corporation
+dsETOS 378/tcp # NEC Corporation
+# Tomoo Fujita <tf at arc.bs1.fc.nec.co.jp>
+is99c 379/udp # TIA/EIA/IS-99 modem client
+is99c 379/tcp # TIA/EIA/IS-99 modem client
+is99s 380/udp # TIA/EIA/IS-99 modem server
+is99s 380/tcp # TIA/EIA/IS-99 modem server
+# Frank Quick <fquick at qualcomm.com>
+hp-collector 381/udp # hp performance data collector
+hp-collector 381/tcp # hp performance data collector
+hp-managed-node 382/udp # hp performance data managed node
+hp-managed-node 382/tcp # hp performance data managed node
+hp-alarm-mgr 383/udp # hp performance data alarm manager
+hp-alarm-mgr 383/tcp # hp performance data alarm manager
+# Frank Blakely <frankb at hpptc16.rose.hp.com>
+arns 384/udp # A Remote Network Server System
+arns 384/tcp # A Remote Network Server System
+# David Hornsby <djh at munnari.OZ.AU>
+ibm-app 385/udp # IBM Application
+ibm-app 385/tcp # IBM Application
+# Lisa Tomita <---none--->
+asa 386/udp # ASA Message Router Object Def.
+asa 386/tcp # ASA Message Router Object Def.
+# Steve Laitinen <laitinen at brutus.aa.ab.com>
+aurp 387/udp # Appletalk Update-Based Routing Pro.
+aurp 387/tcp # Appletalk Update-Based Routing Pro.
+# Chris Ranch <cranch at novell.com>
+unidata-ldm 388/udp # Unidata LDM
+unidata-ldm 388/tcp # Unidata LDM
+# Glenn Davis <support at unidata.ucar.edu>
+ldap 389/udp # Lightweight Directory Access Protocol
+ldap 389/tcp # Lightweight Directory Access Protocol
+# Tim Howes <Tim.Howes at terminator.cc.umich.edu>
+uis 390/udp # UIS
+uis 390/tcp # UIS
+# Ed Barron <---none--->
+synotics-relay 391/udp # SynOptics SNMP Relay Port
+synotics-relay 391/tcp # SynOptics SNMP Relay Port
+synotics-broker 392/udp # SynOptics Port Broker Port
+synotics-broker 392/tcp # SynOptics Port Broker Port
+# Illan Raab <iraab at synoptics.com>
+meta5 393/udp # Meta5
+meta5 393/tcp # Meta5
+# Jim Kanzler <jim.kanzler at meta5.com>
+embl-ndt 394/udp # EMBL Nucleic Data Transfer
+embl-ndt 394/tcp # EMBL Nucleic Data Transfer
+# Peter Gad <peter at bmc.uu.se>
+netcp 395/udp # NETscout Control Protocol
+netcp 395/tcp # NETscout Control Protocol
+# Anil Singhal <---none--->
+netware-ip 396/udp # Novell Netware over IP
+netware-ip 396/tcp # Novell Netware over IP
+mptn 397/udp # Multi Protocol Trans. Net.
+mptn 397/tcp # Multi Protocol Trans. Net.
+# Soumitra Sarkar <sarkar at vnet.ibm.com>
+kryptolan 398/udp # Kryptolan
+kryptolan 398/tcp # Kryptolan
+# Peter de Laval <pdl at sectra.se>
+iso-tsap-c2 399/udp # ISO Transport Class 2 Non-Control over UDP
+iso-tsap-c2 399/tcp # ISO Transport Class 2 Non-Control over TCP
+# Yanick Pouffary <pouffary at taec.enet.dec.com>
+work-sol 400/udp # Workstation Solutions
+work-sol 400/tcp # Workstation Solutions
+# Jim Ward <jimw at worksta.com>
+ups 401/udp # Uninterruptible Power Supply
+ups 401/tcp # Uninterruptible Power Supply
+# Charles Bennett <chuck at benatong.com>
+genie 402/udp # Genie Protocol
+genie 402/tcp # Genie Protocol
+# Mark Hankin <---none--->
+decap 403/udp # decap
+decap 403/tcp # decap
+nced 404/udp # nced
+nced 404/tcp # nced
+ncld 405/udp # ncld
+ncld 405/tcp # ncld
+# Richard Jones <---none--->
+imsp 406/udp # Interactive Mail Support Protocol
+imsp 406/tcp # Interactive Mail Support Protocol
+# John Myers <jgm+ at cmu.edu>
+timbuktu 407/udp # Timbuktu
+timbuktu 407/tcp # Timbuktu
+# Marc Epard <marc at netopia.com>
+prm-sm 408/udp # Prospero Resource Manager Sys. Man.
+prm-sm 408/tcp # Prospero Resource Manager Sys. Man.
+prm-nm 409/udp # Prospero Resource Manager Node Man.
+prm-nm 409/tcp # Prospero Resource Manager Node Man.
+# B. Clifford Neuman <bcn at isi.edu>
+decladebug 410/udp # DECLadebug Remote Debug Protocol
+decladebug 410/tcp # DECLadebug Remote Debug Protocol
+# Anthony Berent <anthony.berent at reo.mts.dec.com>
+rmt 411/udp # Remote MT Protocol
+rmt 411/tcp # Remote MT Protocol
+# Peter Eriksson <pen at lysator.liu.se>
+synoptics-trap 412/udp # Trap Convention Port
+synoptics-trap 412/tcp # Trap Convention Port
+# Illan Raab <iraab at synoptics.com>
+smsp 413/udp # Storage Management Services Protocol
+smsp 413/tcp # Storage Management Services Protocol
+# Murthy Srinivas <murthy at novell.com>
+infoseek 414/udp # InfoSeek
+infoseek 414/tcp # InfoSeek
+# Steve Kirsch <stk at infoseek.com>
+bnet 415/udp # BNet
+bnet 415/tcp # BNet
+# Jim Mertz <JMertz+RV09 at rvdc.unisys.com>
+silverplatter 416/udp # Silverplatter
+silverplatter 416/tcp # Silverplatter
+# Peter Ciuffetti <petec at silverplatter.com>
+onmux 417/udp # Onmux
+onmux 417/tcp # Onmux
+# Stephen Hanna <hanna at world.std.com>
+hyper-g 418/udp # Hyper-G
+hyper-g 418/tcp # Hyper-G
+# Frank Kappe <fkappe at iicm.tu-graz.ac.at>
+ariel1 419/udp # Ariel 1
+ariel1 419/tcp # Ariel 1
+# Joel Karafin <jkarafin at infotrieve.com>
+smpte 420/udp # SMPTE
+smpte 420/tcp # SMPTE
+# Si Becker <71362.22 at CompuServe.COM>
+ariel2 421/udp # Ariel 2
+ariel2 421/tcp # Ariel 2
+ariel3 422/udp # Ariel 3
+ariel3 422/tcp # Ariel 3
+# Joel Karafin <jkarafin at infotrieve.com>
+opc-job-start 423/udp # IBM Operations Planning and Control Start
+opc-job-start 423/tcp # IBM Operations Planning and Control Start
+opc-job-track 424/udp # IBM Operations Planning and Control Track
+opc-job-track 424/tcp # IBM Operations Planning and Control Track
+# Conny Larsson <cocke at VNET.IBM.COM>
+icad-el 425/udp # ICAD
+icad-el 425/tcp # ICAD
+# Larry Stone <lcs at icad.com>
+smartsdp 426/udp # smartsdp
+smartsdp 426/tcp # smartsdp
+# Alexander Dupuy <dupuy at smarts.com>
+svrloc 427/udp # Server Location
+svrloc 427/tcp # Server Location
+# <veizades at ftp.com>
+ocs_cmu 428/udp # OCS_CMU
+ocs_cmu 428/tcp # OCS_CMU
+ocs_amu 429/udp # OCS_AMU
+ocs_amu 429/tcp # OCS_AMU
+# Florence Wyman <wyman at peabody.plk.af.mil>
+utmpsd 430/udp # UTMPSD
+utmpsd 430/tcp # UTMPSD
+utmpcd 431/udp # UTMPCD
+utmpcd 431/tcp # UTMPCD
+iasd 432/udp # IASD
+iasd 432/tcp # IASD
+# Nir Baroz <nbaroz at encore.com>
+nnsp 433/udp # NNSP
+nnsp 433/tcp # NNSP
+# Rob Robertson <rob at gangrene.berkeley.edu>
+mobileip-agent 434/udp # MobileIP-Agent
+mobileip-agent 434/tcp # MobileIP-Agent
+mobilip-mn 435/udp # MobilIP-MN
+mobilip-mn 435/tcp # MobilIP-MN
+# Kannan Alagappan <kannan at sejour.lkg.dec.com>
+dna-cml 436/udp # DNA-CML
+dna-cml 436/tcp # DNA-CML
+# Dan Flowers <flowers at smaug.lkg.dec.com>
+comscm 437/udp # comscm
+comscm 437/tcp # comscm
+# Jim Teague <teague at zso.dec.com>
+dsfgw 438/udp # dsfgw
+dsfgw 438/tcp # dsfgw
+# Andy McKeen <mckeen at osf.org>
+dasp 439/udp # dasp tommy at inlab.m.eunet.de
+dasp 439/tcp # dasp Thomas Obermair
+# Thomas Obermair <tommy at inlab.m.eunet.de>
+sgcp 440/udp # sgcp
+sgcp 440/tcp # sgcp
+# Marshall Rose <mrose at dbc.mtview.ca.us>
+decvms-sysmgt 441/udp # decvms-sysmgt
+decvms-sysmgt 441/tcp # decvms-sysmgt
+# Lee Barton <barton at star.enet.dec.com>
+cvc_hostd 442/udp # cvc_hostd
+cvc_hostd 442/tcp # cvc_hostd
+# Bill Davidson <billd at equalizer.cray.com>
+https 443/udp # http protocol over TLS/SSL
+https 443/tcp # http protocol over TLS/SSL
+# Kipp E.B. Hickman <kipp at mcom.com>
+snpp 444/udp # Simple Network Paging Protocol
+snpp 444/tcp # Simple Network Paging Protocol
+# [RFC1568]
+microsoft-ds 445/udp # Microsoft-DS
+microsoft-ds 445/tcp # Microsoft-DS
+# Pradeep Bahl <pradeepb at microsoft.com>
+ddm-rdb 446/udp # DDM-RDB
+ddm-rdb 446/tcp # DDM-RDB
+ddm-dfm 447/udp # DDM-RFM
+ddm-dfm 447/tcp # DDM-RFM
+# Jan David Fisher <jdfisher at VNET.IBM.COM>
+ddm-ssl 448/udp # DDM-SSL
+ddm-ssl 448/tcp # DDM-SSL
+# Steve Ritland <srr at vnet.ibm.com>
+as-servermap 449/udp # AS Server Mapper
+as-servermap 449/tcp # AS Server Mapper
+# Barbara Foss <BGFOSS at rchvmv.vnet.ibm.com>
+tserver 450/udp # Computer Supported Telecomunication Applications
+tserver 450/tcp # Computer Supported Telecomunication Applications
+# Harvey S. Schultz <harvey at acm.org>
+sfs-smp-net 451/udp # Cray Network Semaphore server
+sfs-smp-net 451/tcp # Cray Network Semaphore server
+sfs-config 452/udp # Cray SFS config server
+sfs-config 452/tcp # Cray SFS config server
+# Walter Poxon <wdp at ironwood.cray.com>
+creativeserver 453/udp # CreativeServer
+creativeserver 453/tcp # CreativeServer
+contentserver 454/udp # ContentServer
+contentserver 454/tcp # ContentServer
+creativepartnr 455/udp # CreativePartnr
+creativepartnr 455/tcp # CreativePartnr
+# Jesus Ortiz <jesus_ortiz at emotion.com>
+macon-udp 456/udp # macon-udp
+macon-tcp 456/tcp # macon-tcp
+# Yoshinobu Inoue
+# <shin at hodaka.mfd.cs.fujitsu.co.jp>
+scohelp 457/udp # scohelp
+scohelp 457/tcp # scohelp
+# Faith Zack <faithz at sco.com>
+appleqtc 458/udp # apple quick time
+appleqtc 458/tcp # apple quick time
+# Murali Ranganathan
+# <murali_ranganathan at quickmail.apple.com>
+ampr-rcmd 459/udp # ampr-rcmd
+ampr-rcmd 459/tcp # ampr-rcmd
+# Rob Janssen <rob at sys3.pe1chl.ampr.org>
+skronk 460/udp # skronk
+skronk 460/tcp # skronk
+# Henry Strickland <strick at yak.net>
+datasurfsrv 461/udp # DataRampSrv
+datasurfsrv 461/tcp # DataRampSrv
+datasurfsrvsec 462/udp # DataRampSrvSec
+datasurfsrvsec 462/tcp # DataRampSrvSec
+# Diane Downie <downie at jibe.MV.COM>
+alpes 463/udp # alpes
+alpes 463/tcp # alpes
+# Alain Durand <Alain.Durand at imag.fr>
+kpasswd 464/udp # kpasswd
+kpasswd 464/tcp # kpasswd
+# Theodore Ts'o <tytso at MIT.EDU>
+igmpv3lite 465/udp # IGMP over UDP for SSM
+urd 465/tcp # URL Rendesvous Directory for SSM
+# Toerless Eckert <eckert at cisco.com>
+digital-vrc 466/udp # digital-vrc
+digital-vrc 466/tcp # digital-vrc
+# Peter Higginson <higginson at mail.dec.com>
+mylex-mapd 467/udp # mylex-mapd
+mylex-mapd 467/tcp # mylex-mapd
+# Gary Lewis <GaryL at hq.mylex.com>
+photuris 468/udp # proturis
+photuris 468/tcp # proturis
+# Bill Simpson <Bill.Simpson at um.cc.umich.edu>
+rcp 469/udp # Radio Control Protocol
+rcp 469/tcp # Radio Control Protocol
+# Jim Jennings +1-708-538-7241
+scx-proxy 470/udp # scx-proxy
+scx-proxy 470/tcp # scx-proxy
+# Scott Narveson <sjn at cray.com>
+mondex 471/udp # Mondex
+mondex 471/tcp # Mondex
+# Bill Reding <redingb at nwdt.natwest.co.uk>
+ljk-login 472/udp # ljk-login
+ljk-login 472/tcp # ljk-login
+# LJK Software, Cambridge, Massachusetts
+# <support at ljk.com>
+hybrid-pop 473/udp # hybrid-pop
+hybrid-pop 473/tcp # hybrid-pop
+# Rami Rubin <rami at hybrid.com>
+tn-tl-w2 474/udp # tn-tl-w2
+tn-tl-w1 474/tcp # tn-tl-w1
+# Ed Kress <eskress at thinknet.com>
+tcpnethaspsrv 475/udp # tcpnethaspsrv
+tcpnethaspsrv 475/tcp # tcpnethaspsrv
+# Charlie Hava <charlie at aladdin.co.il>
+tn-tl-fd1 476/udp # tn-tl-fd1
+tn-tl-fd1 476/tcp # tn-tl-fd1
+# Ed Kress <eskress at thinknet.com>
+ss7ns 477/udp # ss7ns
+ss7ns 477/tcp # ss7ns
+# Jean-Michel URSCH <ursch at taec.enet.dec.com>
+spsc 478/udp # spsc
+spsc 478/tcp # spsc
+# Mike Rieker <mikea at sp32.com>
+iafserver 479/udp # iafserver
+iafserver 479/tcp # iafserver
+iafdbase 480/udp # iafdbase
+iafdbase 480/tcp # iafdbase
+# ricky at solect.com <Rick Yazwinski>
+ph 481/udp # Ph service
+ph 481/tcp # Ph service
+# Roland Hedberg <Roland.Hedberg at umdac.umu.se>
+bgs-nsi 482/udp # bgs-nsi
+bgs-nsi 482/tcp # bgs-nsi
+# Jon Saperia <saperia at bgs.com>
+ulpnet 483/udp # ulpnet
+ulpnet 483/tcp # ulpnet
+# Kevin Mooney <kevinm at bfs.unibol.com>
+integra-sme 484/udp # Integra Software Management Environment
+integra-sme 484/tcp # Integra Software Management Environment
+# Randall Dow <rand at randix.m.isr.de>
+powerburst 485/udp # Air Soft Power Burst
+powerburst 485/tcp # Air Soft Power Burst
+# <gary at airsoft.com>
+avian 486/udp # avian
+avian 486/tcp # avian
+# Robert Ullmann
+# <Robert_Ullmann/CAM/Lotus.LOTUS at crd.lotus.com>
+saft 487/udp # saft Simple Asynchronous File Transfer
+saft 487/tcp # saft Simple Asynchronous File Transfer
+# Ulli Horlacher <framstag at rus.uni-stuttgart.de>
+gss-http 488/udp # gss-http
+gss-http 488/tcp # gss-http
+# Doug Rosenthal <rosenthl at krypton.einet.net>
+nest-protocol 489/udp # nest-protocol
+nest-protocol 489/tcp # nest-protocol
+# Gilles Gameiro <ggameiro at birdland.com>
+micom-pfs 490/udp # micom-pfs
+micom-pfs 490/tcp # micom-pfs
+# David Misunas <DMisunas at micom.com>
+go-login 491/udp # go-login
+go-login 491/tcp # go-login
+# Troy Morrison <troy at graphon.com>
+ticf-1 492/udp # Transport Independent Convergence for FNA
+ticf-1 492/tcp # Transport Independent Convergence for FNA
+ticf-2 493/udp # Transport Independent Convergence for FNA
+ticf-2 493/tcp # Transport Independent Convergence for FNA
+# Mamoru Ito <Ito at pcnet.ks.pfu.co.jp>
+pov-ray 494/udp # POV-Ray
+pov-ray 494/tcp # POV-Ray
+# POV-Team Co-ordinator
+# <iana-port.remove-spamguard at povray.org>
+intecourier 495/udp # intecourier
+intecourier 495/tcp # intecourier
+# Steve Favor <sfavor at tigger.intecom.com>
+pim-rp-disc 496/udp # PIM-RP-DISC
+pim-rp-disc 496/tcp # PIM-RP-DISC
+# Dino Farinacci <dino at cisco.com>
+dantz 497/udp # dantz
+dantz 497/tcp # dantz
+# Richard Zulch <richard_zulch at dantz.com>
+siam 498/udp # siam
+siam 498/tcp # siam
+# Philippe Gilbert <pgilbert at cal.fr>
+iso-ill 499/udp # ISO ILL Protocol
+iso-ill 499/tcp # ISO ILL Protocol
+# Mark H. Needleman <markn at sirsi.com>
+isakmp 500/udp # isakmp
+isakmp 500/tcp # isakmp
+# Mark Schertler <mjs at tycho.ncsc.mil>
+stmf 501/udp # STMF
+stmf 501/tcp # STMF
+# Alan Ungar <aungar at farradyne.com>
+asa-appl-proto 502/udp # asa-appl-proto
+asa-appl-proto 502/tcp # asa-appl-proto
+# Dennis Dube <ddube at modicon.com>
+intrinsa 503/udp # Intrinsa
+intrinsa 503/tcp # Intrinsa
+# Robert Ford <robert at intrinsa.com>
+citadel 504/udp # citadel
+citadel 504/tcp # citadel
+# Art Cancro <ajc at uncnsrd.mt-kisco.ny.us>
+mailbox-lm 505/udp # mailbox-lm
+mailbox-lm 505/tcp # mailbox-lm
+# Beverly Moody <Beverly_Moody at stercomm.com>
+ohimsrv 506/udp # ohimsrv
+ohimsrv 506/tcp # ohimsrv
+# Scott Powell <spowell at openhorizon.com>
+crs 507/udp # crs
+crs 507/tcp # crs
+# Brad Wright <bradwr at microsoft.com>
+xvttp 508/udp # xvttp
+xvttp 508/tcp # xvttp
+# Keith J. Alphonso <alphonso at ncs-ssc.com>
+snare 509/udp # snare
+snare 509/tcp # snare
+# Dennis Batchelder <dennis at capres.com>
+fcp 510/udp # FirstClass Protocol
+fcp 510/tcp # FirstClass Protocol
+# Mike Marshburn <paul at softarc.com>
+passgo 511/udp # PassGo
+passgo 511/tcp # PassGo
+# John Rainford <jrainford at passgo.com>
+exec 512/tcp # remote process execution;
+# authentication performed using
+# passwords and UNIX login names
+comsat 512/udp biff #
+# of new mail received; currently
+# receives messages only from
+# processes on the same machine
+login 513/tcp # remote login a la telnet;
+# automatic authentication performed
+# based on priviledged port numbers
+# and distributed data bases which
+# identify "authentication domains"
+who 513/udp # maintains data bases showing who's
+# logged in to machines on a local
+# net and the load average of the
+# machine
+shell 514/tcp # cmd
+# like exec, but automatic authentication
+# is performed as for login server
+syslog 514/udp #
+printer 515/udp # spooler
+printer 515/tcp # spooler
+videotex 516/udp # videotex
+videotex 516/tcp # videotex
+# Daniel Mavrakis <system at venus.mctel.fr>
+talk 517/tcp # like tenex link, but across
+# machine - unfortunately, doesn't
+# use link protocol (this is actually
+# just a rendezvous port from which a
+# tcp connection is established)
+talk 517/udp # like tenex link, but across
+# machine - unfortunately, doesn't
+# use link protocol (this is actually
+# just a rendezvous port from which a
+# tcp connection is established)
+ntalk 518/udp #
+ntalk 518/tcp #
+utime 519/udp # unixtime
+utime 519/tcp # unixtime
+router 520/udp # local routing process (on site);
+efs 520/tcp # extended file name server
+# uses variant of Xerox NS routing
+# information protocol - RIP
+ripng 521/udp # ripng
+ripng 521/tcp # ripng
+# Robert E. Minnear <minnear at ipsilon.com>
+ulp 522/udp # ULP
+ulp 522/tcp # ULP
+# Max Morris <maxm at MICROSOFT.com>
+ibm-db2 523/udp # IBM-DB2
+ibm-db2 523/tcp # IBM-DB2
+# Peter Pau <pau at VNET.IBM.COM>
+ncp 524/udp # NCP
+ncp 524/tcp # NCP
+# Don Provan <donp at sjf.novell.com>
+timed 525/udp # timeserver
+timed 525/tcp # timeserver
+tempo 526/udp # newdate
+tempo 526/tcp # newdate
+# Unknown
+stx 527/udp # Stock IXChange
+stx 527/tcp # Stock IXChange
+custix 528/udp # Customer IXChange
+custix 528/tcp # Customer IXChange
+# Ferdi Ladeira <ferdi.ladeira at ixchange.com>
+irc-serv 529/udp # IRC-SERV
+irc-serv 529/tcp # IRC-SERV
+# Brian Tackett <cym at acrux.net>
+courier 530/udp # rpc
+courier 530/tcp # rpc
+conference 531/udp # chat
+conference 531/tcp # chat
+netnews 532/udp # readnews
+netnews 532/tcp # readnews
+netwall 533/udp # for emergency broadcasts
+netwall 533/tcp # for emergency broadcasts
+mm-admin 534/udp # MegaMedia Admin
+mm-admin 534/tcp # MegaMedia Admin
+# Andreas Heidemann <a.heidemann at ais-gmbh.de>
+iiop 535/udp # iiop
+iiop 535/tcp # iiop
+# Jeff M.Michaud <michaud at zk3.dec.com>
+opalis-rdv 536/udp # opalis-rdv
+opalis-rdv 536/tcp # opalis-rdv
+# Laurent Domenech <ldomenech at opalis.com>
+nmsp 537/udp # Networked Media Streaming Protocol
+nmsp 537/tcp # Networked Media Streaming Protocol
+# Paul Santinelli Jr. <psantinelli at narrative.com>
+gdomap 538/udp # gdomap
+gdomap 538/tcp # gdomap
+# Richard Frith-Macdonald <richard at brainstorm.co.uk>
+apertus-ldp 539/udp # Apertus Technologies Load Determination
+apertus-ldp 539/tcp # Apertus Technologies Load Determination
+uucp 540/udp # uucpd
+uucp 540/tcp # uucpd
+uucp-rlogin 541/udp # uucp-rlogin
+uucp-rlogin 541/tcp # uucp-rlogin
+# Stuart Lynne <sl at wimsey.com>
+commerce 542/udp # commerce
+commerce 542/tcp # commerce
+# Randy Epstein <repstein at host.net>
+klogin 543/udp #
+klogin 543/tcp #
+kshell 544/udp # krcmd
+kshell 544/tcp # krcmd
+appleqtcsrvr 545/udp # appleqtcsrvr
+appleqtcsrvr 545/tcp # appleqtcsrvr
+# Murali Ranganathan
+# <Murali_Ranganathan at quickmail.apple.com>
+dhcpv6-client 546/udp # DHCPv6 Client
+dhcpv6-client 546/tcp # DHCPv6 Client
+dhcpv6-server 547/udp # DHCPv6 Server
+dhcpv6-server 547/tcp # DHCPv6 Server
+# Jim Bound <bound at zk3.dec.com>
+afpovertcp 548/udp # AFP over TCP
+afpovertcp 548/tcp # AFP over TCP
+# Leland Wallace <randall at apple.com>
+idfp 549/udp # IDFP
+idfp 549/tcp # IDFP
+# Ramana Kovi <ramana at kovi.com>
+new-rwho 550/udp # new-who
+new-rwho 550/tcp # new-who
+cybercash 551/udp # cybercash
+cybercash 551/tcp # cybercash
+# Donald E. Eastlake 3rd <dee at cybercash.com>
+devshr-nts 552/udp # DeviceShare
+devshr-nts 552/tcp # DeviceShare
+# Benjamin Rosenberg <brosenberg at advsyscon.com>
+pirp 553/udp # pirp
+pirp 553/tcp # pirp
+# D. J. Bernstein <djb at silverton.berkeley.edu>
+rtsp 554/udp # Real Time Stream Control Protocol
+rtsp 554/tcp # Real Time Stream Control Protocol
+# Rob Lanphier <robla at prognet.com>
+dsf 555/udp #
+dsf 555/tcp #
+remotefs 556/udp # rfs server
+remotefs 556/tcp # rfs server
+openvms-sysipc 557/udp # openvms-sysipc
+openvms-sysipc 557/tcp # openvms-sysipc
+# Alan Potter <potter at movies.enet.dec.com>
+sdnskmp 558/udp # SDNSKMP
+sdnskmp 558/tcp # SDNSKMP
+teedtap 559/udp # TEEDTAP
+teedtap 559/tcp # TEEDTAP
+# Mort Hoffman <hoffman at mail.ndhm.gtegsc.com>
+rmonitor 560/udp # rmonitord
+rmonitor 560/tcp # rmonitord
+monitor 561/udp #
+monitor 561/tcp #
+chshell 562/udp # chcmd
+chshell 562/tcp # chcmd
+nntps 563/udp # nntp protocol over TLS/SSL (was snntp)
+nntps 563/tcp # nntp protocol over TLS/SSL (was snntp)
+# Kipp E.B. Hickman <kipp at netscape.com>
+9pfs 564/udp # plan 9 file service
+9pfs 564/tcp # plan 9 file service
+whoami 565/udp # whoami
+whoami 565/tcp # whoami
+streettalk 566/udp # streettalk
+streettalk 566/tcp # streettalk
+banyan-rpc 567/udp # banyan-rpc
+banyan-rpc 567/tcp # banyan-rpc
+# Tom Lemaire <toml at banyan.com>
+ms-shuttle 568/udp # microsoft shuttle
+ms-shuttle 568/tcp # microsoft shuttle
+# Rudolph Balaz <rudolphb at microsoft.com>
+ms-rome 569/udp # microsoft rome
+ms-rome 569/tcp # microsoft rome
+# Rudolph Balaz <rudolphb at microsoft.com>
+meter 570/udp # demon
+meter 570/tcp # demon
+meter 571/udp # udemon
+meter 571/tcp # udemon
+sonar 572/udp # sonar
+sonar 572/tcp # sonar
+# Keith Moore <moore at cs.utk.edu>
+banyan-vip 573/udp # banyan-vip
+banyan-vip 573/tcp # banyan-vip
+# Denis Leclerc <DLeclerc at banyan.com>
+ftp-agent 574/udp # FTP Software Agent System
+ftp-agent 574/tcp # FTP Software Agent System
+# Michael S. Greenberg <arnoff at ftp.com>
+vemmi 575/udp # VEMMI
+vemmi 575/tcp # VEMMI
+# Daniel Mavrakis <mavrakis at mctel.fr>
+ipcd 576/udp # ipcd
+ipcd 576/tcp # ipcd
+vnas 577/udp # vnas
+vnas 577/tcp # vnas
+ipdd 578/udp # ipdd
+ipdd 578/tcp # ipdd
+# Jay Farhat <jfarhat at ipass.com>
+decbsrv 579/udp # decbsrv
+decbsrv 579/tcp # decbsrv
+# Rudi Martin <movies::martin"@movies.enet.dec.com>
+sntp-heartbeat 580/udp # SNTP HEARTBEAT
+sntp-heartbeat 580/tcp # SNTP HEARTBEAT
+# Louis Mamakos <louie at uu.net>
+bdp 581/udp # Bundle Discovery Protocol
+bdp 581/tcp # Bundle Discovery Protocol
+# Gary Malkin <gmalkin at xylogics.com>
+scc-security 582/udp # SCC Security
+scc-security 582/tcp # SCC Security
+# Prashant Dholakia <prashant at semaphorecom.com>
+philips-vc 583/udp # Philips Video-Conferencing
+philips-vc 583/tcp # Philips Video-Conferencing
+# Janna Chang <janna at pmc.philips.com>
+keyserver 584/udp # Key Server
+keyserver 584/tcp # Key Server
+# Gary Howland <gary at systemics.com>
+imap4-ssl 585/udp # IMAP4+SSL (use 993 instead)
+imap4-ssl 585/tcp # IMAP4+SSL (use 993 instead)
+# Terry Gray <gray at cac.washington.edu>
+# Use of 585 is not recommended, use 993 instead
+password-chg 586/udp # Password Change
+password-chg 586/tcp # Password Change
+submission 587/udp # Submission
+submission 587/tcp # Submission
+# Randy Gellens <randy at qualcomm.com>
+cal 588/udp # CAL
+cal 588/tcp # CAL
+# Myron Hattig <Myron_Hattig at ccm.jf.intel.com>
+eyelink 589/udp # EyeLink
+eyelink 589/tcp # EyeLink
+# Dave Stampe <dstampe at psych.toronto.edu>
+tns-cml 590/udp # TNS CML
+tns-cml 590/tcp # TNS CML
+# Jerome Albin <albin at taec.enet.dec.com>
+http-alt 591/udp # FileMaker, Inc. - HTTP Alternate (see Port 80)
+http-alt 591/tcp # FileMaker, Inc. - HTTP Alternate (see Port 80)
+# Clay Maeckel <clay_maeckel at filemaker.com>
+eudora-set 592/udp # Eudora Set
+eudora-set 592/tcp # Eudora Set
+# Randall Gellens <randy at qualcomm.com>
+http-rpc-epmap 593/udp # HTTP RPC Ep Map
+http-rpc-epmap 593/tcp # HTTP RPC Ep Map
+# Edward Reus <edwardr at microsoft.com>
+tpip 594/udp # TPIP
+tpip 594/tcp # TPIP
+# Brad Spear <spear at platinum.com>
+cab-protocol 595/udp # CAB Protocol
+cab-protocol 595/tcp # CAB Protocol
+# Winston Hetherington
+smsd 596/udp # SMSD
+smsd 596/tcp # SMSD
+# Wayne Barlow <web at unx.dec.com>
+ptcnameservice 597/udp # PTC Name Service
+ptcnameservice 597/tcp # PTC Name Service
+# Yuri Machkasov <yuri at ptc.com>
+sco-websrvrmg3 598/udp # SCO Web Server Manager 3
+sco-websrvrmg3 598/tcp # SCO Web Server Manager 3
+# Simon Baldwin <simonb at sco.com>
+acp 599/udp # Aeolon Core Protocol
+acp 599/tcp # Aeolon Core Protocol
+# Michael Alyn Miller <malyn at aeolon.com>
+ipcserver 600/udp # Sun IPC server
+ipcserver 600/tcp # Sun IPC server
+# Bill Schiefelbein <schief at aspen.cray.com>
+syslog-conn 601/udp # Reliable Syslog Service
+syslog-conn 601/tcp # Reliable Syslog Service
+# RFC 3195
+xmlrpc-beep 602/udp # XML-RPC over BEEP
+xmlrpc-beep 602/tcp # XML-RPC over BEEP
+# RFC3529 <ftp://ftp.isi.edu/in-notes/rfc3529.txt> March 2003
+idxp 603/udp # IDXP
+idxp 603/tcp # IDXP
+# RFC-ietf-idwg-beep-idxp-07.txt
+tunnel 604/udp # TUNNEL
+tunnel 604/tcp # TUNNEL
+# RFC-ietf-idwg-beep-tunnel-05.txt
+soap-beep 605/udp # SOAP over BEEP
+soap-beep 605/tcp # SOAP over BEEP
+# RFC3288 <ftp://ftp.isi.edu/in-notes/rfc3288.txt> April 2002
+urm 606/udp # Cray Unified Resource Manager
+urm 606/tcp # Cray Unified Resource Manager
+nqs 607/udp # nqs
+nqs 607/tcp # nqs
+# Bill Schiefelbein <schief at aspen.cray.com>
+sift-uft 608/udp # Sender-Initiated/Unsolicited File Transfer
+sift-uft 608/tcp # Sender-Initiated/Unsolicited File Transfer
+# Rick Troth <troth at rice.edu>
+npmp-trap 609/udp # npmp-trap
+npmp-trap 609/tcp # npmp-trap
+npmp-local 610/udp # npmp-local
+npmp-local 610/tcp # npmp-local
+npmp-gui 611/udp # npmp-gui
+npmp-gui 611/tcp # npmp-gui
+# John Barnes <jbarnes at crl.com>
+hmmp-ind 612/udp # HMMP Indication
+hmmp-ind 612/tcp # HMMP Indication
+hmmp-op 613/udp # HMMP Operation
+hmmp-op 613/tcp # HMMP Operation
+# Andrew Sinclair <andrsin at microsoft.com>
+sshell 614/udp # SSLshell
+sshell 614/tcp # SSLshell
+# Simon J. Gerraty <sjg at quick.com.au>
+sco-inetmgr 615/udp # Internet Configuration Manager
+sco-inetmgr 615/tcp # Internet Configuration Manager
+sco-sysmgr 616/udp # SCO System Administration Server
+sco-sysmgr 616/tcp # SCO System Administration Server
+sco-dtmgr 617/udp # SCO Desktop Administration Server
+sco-dtmgr 617/tcp # SCO Desktop Administration Server
+# Christopher Durham <chrisdu at sco.com>
+dei-icda 618/udp # DEI-ICDA
+dei-icda 618/tcp # DEI-ICDA
+# David Turner <digital at Quetico.tbaytel.net>
+compaq-evm 619/udp # Compaq EVM
+compaq-evm 619/tcp # Compaq EVM
+# Jem Treadwell <Jem.Treadwell at compaq.com>
+sco-websrvrmgr 620/udp # SCO WebServer Manager
+sco-websrvrmgr 620/tcp # SCO WebServer Manager
+# Christopher Durham <chrisdu at sco.com>
+escp-ip 621/udp # ESCP
+escp-ip 621/tcp # ESCP
+# Lai Zit Seng <lzs at pobox.com>
+collaborator 622/udp # Collaborator
+collaborator 622/tcp # Collaborator
+# Johnson Davis <johnsond at opteamasoft.com>
+asf-rmcp 623/udp # ASF Remote Management and Control Protocol
+asf-rmcp 623/tcp # ASF Remote Management and Control Protocol
+# Carl First <Carl.L.First at intel.com>
+cryptoadmin 624/udp # Crypto Admin
+cryptoadmin 624/tcp # Crypto Admin
+# Tony Walker <tony at cryptocard.com>
+dec_dlm 625/udp # DEC DLM
+dec_dlm 625/tcp # DEC DLM
+# Rudi Martin <Rudi.Martin at edo.mts.dec.com>
+asia 626/udp # ASIA
+asia 626/tcp # ASIA
+# Michael Dasenbrock <dasenbro at apple.com>
+passgo-tivoli 627/udp # PassGo Tivoli
+passgo-tivoli 627/tcp # PassGo Tivoli
+# Chris Hall <chall at passgo.com>
+qmqp 628/udp # QMQP
+qmqp 628/tcp # QMQP
+# Dan Bernstein <djb at cr.yp.to>
+3com-amp3 629/udp # 3Com AMP3
+3com-amp3 629/tcp # 3Com AMP3
+# Prakash Banthia <prakash_banthia at 3com.com>
+rda 630/udp # RDA
+rda 630/tcp # RDA
+# John Hadjioannou <john at minster.co.uk>
+ipp 631/udp # IPP (Internet Printing Protocol)
+ipp 631/tcp # IPP (Internet Printing Protocol)
+# Carl-Uno Manros <manros at cp10.es.xerox.com>
+bmpp 632/udp # bmpp
+bmpp 632/tcp # bmpp
+# Troy Rollo <troy at kroll.corvu.com.au>
+servstat 633/udp # Service Status update (Sterling Software)
+servstat 633/tcp # Service Status update (Sterling Software)
+# Greg Rose <Greg_Rose at sydney.sterling.com>
+ginad 634/udp # ginad
+ginad 634/tcp # ginad
+# Mark Crother <mark at eis.calstate.edu>
+rlzdbase 635/udp # RLZ DBase
+rlzdbase 635/tcp # RLZ DBase
+# Michael Ginn <ginn at tyxar.com>
+ldaps 636/udp # ldap protocol over TLS/SSL (was sldap)
+ldaps 636/tcp # ldap protocol over TLS/SSL (was sldap)
+# Pat Richard <patr at xcert.com>
+lanserver 637/udp # lanserver
+lanserver 637/tcp # lanserver
+# Chris Larsson <clarsson at VNET.IBM.COM>
+mcns-sec 638/udp # mcns-sec
+mcns-sec 638/tcp # mcns-sec
+# Kaz Ozawa <k.ozawa at cablelabs.com>
+msdp 639/udp # MSDP
+msdp 639/tcp # MSDP
+# Dino Farinacci <dino at cisco.com>
+entrust-sps 640/udp # entrust-sps
+entrust-sps 640/tcp # entrust-sps
+# Marek Buchler <Marek.Buchler at entrust.com>
+repcmd 641/udp # repcmd
+repcmd 641/tcp # repcmd
+# Scott Dale <scott at Replicase.com>
+esro-emsdp 642/udp # ESRO-EMSDP V1.3
+esro-emsdp 642/tcp # ESRO-EMSDP V1.3
+# Mohsen Banan <mohsen at neda.com>
+sanity 643/udp # SANity
+sanity 643/tcp # SANity
+# Peter Viscarola <PeterGV at osr.com>
+dwr 644/udp # dwr
+dwr 644/tcp # dwr
+# Bill Fenner <fenner at parc.xerox.com>
+pssc 645/udp # PSSC
+pssc 645/tcp # PSSC
+# Egon Meier-Engelen <egon.meier-engelen at dlr.de>
+ldp 646/udp # LDP
+ldp 646/tcp # LDP
+# Bob Thomas <rhthomas at cisco.com>
+dhcp-failover 647/udp # DHCP Failover
+dhcp-failover 647/tcp # DHCP Failover
+# Bernard Volz <volz at ipworks.com>
+rrp 648/udp # Registry Registrar Protocol (RRP)
+rrp 648/tcp # Registry Registrar Protocol (RRP)
+# Scott Hollenbeck <shollenb at netsol.com>
+cadview-3d 649/udp # Cadview-3d - streaming 3d models over the internet
+cadview-3d 649/tcp # Cadview-3d - streaming 3d models over the internet
+# David Cooper <david.cooper at oracle.com>
+obex 650/udp # OBEX
+obex 650/tcp # OBEX
+# Jeff Garbers <FJG030 at email.mot.com>
+ieee-mms 651/udp # IEEE MMS
+ieee-mms 651/tcp # IEEE MMS
+# Curtis Anderson <canderson at turbolinux.com>
+hello-port 652/udp # HELLO_PORT
+hello-port 652/tcp # HELLO_PORT
+# Patrick Cipiere <Patrick.Cipiere at UDcast.com>
+repscmd 653/udp # RepCmd
+repscmd 653/tcp # RepCmd
+# Scott Dale <scott at tioga.com>
+aodv 654/udp # AODV
+aodv 654/tcp # AODV
+# Charles Perkins <cperkins at eng.sun.com>
+tinc 655/udp # TINC
+tinc 655/tcp # TINC
+# Ivo Timmermans <itimmermans at bigfoot.com>
+spmp 656/udp # SPMP
+spmp 656/tcp # SPMP
+# Jakob Kaivo <jkaivo at nodomainname.net>
+rmc 657/udp # RMC
+rmc 657/tcp # RMC
+# Michael Schmidt <mmaass at us.ibm.com>
+tenfold 658/udp # TenFold
+tenfold 658/tcp # TenFold
+# Louis Olszyk <lolszyk at 10fold.com>
+# 659 Removed (2001-06-06)
+mac-srvr-admin 660/udp # MacOS Server Admin
+mac-srvr-admin 660/tcp # MacOS Server Admin
+# Forest Hill <forest at apple.com>
+hap 661/udp # HAP
+hap 661/tcp # HAP
+# Igor Plotnikov <igor at uroam.com>
+pftp 662/udp # PFTP
+pftp 662/tcp # PFTP
+# Ben Schluricke <support at pftp.de>
+purenoise 663/udp # PureNoise
+purenoise 663/tcp # PureNoise
+# Sam Osa <pristine at mailcity.com>
+asf-secure-rmcp 664/udp # ASF Secure Remote Management and Control Protocol
+asf-secure-rmcp 664/tcp # ASF Secure Remote Management and Control Protocol
+# Carl First <Carl.L.First at intel.com>
+sun-dr 665/udp # Sun DR
+sun-dr 665/tcp # Sun DR
+# Harinder Bhasin <Harinder.Bhasin at Sun.COM>
+mdqs 666/udp doom #
+mdqs 666/tcp doom #
+# <ddt at idcube.idsoftware.com>
+disclose 667/udp # campaign contribution disclosures - SDR Technologies
+disclose 667/tcp # campaign contribution disclosures - SDR Technologies
+# Jim Dixon <jim at lambda.com>
+mecomm 668/udp # MeComm
+mecomm 668/tcp # MeComm
+meregister 669/udp # MeRegister
+meregister 669/tcp # MeRegister
+# Armin Sawusch <armin at esd1.esd.de>
+vacdsm-sws 670/udp # VACDSM-SWS
+vacdsm-sws 670/tcp # VACDSM-SWS
+vacdsm-app 671/udp # VACDSM-APP
+vacdsm-app 671/tcp # VACDSM-APP
+vpps-qua 672/udp # VPPS-QUA
+vpps-qua 672/tcp # VPPS-QUA
+cimplex 673/udp # CIMPLEX
+cimplex 673/tcp # CIMPLEX
+# Ulysses G. Smith Jr. <ugsmith at cesi.com>
+acap 674/udp # ACAP
+acap 674/tcp # ACAP
+# Chris Newman <chris.newman at sun.com>
+dctp 675/udp # DCTP
+dctp 675/tcp # DCTP
+# Andre Kramer <Andre.Kramer at ansa.co.uk>
+vpps-via 676/udp # VPPS Via
+vpps-via 676/tcp # VPPS Via
+# Ulysses G. Smith Jr. <ugsmith at cesi.com>
+vpp 677/udp # Virtual Presence Protocol
+vpp 677/tcp # Virtual Presence Protocol
+# Klaus Wolf <wolf at cobrow.com>
+ggf-ncp 678/udp # GNU Generation Foundation NCP
+ggf-ncp 678/tcp # GNU Generation Foundation NCP
+# Noah Paul <noahp at altavista.net>
+mrm 679/udp # MRM
+mrm 679/tcp # MRM
+# Liming Wei <lwei at cisco.com>
+entrust-aaas 680/udp # entrust-aaas
+entrust-aaas 680/tcp # entrust-aaas
+entrust-aams 681/udp # entrust-aams
+entrust-aams 681/tcp # entrust-aams
+# Adrian Mancini <adrian.mancini at entrust.com>
+xfr 682/udp # XFR
+xfr 682/tcp # XFR
+# Noah Paul <noahp at ultranet.com>
+corba-iiop 683/udp # CORBA IIOP
+corba-iiop 683/tcp # CORBA IIOP
+corba-iiop-ssl 684/udp # CORBA IIOP SSL
+corba-iiop-ssl 684/tcp # CORBA IIOP SSL
+# Henry Lowe <lowe at omg.org>
+mdc-portmapper 685/udp # MDC Port Mapper
+mdc-portmapper 685/tcp # MDC Port Mapper
+# Noah Paul <noahp at altavista.net>
+hcp-wismar 686/udp # Hardware Control Protocol Wismar
+hcp-wismar 686/tcp # Hardware Control Protocol Wismar
+# David Merchant <d.f.merchant at livjm.ac.uk>
+asipregistry 687/udp # asipregistry
+asipregistry 687/tcp # asipregistry
+# Erik Sea <sea at apple.com>
+realm-rusd 688/udp # REALM-RUSD
+realm-rusd 688/tcp # REALM-RUSD
+# Jerry Knight <jknight at realminfo.com>
+nmap 689/udp # NMAP
+nmap 689/tcp # NMAP
+# Peter Dennis Bartok <peter at novonyx.com>
+vatp 690/udp # VATP
+vatp 690/tcp # VATP
+# Atica Software <comercial at aticasoft.es>
+msexch-routing 691/udp # MS Exchange Routing
+msexch-routing 691/tcp # MS Exchange Routing
+# David Lemson <dlemson at microsoft.com>
+hyperwave-isp 692/udp # Hyperwave-ISP
+hyperwave-isp 692/tcp # Hyperwave-ISP
+# Gerald Mesaric <gmesaric at hyperwave.com>
+connendp 693/udp # connendp
+connendp 693/tcp # connendp
+# Ronny Bremer <rbremer at future-gate.com>
+ha-cluster 694/udp # ha-cluster
+ha-cluster 694/tcp # ha-cluster
+# Alan Robertson <alanr at unix.sh>
+ieee-mms-ssl 695/udp # IEEE-MMS-SSL
+ieee-mms-ssl 695/tcp # IEEE-MMS-SSL
+# Curtis Anderson <ecanderson at turbolinux.com>
+rushd 696/udp # RUSHD
+rushd 696/tcp # RUSHD
+# Greg Ercolano <erco at netcom.com>
+uuidgen 697/udp # UUIDGEN
+uuidgen 697/tcp # UUIDGEN
+# James Falkner <james.falkner at sun.com>
+olsr 698/udp # OLSR
+olsr 698/tcp # OLSR
+# Thomas Clausen <thomas.clausen at inria.fr>
+accessnetwork 699/udp # Access Network
+accessnetwork 699/tcp # Access Network
+# Yingchun Xu <Yingchun_Xu at 3com.com>
+# 700-703 Unassigned
+elcsd 704/udp # errlog copy/server daemon
+elcsd 704/tcp # errlog copy/server daemon
+agentx 705/udp # AgentX
+agentx 705/tcp # AgentX
+# Bob Natale <natale at acec.com>
+silc 706/udp # SILC
+silc 706/tcp # SILC
+# Pekka Riikonen <priikone at poseidon.pspt.fi>
+borland-dsj 707/udp # Borland DSJ
+borland-dsj 707/tcp # Borland DSJ
+# Gerg Cole <gcole at corp.borland.com>
+# 708 Unassigned
+entrust-kmsh 709/udp # Entrust Key Management Service Handler
+entrust-kmsh 709/tcp # Entrust Key Management Service Handler
+entrust-ash 710/udp # Entrust Administration Service Handler
+entrust-ash 710/tcp # Entrust Administration Service Handler
+# Peter Whittaker <pww at entrust.com>
+cisco-tdp 711/udp # Cisco TDP
+cisco-tdp 711/tcp # Cisco TDP
+# Bruce Davie <bsd at cisco.com>
+# 712-728 Unassigned
+netviewdm1 729/udp # IBM NetView DM/6000 Server/Client
+netviewdm1 729/tcp # IBM NetView DM/6000 Server/Client
+netviewdm2 730/udp # IBM NetView DM/6000 send/tcp
+netviewdm2 730/tcp # IBM NetView DM/6000 send/tcp
+netviewdm3 731/udp # IBM NetView DM/6000 receive/tcp
+netviewdm3 731/tcp # IBM NetView DM/6000 receive/tcp
+# Philippe Binet (phbinet at vnet.IBM.COM)
+# 732-740 Unassigned
+netgw 741/udp # netGW
+netgw 741/tcp # netGW
+# Oliver Korfmacher (okorf at netcs.com)
+netrcs 742/udp # Network based Rev. Cont. Sys.
+netrcs 742/tcp # Network based Rev. Cont. Sys.
+# Gordon C. Galligher <gorpong at ping.chi.il.us>
+# 743 Unassigned
+flexlm 744/udp # Flexible License Manager
+flexlm 744/tcp # Flexible License Manager
+# Matt Christiano
+# <globes at matt@oliveb.atc.olivetti.com>
+# 745-746 Unassigned
+fujitsu-dev 747/udp # Fujitsu Device Control
+fujitsu-dev 747/tcp # Fujitsu Device Control
+ris-cm 748/udp # Russell Info Sci Calendar Manager
+ris-cm 748/tcp # Russell Info Sci Calendar Manager
+kerberos-adm 749/udp # kerberos administration
+kerberos-adm 749/tcp # kerberos administration
+loadav 750/udp kerberos-iv #
+rfile 750/tcp #
+# Martin Hamilton <martin at mrrl.lut.as.uk>
+pump 751/udp #
+pump 751/tcp #
+qrh 752/udp #
+qrh 752/tcp #
+rrh 753/udp #
+rrh 753/tcp #
+tell 754/udp # send
+tell 754/tcp # send
+# Josyula R. Rao <jrrao at watson.ibm.com>
+# 755-756 Unassigned
+nlogin 758/udp #
+nlogin 758/tcp #
+con 759/udp #
+con 759/tcp #
+ns 760/udp #
+ns 760/tcp #
+rxe 761/udp #
+rxe 761/tcp #
+quotad 762/udp #
+quotad 762/tcp #
+cycleserv 763/udp #
+cycleserv 763/tcp #
+omserv 764/udp #
+omserv 764/tcp #
+webster 765/udp #
+webster 765/tcp #
+# Josyula R. Rao <jrrao at watson.ibm.com>
+# 766 Unassigned
+phonebook 767/udp # phone
+phonebook 767/tcp # phone
+# Josyula R. Rao <jrrao at watson.ibm.com>
+# 768 Unassigned
+vid 769/udp #
+vid 769/tcp #
+cadlock 770/udp #
+cadlock 770/tcp #
+rtip 771/udp #
+rtip 771/tcp #
+cycleserv2 772/udp #
+cycleserv2 772/tcp #
+notify 773/udp #
+submit 773/tcp #
+acmaint_dbd 774/udp #
+rpasswd 774/tcp #
+acmaint_transd 775/udp #
+entomb 775/tcp #
+wpages 776/udp #
+wpages 776/tcp #
+# Josyula R. Rao <jrrao at watson.ibm.com>
+multiling-http 777/udp # Multiling HTTP
+multiling-http 777/tcp # Multiling HTTP
+# Alejandro Bonet <babel at ctv.es>
+# 778-779 Unassigned
+wpgs 780/udp #
+wpgs 780/tcp #
+# Josyula R. Rao <jrrao at watson.ibm.com>
+# 781-785 Unassigned
+# 786 Unassigned (Removed 2002-05-08)
+# 787 Unassigned (Removed 2002-10-08)
+# 788-799 Unassigned
+mdbs_daemon 800/udp #
+mdbs_daemon 800/tcp #
+device 801/udp #
+device 801/tcp #
+# 802-809 Unassigned
+fcp-udp 810/udp # FCP Datagram
+fcp-udp 810/tcp # FCP
+# Paul Whittemore <paul at softarc.com>
+# 811-827 Unassigned
+itm-mcell-s 828/udp # itm-mcell-s
+itm-mcell-s 828/tcp # itm-mcell-s
+# Miles O'Neal <meo at us.itmasters.com>
+pkix-3-ca-ra 829/udp # PKIX-3 CA/RA
+pkix-3-ca-ra 829/tcp # PKIX-3 CA/RA
+# Carlisle Adams <Cadams at entrust.com>
+# 830-846 Unassigned
+dhcp-failover2 847/udp # dhcp-failover 2
+dhcp-failover2 847/tcp # dhcp-failover 2
+# Bernard Volz <volz at ipworks.com>
+gdoi 848/udp # GDOI
+gdoi 848/tcp # GDOI
+# RFC-ietf-msec-gdoi-07.txt
+# 849-859 Unassigned
+iscsi 860/udp # iSCSI
+iscsi 860/tcp # iSCSI
+# RFC-draft-ietf-ips-iscsi-20.txt
+# 861-872 Unassigned
+rsync 873/udp # rsync
+rsync 873/tcp # rsync
+# Andrew Tridgell <tridge at samba.anu.edu.au>
+# 874-885 Unassigned
+iclcnet-locate 886/udp # ICL coNETion locate server
+iclcnet-locate 886/tcp # ICL coNETion locate server
+# Bob Lyon <bl at oasis.icl.co.uk>
+iclcnet_svinfo 887/udp # ICL coNETion server info
+iclcnet_svinfo 887/tcp # ICL coNETion server info
+# Bob Lyon <bl at oasis.icl.co.uk>
+accessbuilder 888/udp # AccessBuilder
+accessbuilder 888/tcp # AccessBuilder
+# Steve Sweeney <Steven_Sweeney at 3mail.3com.com>
+# The following entry records an unassigned but widespread use
+cddbp 888/tcp # CD Database Protocol
+# Steve Scherf <steve at moonsoft.com>
+#
+# 889-899 Unassigned
+omginitialrefs 900/udp # OMG Initial Refs
+omginitialrefs 900/tcp # OMG Initial Refs
+# Christian Callsen <Christian.Callsen at eng.sun.com>
+smpnameres 901/udp # SMPNAMERES
+smpnameres 901/tcp # SMPNAMERES
+# Leif Ekblad <leif at rdos.net>
+ideafarm-chat 902/udp # IDEAFARM-CHAT
+ideafarm-chat 902/tcp # IDEAFARM-CHAT
+ideafarm-catch 903/udp # IDEAFARM-CATCH
+ideafarm-catch 903/tcp # IDEAFARM-CATCH
+# Wo'o Ideafarm <wo at ideafarm.com>
+# 904-910 Unassigned
+xact-backup 911/udp # xact-backup
+xact-backup 911/tcp # xact-backup
+# Bill Carroll <billc at xactlabs.com>
+apex-mesh 912/udp # APEX relay-relay service
+apex-mesh 912/tcp # APEX relay-relay service
+apex-edge 913/udp # APEX endpoint-relay service
+apex-edge 913/tcp # APEX endpoint-relay service
+# [RFC3340]
+# 914-988 Unassigned
+ftps-data 989/udp # ftp protocol, data, over TLS/SSL
+ftps-data 989/tcp # ftp protocol, data, over TLS/SSL
+ftps 990/udp # ftp protocol, control, over TLS/SSL
+ftps 990/tcp # ftp protocol, control, over TLS/SSL
+# Christopher Allen <ChristopherA at consensus.com>
+nas 991/udp # Netnews Administration System
+nas 991/tcp # Netnews Administration System
+# Vera Heinau <heinau at fu-berlin.de>
+# Heiko Schlichting <heiko at fu-berlin.de>
+telnets 992/udp # telnet protocol over TLS/SSL
+telnets 992/tcp # telnet protocol over TLS/SSL
+imaps 993/udp # imap4 protocol over TLS/SSL
+imaps 993/tcp # imap4 protocol over TLS/SSL
+ircs 994/udp # irc protocol over TLS/SSL
+ircs 994/tcp # irc protocol over TLS/SSL
+# Christopher Allen <ChristopherA at consensus.com>
+pop3s 995/udp # pop3 protocol over TLS/SSL (was spop3)
+pop3s 995/tcp # pop3 protocol over TLS/SSL (was spop3)
+# Gordon Mangione <gordm at microsoft.com>
+vsinet 996/udp # vsinet
+vsinet 996/tcp # vsinet
+# Rob Juergens <robj at vsi.com>
+maitrd 997/udp #
+maitrd 997/tcp #
+puparp 998/udp #
+busboy 998/tcp #
+applix 999/udp puprouter # Applix ac
+garcon 999/tcp puprouter #
+cadlock2 1000/udp #
+cadlock2 1000/tcp #
+# 1001-1009 Unassigned
+# 1008/udp Possibly used by Sun Solaris????
+surf 1010/udp # surf
+surf 1010/tcp # surf
+# Joseph Geer <jgeer at peapod.com>
+# 1011-1022 Reserved
+ 1023/udp # Reserved
+ 1023/tcp # Reserved
+# IANA <iana at iana.org>
+ 1024/udp # Reserved
+ 1024/tcp # Reserved
+# IANA <iana at iana.org>
+#
+# REGISTERED PORT NUMBERS
+#
+blackjack 1025/udp # network blackjack
+blackjack 1025/tcp # network blackjack
+# Unknown contact
+cap 1026/udp # Calender Access Protocol
+cap 1026/tcp # Calender Access Protocol
+# Doug Royer <Doug at Royer.com> June 2002
+exosee 1027/udp # ExoSee
+exosee 1027/tcp # ExoSee
+# Chagdali Isamail <chagdali at free.fr> June 2003
+# 1028-1029 Unassigned
+iad1 1030/udp # BBN IAD
+iad1 1030/tcp # BBN IAD
+iad2 1031/udp # BBN IAD
+iad2 1031/tcp # BBN IAD
+iad3 1032/udp # BBN IAD
+iad3 1032/tcp # BBN IAD
+# Andy Malis <malis_a at timeplex.com>
+netinfo-local 1033/udp # local netinfo port
+netinfo-local 1033/tcp # local netinfo port
+# Marc Majka <majka at apple.com> August 2002
+activesync 1034/udp # ActiveSync Notifications
+activesync 1034/tcp # ActiveSync Notifications
+# Sandra Vargas <Sandrama at microsoft.com> March 2003
+mxxrlogin 1035/udp # MX-XR RPC
+mxxrlogin 1035/tcp # MX-XR RPC
+# Arnold E. Mauer <amauer at vrms.com> April 2003
+pcg-radar 1036/udp # RADAR Service Protocol
+pcg-radar 1036/tcp # RADAR Service Protocol
+# Steve Ravida <Steve at pcguru.com>
+# 1037-1039 Unassigned
+netarx 1040/udp # Netarx
+netarx 1040/tcp # Netarx
+# Fredrick Paul Eisele <phreed at netarx.com>
+# 1041-1044 Unassigned
+fpitp 1045/udp # Fingerprint Image Transfer Protocol
+fpitp 1045/tcp # Fingerprint Image Transfer Protocol
+# Steven Fields <sfields at identix.com> February 2002
+# 1046 Unassigned
+neod1 1047/udp # Sun's NEO Object Request Broker
+neod1 1047/tcp # Sun's NEO Object Request Broker
+neod2 1048/udp # Sun's NEO Object Request Broker
+neod2 1048/tcp # Sun's NEO Object Request Broker
+# Rohit Garg <rohit.garg at eng.sun.com>
+td-postman 1049/udp # Tobit David Postman VPMN
+td-postman 1049/tcp # Tobit David Postman VPMN
+# Franz-Josef Leuders <development at tobit.com>
+cma 1050/udp # CORBA Management Agent
+cma 1050/tcp # CORBA Management Agent
+# Ramy Zaarour <ramy at lumos.com>
+optima-vnet 1051/udp # Optima VNET
+optima-vnet 1051/tcp # Optima VNET
+# Ralf Doewich <ralf.doewich at optimatele.com>
+ddt 1052/udp # Dynamic DNS Tools
+ddt 1052/tcp # Dynamic DNS Tools
+# Remi Lefebvre <remi at debian.org>
+remote-as 1053/udp # Remote Assistant (RA)
+remote-as 1053/tcp # Remote Assistant (RA)
+# Roman Kriis <roman at previo.ee>
+brvread 1054/udp # BRVREAD
+brvread 1054/tcp # BRVREAD
+# Gilles Roussel <groussel at eu-symtrax.com>
+ansyslmd 1055/udp # ANSYS - License Manager
+ansyslmd 1055/tcp # ANSYS - License Manager
+# Suzanne Lorrin <suzanne.lorrin at ansys.com>
+vfo 1056/udp # VFO
+vfo 1056/tcp # VFO
+# Anthony Gonzalez <agonzal1 at telcordia.com>
+startron 1057/udp # STARTRON
+startron 1057/tcp # STARTRON
+# Markus Sabadello <sabadello at startron.org>
+nim 1058/udp # nim
+nim 1058/tcp # nim
+nimreg 1059/udp # nimreg
+nimreg 1059/tcp # nimreg
+# Robert Gordon <rbg at austin.ibm.com>
+polestar 1060/udp # POLESTAR
+polestar 1060/tcp # POLESTAR
+# Masakuni Okada <masakuni at jp.ibm.com>
+kiosk 1061/udp # KIOSK
+kiosk 1061/tcp # KIOSK
+# Howard Buck <hbuck at maytag.com>
+veracity 1062/udp # Veracity
+veracity 1062/tcp # Veracity
+# Ross Williams <ross at rocksoft.com>
+kyoceranetdev 1063/udp # KyoceraNetDev
+kyoceranetdev 1063/tcp # KyoceraNetDev
+# Shigenaka Kanemitsu
+# <Shigenaka_Kanemitsu at ypd.kyocera.co.jp>
+jstel 1064/udp # JSTEL
+jstel 1064/tcp # JSTEL
+# Duane Kiser <dkiser at jsexpress.com>
+syscomlan 1065/udp # SYSCOMLAN
+syscomlan 1065/tcp # SYSCOMLAN
+# Urs Ryf <urs.ryf at selectron.ch>
+fpo-fns 1066/udp # FPO-FNS
+fpo-fns 1066/tcp # FPO-FNS
+# Jens Klose <jklose at intercope.com>
+instl_boots 1067/udp # Installation Bootstrap Proto. Serv.
+instl_boots 1067/tcp # Installation Bootstrap Proto. Serv.
+instl_bootc 1068/udp # Installation Bootstrap Proto. Cli.
+instl_bootc 1068/tcp # Installation Bootstrap Proto. Cli.
+# David Arko <darko at hpfcrn.fc.hp.com>
+cognex-insight 1069/udp # COGNEX-INSIGHT
+cognex-insight 1069/tcp # COGNEX-INSIGHT
+# Steve Olson <solson at cognex.com>
+gmrupdateserv 1070/udp # GMRUpdateSERV
+gmrupdateserv 1070/tcp # GMRUpdateSERV
+# Steve Kellogg <stevekellogg at mezzogmr.com>
+bsquare-voip 1071/udp # BSQUARE-VOIP
+bsquare-voip 1071/tcp # BSQUARE-VOIP
+# Yen Lee <YenL at bsquare.com>
+cardax 1072/udp # CARDAX
+cardax 1072/tcp # CARDAX
+# Charles Oram <charleso at cardax.com>
+bridgecontrol 1073/udp # Bridge Control
+bridgecontrol 1073/tcp # Bridge Control
+# Andy Heron <btexact.ports at bt.com>
+fastechnologlm 1074/udp # FASTechnologies License Manager
+fastechnologlm 1074/tcp # FASTechnologies License Manager
+# Robert C. Henningsgard
+# <rhenn at fastechnologies.com>
+rdrmshc 1075/udp # RDRMSHC
+rdrmshc 1075/tcp # RDRMSHC
+# Ericko Shimada <eriko at kel.fujitsu.co.jp>
+dab-sti-c 1076/udp # DAB STI-C
+dab-sti-c 1076/tcp # DAB STI-C
+# World DAB <worlddab_irc at worlddab.org>
+imgames 1077/udp # IMGames
+imgames 1077/tcp # IMGames
+# Jean A. Ames <engr-admin at flipside.com>
+avocent-proxy 1078/udp # Avocent Proxy Protocol
+avocent-proxy 1078/tcp # Avocent Proxy Protocol
+# Steven W. Clark <steven.clark at avocent.com>
+asprovatalk 1079/udp # ASPROVATalk
+asprovatalk 1079/tcp # ASPROVATalk
+# Chiew Farn Chung <cfchung at asprova.com>
+socks 1080/udp # Socks
+socks 1080/tcp # Socks
+# Ying-Da Lee <ylee at syl.dl.nec.com
+pvuniwien 1081/udp # PVUNIWIEN
+pvuniwien 1081/tcp # PVUNIWIEN
+# Peter Lipp >Peter.Lipp at iaik.at>
+amt-esd-prot 1082/udp # AMT-ESD-PROT
+amt-esd-prot 1082/tcp # AMT-ESD-PROT
+# AMTEC S.p.A <sp.amtec at interbusiness.it>
+ansoft-lm-1 1083/udp # Anasoft License Manager
+ansoft-lm-1 1083/tcp # Anasoft License Manager
+ansoft-lm-2 1084/udp # Anasoft License Manager
+ansoft-lm-2 1084/tcp # Anasoft License Manager
+webobjects 1085/udp # Web Objects
+webobjects 1085/tcp # Web Objects
+# Andy Belk <abelk at apple.com>
+cplscrambler-lg 1086/udp # CPL Scrambler Logging
+cplscrambler-lg 1086/tcp # CPL Scrambler Logging
+cplscrambler-in 1087/udp # CPL Scrambler Internal
+cplscrambler-in 1087/tcp # CPL Scrambler Internal
+cplscrambler-al 1088/udp # CPL Scrambler Alarm Log
+cplscrambler-al 1088/tcp # CPL Scrambler Alarm Log
+# Richard Corn <rac at racc.com>
+ff-annunc 1089/udp # FF Annunciation
+ff-annunc 1089/tcp # FF Annunciation
+ff-fms 1090/udp # FF Fieldbus Message Specification
+ff-fms 1090/tcp # FF Fieldbus Message Specification
+ff-sm 1091/udp # FF System Management
+ff-sm 1091/tcp # FF System Management
+# Fieldbus Foundation <dave.glanzer at fieldbus.org>
+obrpd 1092/udp # Open Business Reporting Protocol
+obrpd 1092/tcp # Open Business Reporting Protocol
+# William Randolph Royere III
+# <william at royere.net>
+proofd 1093/udp # PROOFD
+proofd 1093/tcp # PROOFD
+rootd 1094/udp # ROOTD
+rootd 1094/tcp # ROOTD
+# Fons Rademakers <Fons.Rademakers at cern.ch>
+nicelink 1095/udp # NICELink
+nicelink 1095/tcp # NICELink
+# Jordi Lisbona <jlisbona at tango04.net>
+cnrprotocol 1096/udp # Common Name Resolution Protocol
+cnrprotocol 1096/tcp # Common Name Resolution Protocol
+# Michael Mealling <michaelm at netsol.com>
+sunclustermgr 1097/udp # Sun Cluster Manager
+sunclustermgr 1097/tcp # Sun Cluster Manager
+# Ashit Patel <Ashit.Patel at eng.Sun.COM>
+rmiactivation 1098/udp # RMI Activation
+rmiactivation 1098/tcp # RMI Activation
+rmiregistry 1099/udp # RMI Registry
+rmiregistry 1099/tcp # RMI Registry
+# Mark Hodapp <mark.hodapp at sun.com>
+mctp 1100/udp # MCTP
+mctp 1100/tcp # MCTP
+# Vitaly Revsin <vitaly at webmanage.com>
+pt2-discover 1101/udp # PT2-DISCOVER
+pt2-discover 1101/tcp # PT2-DISCOVER
+# Ralph Kammerlander
+# <ralph.kammerlander at khe.siemens.de>
+adobeserver-1 1102/udp # ADOBE SERVER 1
+adobeserver-1 1102/tcp # ADOBE SERVER 1
+adobeserver-2 1103/udp # ADOBE SERVER 2
+adobeserver-2 1103/tcp # ADOBE SERVER 2
+# Frank Soetebeer <frsoeteb at adobe.com>
+xrl 1104/udp # XRL
+xrl 1104/tcp # XRL
+# Patrick Robinson <probinson at plosive.com>
+ftranhc 1105/udp # FTRANHC
+ftranhc 1105/tcp # FTRANHC
+# Eriko Shimada <eriko at kel.fujitsu.co.jp>
+isoipsigport-1 1106/udp # ISOIPSIGPORT-1
+isoipsigport-1 1106/tcp # ISOIPSIGPORT-1
+isoipsigport-2 1107/udp # ISOIPSIGPORT-2
+isoipsigport-2 1107/tcp # ISOIPSIGPORT-2
+# Peter Egli <peter.egli at inalp.com>
+ratio-adp 1108/udp # ratio-adp
+ratio-adp 1108/tcp # ratio-adp
+# Oliver Thulke <oth at ratio.de>
+# 1109 Reserved - IANA
+nfsd-keepalive 1110/udp # Client status info
+nfsd-status 1110/tcp # Cluster status info
+# Edgar Circenis <ec at hpfclj.fc.hp.com>
+lmsocialserver 1111/udp # LM Social Server
+lmsocialserver 1111/tcp # LM Social Server
+# Ron Lussier <coyote at likeminds.com>
+icp 1112/udp # Intelligent Communication Protocol
+icp 1112/tcp # Intelligent Communication Protocol
+# Mark H. David <mhd at gensym.com>
+# 1113 Unassigned
+mini-sql 1114/udp # Mini SQL
+mini-sql 1114/tcp # Mini SQL
+# David Hughes <bambi at Hughes.com.au>
+ardus-trns 1115/udp # ARDUS Transfer
+ardus-trns 1115/tcp # ARDUS Transfer
+ardus-cntl 1116/udp # ARDUS Control
+ardus-cntl 1116/tcp # ARDUS Control
+ardus-mtrns 1117/udp # ARDUS Multicast Transfer
+ardus-mtrns 1117/tcp # ARDUS Multicast Transfer
+# Shinya Abe <abeabe at pfu.co.jp>
+# 1118-1121 Unassigned
+availant-mgr 1122/udp # availant-mgr
+availant-mgr 1122/tcp # availant-mgr
+# Steven Pelletier <stevep at Availant.com>
+murray 1123/udp # Murray
+murray 1123/tcp # Murray
+# Stu Mark <fordii at j51.com>
+# 1124-1154 Unassigned
+nfa 1155/udp # Network File Access
+nfa 1155/tcp # Network File Access
+# James Powell <james at mailhost.unidata.com>
+# 1156-1160 Unassigned
+health-polling 1161/udp # Health Polling
+health-polling 1161/tcp # Health Polling
+health-trap 1162/udp # Health Trap
+health-trap 1162/tcp # Health Trap
+# 1163-1167 Unassigned
+vchat 1168/udp # VChat Conference Service
+vchat 1168/tcp # VChat Conference Service
+# Andreas Wetzel <mickey at enforcer.cc> September 2002
+tripwire 1169/udp # TRIPWIRE
+tripwire 1169/tcp # TRIPWIRE
+# Ed Metcalf <emetcalf at tripwiresecurity.com>
+# Albert Holt <alberth at triosoftware.com>
+# 1170-1179 Unassigned
+mc-client 1180/udp # Millicent Client Proxy
+mc-client 1180/tcp # Millicent Client Proxy
+# Steve Glassman <steveg at pa.dec.com>
+# 1181-1182 Unassigned
+llsurfup-http 1183/udp # LL Surfup HTTP
+llsurfup-http 1183/tcp # LL Surfup HTTP
+llsurfup-https 1184/udp # LL Surfup HTTPS
+llsurfup-https 1184/tcp # LL Surfup HTTPS
+# Katy Lynn McCullough <KatyM at LapLink.com>
+catchpole 1185/udp # Catchpole port
+catchpole 1185/tcp # Catchpole port
+# Christian Catchpole <christian at catchpole.net> March 2002
+# 1186-1187 Unassigned
+hp-webadmin 1188/udp # HP Web Admin
+hp-webadmin 1188/tcp # HP Web Admin
+# Lance Kind <lance_kind at hp.com>
+# 1189-1198 Unassigned
+dmidi 1199/udp # DMIDI
+dmidi 1199/tcp # DMIDI
+# Phil Kerr <phil at plus24.com> February 2002
+scol 1200/udp # SCOL
+scol 1200/tcp # SCOL
+# Cryo-Networks <p.favre at cryo-networks.fr>
+nucleus-sand 1201/udp # Nucleus Sand
+nucleus-sand 1201/tcp # Nucleus Sand
+# James Marsh <James.Marsh at sandtechnology.com>
+caiccipc 1202/udp # caiccipc
+caiccipc 1202/tcp # caiccipc
+# Vince Re <Vincent.Re at cai.com>
+ssslic-mgr 1203/udp # License Validation
+ssslic-mgr 1203/tcp # License Validation
+ssslog-mgr 1204/udp # Log Request Listener
+ssslog-mgr 1204/tcp # Log Request Listener
+# Eric Bruno <ebruno at solution-soft.com>
+accord-mgc 1205/udp # Accord-MGC
+accord-mgc 1205/tcp # Accord-MGC
+# Roni Even <roni_e at accord.co.il>
+anthony-data 1206/udp # Anthony Data
+anthony-data 1206/tcp # Anthony Data
+# Paul Dollemore <pauld at anthonydata.com>
+metasage 1207/udp # MetaSage
+metasage 1207/tcp # MetaSage
+# Peter Anvelt <panvelt at xnai.com>
+seagull-ais 1208/udp # SEAGULL AIS
+seagull-ais 1208/tcp # SEAGULL AIS
+# Lee Breisacher <lbreisacher at seagullsw.com>
+ipcd3 1209/udp # IPCD3
+ipcd3 1209/tcp # IPCD3
+# Mark Ciskey <mlciskey at plato.com>
+eoss 1210/udp # EOSS
+eoss 1210/tcp # EOSS
+# Robert Armes <rarmes at axarte.com>
+groove-dpp 1211/udp # Groove DPP
+groove-dpp 1211/tcp # Groove DPP
+# Ken Moore <kmoore at groove.net>
+lupa 1212/udp # lupa
+lupa 1212/tcp # lupa
+# Barney Wolff <barney at databus.com>
+mpc-lifenet 1213/udp # MPC LIFENET
+mpc-lifenet 1213/tcp # MPC LIFENET
+# Ward Silver <hwardsil at wolfenet.com>
+kazaa 1214/udp # KAZAA
+kazaa 1214/tcp # KAZAA
+# Ahti Heinla <ahti at ahti.bluemoon.ee>
+scanstat-1 1215/udp # scanSTAT 1.0
+scanstat-1 1215/tcp # scanSTAT 1.0
+# William Scheding <wls at wls.org>
+etebac5 1216/udp # ETEBAC 5
+etebac5 1216/tcp # ETEBAC 5
+# GSIT <jl.barbut at gsit.fr>
+hpss-ndapi 1217/udp # HPSS-NDAPI
+hpss-ndapi 1217/tcp # HPSS-NDAPI
+# Michael Gleicher <mkg at san.rr.com>
+aeroflight-ads 1218/udp # AeroFlight-ADs
+aeroflight-ads 1218/tcp # AeroFlight-ADs
+aeroflight-ret 1219/udp # AeroFlight-Ret
+aeroflight-ret 1219/tcp # AeroFlight-Ret
+# Eric Johnson <eric at gruver.net>
+qt-serveradmin 1220/udp # QT SERVER ADMIN
+qt-serveradmin 1220/tcp # QT SERVER ADMIN
+# Chris LeCroy <lecroy at apple.com>
+sweetware-apps 1221/udp # SweetWARE Apps
+sweetware-apps 1221/tcp # SweetWARE Apps
+# David Dunetz <david at sweetware.com>
+nerv 1222/udp # SNI R&D network
+nerv 1222/tcp # SNI R&D network
+# Martin Freiss <freiss.pad at sni.de>
+tgp 1223/udp # TGP
+tgp 1223/tcp # TGP
+# Gur Kimchi <gur at mail.trulyglobal.com>
+vpnz 1224/udp # VPNz
+vpnz 1224/tcp # VPNz
+# Tom Strack <TSTRACK at Advnw.com>
+slinkysearch 1225/udp # SLINKYSEARCH
+slinkysearch 1225/tcp # SLINKYSEARCH
+# Desmond Chan <deschan at prismedia.com>
+stgxfws 1226/udp # STGXFWS
+stgxfws 1226/tcp # STGXFWS
+# Tetsuya Shioda <tetsuya at saint.nm.fujitsu.co.jp>
+dns2go 1227/udp # DNS2Go
+dns2go 1227/tcp # DNS2Go
+# Mark Richards <mark.richards at deerfield.com>
+florence 1228/udp # FLORENCE
+florence 1228/tcp # FLORENCE
+# Brian Trammell <btrammell at iventurelab.com>
+novell-zfs 1229/udp # Novell ZFS
+novell-zfs 1229/tcp # Novell ZFS
+# Ty Ellis <tellis at novell.com>
+periscope 1230/udp # Periscope
+periscope 1230/tcp # Periscope
+# Kevin Madden <Kevin at emailxtras.com>
+menandmice-lpm 1231/udp # menandmice-lpm
+menandmice-lpm 1231/tcp # menandmice-lpm
+# Sigfus Magnusson <sigfusm at menandmice.com>
+##### Microsoft (unoffically) using 1232 #####
+univ-appserver 1233/udp # Universal App Server
+univ-appserver 1233/tcp # Universal App Server
+# Tim Sent <tim.sent at systemsarchitects.com>
+search-agent 1234/udp # Infoseek Search Agent
+search-agent 1234/tcp # Infoseek Search Agent
+# Jackie Wu <jackiew at infoseek.com>
+mosaicsyssvc1 1235/udp # mosaicsyssvc1
+mosaicsyssvc1 1235/tcp # mosaicsyssvc1
+# Brian Matthews <bmatthews at mosaicsystems.com>
+bvcontrol 1236/udp # bvcontrol
+bvcontrol 1236/tcp # bvcontrol
+# Daniel J Walsh <dwalsh at bindview.com>
+tsdos390 1237/udp # tsdos390
+tsdos390 1237/tcp # tsdos390
+# Ben Pracht <ben.pracht at tivoli.com>
+hacl-qs 1238/udp # hacl-qs
+hacl-qs 1238/tcp # hacl-qs
+# Farid Faez <farid_faez at hp.com>
+nmsd 1239/udp # NMSD
+nmsd 1239/tcp # NMSD
+# Yuri Machkasov <yuri at ptc.com>
+instantia 1240/udp # Instantia
+instantia 1240/tcp # Instantia
+# Ruth Slater <ruth.slater at ideagen.co.uk>
+nessus 1241/udp # nessus
+nessus 1241/tcp # nessus
+# Jordan Hrycaj <jordan at mjh.teddy-net.com>
+nmasoverip 1242/udp # NMAS over IP
+nmasoverip 1242/tcp # NMAS over IP
+# Hal Henderson <hhenders at novell.com>
+serialgateway 1243/udp # SerialGateway
+serialgateway 1243/tcp # SerialGateway
+# Stephen LaValley <lavalley at lucent.com>
+isbconference1 1244/udp # isbconference1
+isbconference1 1244/tcp # isbconference1
+isbconference2 1245/udp # isbconference2
+isbconference2 1245/tcp # isbconference2
+# Arnold Dittmann <dittmann at isbcad.de>
+payrouter 1246/udp # payrouter
+payrouter 1246/tcp # payrouter
+# David Wilson <dwilson at integral-ie.com>
+visionpyramid 1247/udp # VisionPyramid
+visionpyramid 1247/tcp # VisionPyramid
+# Gavin Hutchinson <gavinh at visionlogistics.com>
+hermes 1248/udp # hermes
+hermes 1248/tcp # hermes
+# Not known
+mesavistaco 1249/udp # Mesa Vista Co
+mesavistaco 1249/tcp # Mesa Vista Co
+# Rick LaBanca <rel at mesasys.com>
+swldy-sias 1250/udp # swldy-sias
+swldy-sias 1250/tcp # swldy-sias
+# Peter E Williams <peter.williams at smallworld-us.com>
+servergraph 1251/udp # servergraph
+servergraph 1251/tcp # servergraph
+# Lindsay Morris <lmorris at servergraph.com>
+bspne-pcc 1252/udp # bspne-pcc
+bspne-pcc 1252/tcp # bspne-pcc
+q55-pcc 1253/udp # q55-pcc
+q55-pcc 1253/tcp # q55-pcc
+# Prem Tirilok <Prem.Tirilok at tellabs.com>
+de-noc 1254/udp # de-noc
+de-noc 1254/tcp # de-noc
+de-cache-query 1255/udp # de-cache-query
+de-cache-query 1255/tcp # de-cache-query
+de-server 1256/udp # de-server
+de-server 1256/tcp # de-server
+# Jeff Burdette <support at digitalenvoy.net>
+shockwave2 1257/udp # Shockwave 2
+shockwave2 1257/tcp # Shockwave 2
+# Dave Simmons <dsimmons at macromedia.com>
+opennl 1258/udp # Open Network Library
+opennl 1258/tcp # Open Network Library
+opennl-voice 1259/udp # Open Network Library Voice
+opennl-voice 1259/tcp # Open Network Library Voice
+# Phil Frisbie <phil at hawksoft.com>
+ibm-ssd 1260/udp # ibm-ssd
+ibm-ssd 1260/tcp # ibm-ssd
+# Barry Whyte <barry_whyte at uk.ibm.com>
+mpshrsv 1261/udp # mpshrsv
+mpshrsv 1261/tcp # mpshrsv
+# Makoto Ikeyama <ikeyama at ael.fujitsu.co.jp>
+qnts-orb 1262/udp # QNTS-ORB
+qnts-orb 1262/tcp # QNTS-ORB
+# Raghurama Bhat <raghu at quintus.com>
+dka 1263/udp # dka
+dka 1263/tcp # dka
+# Chris Griffin <cgriffin at dka.com>
+prat 1264/udp # PRAT
+prat 1264/tcp # PRAT
+# Keith Wood <keith.wood at epid.eurotherm.co.uk>
+dssiapi 1265/udp # DSSIAPI
+dssiapi 1265/tcp # DSSIAPI
+# Steve Sando <steve.sando at diversifiedsoftware.com>
+dellpwrappks 1266/udp # DELLPWRAPPKS
+dellpwrappks 1266/tcp # DELLPWRAPPKS
+# David Troeger <David_Troeger at dell.com>
+epc 1267/udp # eTrust Policy Compliance
+epc 1267/tcp # eTrust Policy Compliance
+# Aaron Stein <aaron.stein at ca.com>
+propel-msgsys 1268/udp # PROPEL-MSGSYS
+propel-msgsys 1268/tcp # PROPEL-MSGSYS
+# Bert Van der Linden <bert at propel.com>
+watilapp 1269/udp # WATiLaPP
+watilapp 1269/tcp # WATiLaPP
+# Frederic Weymann <Fizzban at swcombine.com>
+opsmgr 1270/udp # Microsoft Operations Manager
+opsmgr 1270/tcp # Microsoft Operations Manager
+# Ashvin Sanghvi <AshvinS at microsoft.com>
+dabew 1271/udp # Dabew
+dabew 1271/tcp # Dabew
+# Norm Freedman <normfree at att.net>
+cspmlockmgr 1272/udp # CSPMLockMgr
+cspmlockmgr 1272/tcp # CSPMLockMgr
+# Ibtsam Mahfouz <imahfouz at cisco.com>
+emc-gateway 1273/udp # EMC-Gateway
+emc-gateway 1273/tcp # EMC-Gateway
+# Rene Fontaine <fontaine_rene at emc.com>
+t1distproc 1274/udp # t1distproc
+t1distproc 1274/tcp # t1distproc
+# Julian Biddle <julian_biddle at TechnologyOneCorp.com>
+ivcollector 1275/udp # ivcollector
+ivcollector 1275/tcp # ivcollector
+ivmanager 1276/udp # ivmanager
+ivmanager 1276/tcp # ivmanager
+# Xavier Roques <xroques at infovista.fr>
+miva-mqs 1277/udp # mqs
+miva-mqs 1277/tcp # mqs
+# Miva Corporation <jwoods at miva.com.au>
+dellwebadmin-1 1278/udp # Dell Web Admin 1
+dellwebadmin-1 1278/tcp # Dell Web Admin 1
+dellwebadmin-2 1279/udp # Dell Web Admin 2
+dellwebadmin-2 1279/tcp # Dell Web Admin 2
+# Bridget Navoda <Bridget_Navoda at dell.com>
+pictrography 1280/udp # Pictrography
+pictrography 1280/tcp # Pictrography
+# Takashi Hoshino <hoshino at miya.fujifilm.co.jp>
+healthd 1281/udp # healthd
+healthd 1281/tcp # healthd
+# James E. Housley <jim at thehousleys.net>
+emperion 1282/udp # Emperion
+emperion 1282/tcp # Emperion
+# Claus Thor Barth <ctb at satworks.net>
+productinfo 1283/udp # ProductInfo
+productinfo 1283/tcp # ProductInfo
+iee-qfx 1284/udp # IEE-QFX
+iee-qfx 1284/tcp # IEE-QFX
+# Kevin D. Quitt <KQuitt at IEEInc.com>
+neoiface 1285/udp # neoiface
+neoiface 1285/tcp # neoiface
+# Jason McManus <jasonm at neoinformatics.com>
+netuitive 1286/udp # netuitive
+netuitive 1286/tcp # netuitive
+# Clayton Wilkinson <cwilkinson at netuitive.com>
+# 1287 Unassigned
+navbuddy 1288/udp # NavBuddy
+navbuddy 1288/tcp # NavBuddy
+# Eric Hackman <ehackman at millapps.com>
+jwalkserver 1289/udp # JWalkServer
+jwalkserver 1289/tcp # JWalkServer
+winjaserver 1290/udp # WinJaServer
+winjaserver 1290/tcp # WinJaServer
+seagulllms 1291/udp # SEAGULLLMS
+seagulllms 1291/tcp # SEAGULLLMS
+# Lee Breisacher <lbreisacher at seafullsw.com>
+dsdn 1292/udp # dsdn
+dsdn 1292/tcp # dsdn
+# Stanislaw Skowronek <thesis at elementary.pl>
+pkt-krb-ipsec 1293/udp # PKT-KRB-IPSec
+pkt-krb-ipsec 1293/tcp # PKT-KRB-IPSec
+# Nancy Davoust <n.davoust at cablelabs.com>
+cmmdriver 1294/udp # CMMdriver
+cmmdriver 1294/tcp # CMMdriver
+# Lutz Karras <karras at zeiss.de>
+ehtp 1295/udp # End-by-Hop Transmission Protocol
+ehtp 1295/tcp # End-by-Hop Transmission Protocol
+# Alexander Bogdanov <alexandr_bgd at softhome.net>
+dproxy 1296/udp # dproxy
+dproxy 1296/tcp # dproxy
+sdproxy 1297/udp # sdproxy
+sdproxy 1297/tcp # sdproxy
+# Raimond Diederik <rdiederik at descartes.com>
+lpcp 1298/udp # lpcp
+lpcp 1298/tcp # lpcp
+# Christian Stredicke <stredicke at snom.de>
+hp-sci 1299/udp # hp-sci
+hp-sci 1299/tcp # hp-sci
+# Kim Scott <kims at cup.hp.com>
+h323hostcallsc 1300/udp # H323 Host Call Secure
+h323hostcallsc 1300/tcp # H323 Host Call Secure
+# Jim Toga <jtoga at ideal.jf.intel.com>
+ci3-software-1 1301/udp # CI3-Software-1
+ci3-software-1 1301/tcp # CI3-Software-1
+ci3-software-2 1302/udp # CI3-Software-2
+ci3-software-2 1302/tcp # CI3-Software-2
+# Kelli Watson <kwatson at ci3software.com>
+sftsrv 1303/udp # sftsrv
+sftsrv 1303/tcp # sftsrv
+# Robert Frazier <BobF at mrp3.com>
+boomerang 1304/udp # Boomerang
+boomerang 1304/tcp # Boomerang
+# Bruce Lueckenhoff <brucelu at cisco.com>
+pe-mike 1305/udp # pe-mike
+pe-mike 1305/tcp # pe-mike
+# Stephen Hemminger <shemminger at passedge.com>
+re-conn-proto 1306/udp # RE-Conn-Proto
+re-conn-proto 1306/tcp # RE-Conn-Proto
+# Sandeep Singhal <sandeep at reefedge.com>
+pacmand 1307/udp # Pacmand
+pacmand 1307/tcp # Pacmand
+# Edward T. O'Shea <oshea at bellsouth.net>
+odsi 1308/udp # Optical Domain Service Interconnect (ODSI)
+odsi 1308/tcp # Optical Domain Service Interconnect (ODSI)
+# K. Arvind <arvind at tenornetworks.com>
+jtag-server 1309/udp # JTAG server
+jtag-server 1309/tcp # JTAG server
+# Andrew Draper <adraper at altera.com>
+husky 1310/udp # Husky
+husky 1310/tcp # Husky
+# Mark Zang <mark at zang.com>
+rxmon 1311/udp # RxMon
+rxmon 1311/tcp # RxMon
+# Javier Jiminez <javier_l_jimenez at dell.com>
+sti-envision 1312/udp # STI Envision
+sti-envision 1312/tcp # STI Envision
+# Don Stedman <dones at stisystems.com>
+bmc_patroldb 1313/udp # BMC_PATROLDB
+bmc_patroldb 1313/tcp # BMC_PATROLDB
+# Devon Shows <Devon_Shows at crow.bmc.com>
+pdps 1314/udp # Photoscript Distributed Printing System
+pdps 1314/tcp # Photoscript Distributed Printing System
+# Les Klein <sgy at cix.compulink.co.uk>
+els 1315/udp # E.L.S., Event Listener Service
+els 1315/tcp # E.L.S., Event Listener Service
+# Jim Cleppe <clep13 at cfer.com>
+exbit-escp 1316/udp # Exbit-ESCP
+exbit-escp 1316/tcp # Exbit-ESCP
+# Morten Christensen <mjc at exbit.dk>
+vrts-ipcserver 1317/udp # vrts-ipcserver
+vrts-ipcserver 1317/tcp # vrts-ipcserver
+# Bruce Hestand <Bruce.Hestand at veritas.com>
+krb5gatekeeper 1318/udp # krb5gatekeeper
+krb5gatekeeper 1318/tcp # krb5gatekeeper
+# Patrick Moore <pcmoore at sandia.gov>
+panja-icsp 1319/udp # Panja-ICSP
+panja-icsp 1319/tcp # Panja-ICSP
+# Ron Barber <ron.barber at panja.com>
+panja-axbnet 1320/udp # Panja-AXBNET
+panja-axbnet 1320/tcp # Panja-AXBNET
+# Andrew van Wensen <avanwensen at panja.com>
+pip 1321/udp # PIP
+pip 1321/tcp # PIP
+# Gordon Mohr <gojomo at usa.net>
+novation 1322/udp # Novation
+novation 1322/tcp # Novation
+# Alan Dano <wiseobject at yahoo.com>
+brcd 1323/udp # brcd
+brcd 1323/tcp # brcd
+# Todd Picquelle <todd at convergence.net>
+delta-mcp 1324/udp # delta-mcp
+delta-mcp 1324/tcp # delta-mcp
+# Quinton Tormanen <quinton at deltacompsys.com>
+dx-instrument 1325/udp # DX-Instrument
+dx-instrument 1325/tcp # DX-Instrument
+# Walt Modic <Walt.Modic at dionex.com>
+wimsic 1326/udp # WIMSIC
+wimsic 1326/tcp # WIMSIC
+# James Brown <ender at admdev.com>
+ultrex 1327/udp # Ultrex
+ultrex 1327/tcp # Ultrex
+# Tim Walsh <tim at ultrex.com>
+ewall 1328/udp # EWALL
+ewall 1328/tcp # EWALL
+# Jeff Busma <busma at echogent.com>
+netdb-export 1329/udp # netdb-export
+netdb-export 1329/tcp # netdb-export
+# Konstantinos Kostis <netdb at kostis.net>
+streetperfect 1330/udp # StreetPerfect
+streetperfect 1330/tcp # StreetPerfect
+# Michael R. Young <michael.young at tor.sunpub.com>
+intersan 1331/udp # intersan
+intersan 1331/tcp # intersan
+# Barry H. Feild <barry at intersan.net>
+pcia-rxp-b 1332/udp # PCIA RXP-B
+pcia-rxp-b 1332/tcp # PCIA RXP-B
+# James Dabbs <jdabbs at tga.com>
+passwrd-policy 1333/udp # Password Policy
+passwrd-policy 1333/tcp # Password Policy
+# Tonio Pirotta <tonio at tpis.com.au>
+writesrv 1334/udp # writesrv
+writesrv 1334/tcp # writesrv
+# Marvin Toungate <toungate at austin.ibm.com>
+digital-notary 1335/udp # Digital Notary Protocol
+digital-notary 1335/tcp # Digital Notary Protocol
+# Wes Doonan
+ischat 1336/udp # Instant Service Chat
+ischat 1336/tcp # Instant Service Chat
+# Mike Clise <mikec at instantservice.com>
+menandmice-dns 1337/udp # menandmice DNS
+menandmice-dns 1337/tcp # menandmice DNS
+# Sigfus Magnusson <sigfusm at menandmice.com>
+wmc-log-svc 1338/udp # WMC-log-svr
+wmc-log-svc 1338/tcp # WMC-log-svr
+# Stephen Brosseau <brosseau at workingmachines.com>
+kjtsiteserver 1339/udp # kjtsiteserver
+kjtsiteserver 1339/tcp # kjtsiteserver
+# Jason Aubain <jaubain at kjt.com>
+naap 1340/udp # NAAP
+naap 1340/tcp # NAAP
+# Henry Haverinen <henry.haverinen at nokia.com>
+qubes 1341/udp # QuBES
+qubes 1341/tcp # QuBES
+# Eric Grange <egrange at creative-it.net>
+esbroker 1342/udp # ESBroker
+esbroker 1342/tcp # ESBroker
+# Alexander Medvinsky <smedvinsky at gi.com>
+re101 1343/udp # re101
+re101 1343/tcp # re101
+# Doriano Blengino <tecnico at xonelectronics.it>
+icap 1344/udp # ICAP
+icap 1344/tcp # ICAP
+# Jeremy Elson <jelson at isi.edu>
+vpjp 1345/udp # VPJP
+vpjp 1345/tcp # VPJP
+# Michael Collins <UBMCollins at aol.com>
+alta-ana-lm 1346/udp # Alta Analytics License Manager
+alta-ana-lm 1346/tcp # Alta Analytics License Manager
+bbn-mmc 1347/udp # multi media conferencing
+bbn-mmc 1347/tcp # multi media conferencing
+bbn-mmx 1348/udp # multi media conferencing
+bbn-mmx 1348/tcp # multi media conferencing
+sbook 1349/udp # Registration Network Protocol
+sbook 1349/tcp # Registration Network Protocol
+editbench 1350/udp # Registration Network Protocol
+editbench 1350/tcp # Registration Network Protocol
+# Simson L. Garfinkel <simsong at next.cambridge.ma.us>
+equationbuilder 1351/udp # Digital Tool Works (MIT)
+equationbuilder 1351/tcp # Digital Tool Works (MIT)
+# Terrence J. Talbot <lexcube!tjt at bu.edu>
+lotusnote 1352/udp # Lotus Note
+lotusnote 1352/tcp # Lotus Note
+# Greg Pflaum <iris.com!Greg_Pflaum at uunet.uu.net>
+relief 1353/udp # Relief Consulting
+relief 1353/tcp # Relief Consulting
+# John Feiler <relief!jjfeiler at uu2.psi.com>
+rightbrain 1354/udp # RightBrain Software
+rightbrain 1354/tcp # RightBrain Software
+# Glenn Reid <glann at rightbrain.com>
+intuitive-edge 1355/udp # Intuitive Edge
+intuitive-edge 1355/tcp # Intuitive Edge
+# Montgomery Zukowski
+# <monty at nextnorth.acs.ohio-state.edu>
+cuillamartin 1356/udp # CuillaMartin Company
+cuillamartin 1356/tcp # CuillaMartin Company
+pegboard 1357/udp # Electronic PegBoard
+pegboard 1357/tcp # Electronic PegBoard
+# Chris Cuilla
+# <balr!vpnet!cuilla!chris at clout.chi.il.us>
+connlcli 1358/udp # CONNLCLI
+connlcli 1358/tcp # CONNLCLI
+ftsrv 1359/udp # FTSRV
+ftsrv 1359/tcp # FTSRV
+# Ines Homem de Melo <sidinf at brfapesp.bitnet>
+mimer 1360/udp # MIMER
+mimer 1360/tcp # MIMER
+# Per Schroeder <Per.Schroder at mimer.se>
+linx 1361/udp # LinX
+linx 1361/tcp # LinX
+# Steffen Schilke <---none--->
+timeflies 1362/udp # TimeFlies
+timeflies 1362/tcp # TimeFlies
+# Doug Kent <mouthers at slugg@nwnexus.wa.com>
+ndm-requester 1363/udp # Network DataMover Requester
+ndm-requester 1363/tcp # Network DataMover Requester
+ndm-server 1364/udp # Network DataMover Server
+ndm-server 1364/tcp # Network DataMover Server
+# Toshio Watanabe
+# <watanabe at godzilla.rsc.spdd.ricoh.co.j>
+adapt-sna 1365/udp # Network Software Associates
+adapt-sna 1365/tcp # Network Software Associates
+# Jeffery Chiao <714-768-401>
+netware-csp 1366/udp # Novell NetWare Comm Service Platform
+netware-csp 1366/tcp # Novell NetWare Comm Service Platform
+# Laurie Lindsey <llindsey at novell.com>
+dcs 1367/udp # DCS
+dcs 1367/tcp # DCS
+# Stefan Siebert <ssiebert at dcs.de>
+screencast 1368/udp # ScreenCast
+screencast 1368/tcp # ScreenCast
+# Bill Tschumy <other!bill at uunet.UU.NET>
+gv-us 1369/udp # GlobalView to Unix Shell
+gv-us 1369/tcp # GlobalView to Unix Shell
+us-gv 1370/udp # Unix Shell to GlobalView
+us-gv 1370/tcp # Unix Shell to GlobalView
+# Makoto Mita <mita at ssdev.ksp.fujixerox.co.jp>
+fc-cli 1371/udp # Fujitsu Config Protocol
+fc-cli 1371/tcp # Fujitsu Config Protocol
+fc-ser 1372/udp # Fujitsu Config Protocol
+fc-ser 1372/tcp # Fujitsu Config Protocol
+# Ryuichi Horie <horie at spad.sysrap.cs.fujitsu.co.jp>
+chromagrafx 1373/udp # Chromagrafx
+chromagrafx 1373/tcp # Chromagrafx
+# Mike Barthelemy <msb at chromagrafx.com>
+molly 1374/udp # EPI Software Systems
+molly 1374/tcp # EPI Software Systems
+# Jim Vlcek <jvlcek at veeco.com>
+bytex 1375/udp # Bytex
+bytex 1375/tcp # Bytex
+# Mary Ann Burt <bytex!ws054!maryann at uunet.UU.NET>
+ibm-pps 1376/udp # IBM Person to Person Software
+ibm-pps 1376/tcp # IBM Person to Person Software
+# Simon Phipps <sphipps at vnet.ibm.com>
+cichlid 1377/udp # Cichlid License Manager
+cichlid 1377/tcp # Cichlid License Manager
+# Andy Burgess <aab at cichlid.com>
+elan 1378/udp # Elan License Manager
+elan 1378/tcp # Elan License Manager
+# Ken Greer <kg at elan.com>
+dbreporter 1379/udp # Integrity Solutions
+dbreporter 1379/tcp # Integrity Solutions
+# Tim Dawson <tdawson%mspboss at uunet.UU.NET>
+telesis-licman 1380/udp # Telesis Network License Manager
+telesis-licman 1380/tcp # Telesis Network License Manager
+# Karl Schendel, Jr. <wiz at telesis.com>
+apple-licman 1381/udp # Apple Network License Manager
+apple-licman 1381/tcp # Apple Network License Manager
+# Earl Wallace <earlw at apple.com>
+udt_os 1382/udp # udt_os
+udt_os 1382/tcp # udt_os
+gwha 1383/udp # GW Hannaway Network License Manager
+gwha 1383/tcp # GW Hannaway Network License Manager
+# J. Gabriel Foster <fop at gwha.com>
+os-licman 1384/udp # Objective Solutions License Manager
+os-licman 1384/tcp # Objective Solutions License Manager
+# Donald Cornwell <don.cornwell at objective.com>
+atex_elmd 1385/udp # Atex Publishing License Manager
+atex_elmd 1385/tcp # Atex Publishing License Manager
+# Brett Sorenson <bcs at atex.com>
+checksum 1386/udp # CheckSum License Manager
+checksum 1386/tcp # CheckSum License Manager
+# Andreas Glocker <glocker at sirius.com>
+cadsi-lm 1387/udp # Computer Aided Design Software Inc LM
+cadsi-lm 1387/tcp # Computer Aided Design Software Inc LM
+# Sulistio Muljadi <e-mail?>
+objective-dbc 1388/udp # Objective Solutions DataBase Cache
+objective-dbc 1388/tcp # Objective Solutions DataBase Cache
+# Donald Cornwell <e-mail?>
+iclpv-dm 1389/udp # Document Manager
+iclpv-dm 1389/tcp # Document Manager
+iclpv-sc 1390/udp # Storage Controller
+iclpv-sc 1390/tcp # Storage Controller
+iclpv-sas 1391/udp # Storage Access Server
+iclpv-sas 1391/tcp # Storage Access Server
+iclpv-pm 1392/udp # Print Manager
+iclpv-pm 1392/tcp # Print Manager
+iclpv-nls 1393/udp # Network Log Server
+iclpv-nls 1393/tcp # Network Log Server
+iclpv-nlc 1394/udp # Network Log Client
+iclpv-nlc 1394/tcp # Network Log Client
+iclpv-wsm 1395/udp # PC Workstation Manager software
+iclpv-wsm 1395/tcp # PC Workstation Manager software
+# A.P. Hobson <A.P.Hobson at bra0112.wins.icl.co.uk>
+dvl-activemail 1396/udp # DVL Active Mail
+dvl-activemail 1396/tcp # DVL Active Mail
+audio-activmail 1397/udp # Audio Active Mail
+audio-activmail 1397/tcp # Audio Active Mail
+video-activmail 1398/udp # Video Active Mail
+video-activmail 1398/tcp # Video Active Mail
+# Avshalom Houri <Avshalom at ubique.com>
+cadkey-licman 1399/udp # Cadkey License Manager
+cadkey-licman 1399/tcp # Cadkey License Manager
+cadkey-tablet 1400/udp # Cadkey Tablet Daemon
+cadkey-tablet 1400/tcp # Cadkey Tablet Daemon
+# Joe McCollough <joe at cadkey.com>
+goldleaf-licman 1401/udp # Goldleaf License Manager
+goldleaf-licman 1401/tcp # Goldleaf License Manager
+# John Fox <---none--->
+prm-sm-np 1402/udp # Prospero Resource Manager
+prm-sm-np 1402/tcp # Prospero Resource Manager
+prm-nm-np 1403/udp # Prospero Resource Manager
+prm-nm-np 1403/tcp # Prospero Resource Manager
+# B. Clifford Neuman <bcn at isi.edu>
+igi-lm 1404/udp # Infinite Graphics License Manager
+igi-lm 1404/tcp # Infinite Graphics License Manager
+ibm-res 1405/udp # IBM Remote Execution Starter
+ibm-res 1405/tcp # IBM Remote Execution Starter
+netlabs-lm 1406/udp # NetLabs License Manager
+netlabs-lm 1406/tcp # NetLabs License Manager
+dbsa-lm 1407/udp # DBSA License Manager
+dbsa-lm 1407/tcp # DBSA License Manager
+# Scott Shattuck <ss at dbsa.com>
+sophia-lm 1408/udp # Sophia License Manager
+sophia-lm 1408/tcp # Sophia License Manager
+# Eric Brown <sst!emerald!eric at uunet.UU.net>
+here-lm 1409/udp # Here License Manager
+here-lm 1409/tcp # Here License Manager
+# David Ison <here at dialup.oar.net>
+hiq 1410/udp # HiQ License Manager
+hiq 1410/tcp # HiQ License Manager
+# Rick Pugh <rick at bilmillennium.com>
+af 1411/udp # AudioFile
+af 1411/tcp # AudioFile
+# Jim Gettys <jg at crl.dec.com>
+innosys 1412/udp # InnoSys
+innosys 1412/tcp # InnoSys
+innosys-acl 1413/udp # Innosys-ACL
+innosys-acl 1413/tcp # Innosys-ACL
+# Eric Welch <--none--->
+ibm-mqseries 1414/udp # IBM MQSeries
+ibm-mqseries 1414/tcp # IBM MQSeries
+# Roger Meli <rmmeli%winvmd at vnet.ibm.com>
+dbstar 1415/udp # DBStar
+dbstar 1415/tcp # DBStar
+# Jeffrey Millman <jcm at dbstar.com>
+novell-lu6.2 1416/udp # Novell LU6.2
+novell-lu6.2 1416/tcp # Novell LU6.2
+# Peter Liu <--none--->
+timbuktu-srv1 1417/udp # Timbuktu Service 1 Port
+timbuktu-srv1 1417/tcp # Timbuktu Service 1 Port
+timbuktu-srv2 1418/udp # Timbuktu Service 2 Port
+timbuktu-srv2 1418/tcp # Timbuktu Service 2 Port
+timbuktu-srv3 1419/udp # Timbuktu Service 3 Port
+timbuktu-srv3 1419/tcp # Timbuktu Service 3 Port
+timbuktu-srv4 1420/udp # Timbuktu Service 4 Port
+timbuktu-srv4 1420/tcp # Timbuktu Service 4 Port
+# Marc Epard <marc at netopia.com>
+gandalf-lm 1421/udp # Gandalf License Manager
+gandalf-lm 1421/tcp # Gandalf License Manager
+# gilmer at gandalf.ca
+autodesk-lm 1422/udp # Autodesk License Manager
+autodesk-lm 1422/tcp # Autodesk License Manager
+# David Ko <dko at autodesk.com>
+essbase 1423/udp # Essbase Arbor Software
+essbase 1423/tcp # Essbase Arbor Software
+hybrid 1424/udp # Hybrid Encryption Protocol
+hybrid 1424/tcp # Hybrid Encryption Protocol
+# Howard Hart <hch at hybrid.com>
+zion-lm 1425/udp # Zion Software License Manager
+zion-lm 1425/tcp # Zion Software License Manager
+# David Ferrero <david at zion.com>
+sais 1426/udp # Satellite-data Acquisition System 1
+sais 1426/tcp # Satellite-data Acquisition System 1
+# Bill Taylor <sais at ssec.wisc.edu>
+mloadd 1427/udp # mloadd monitoring tool
+mloadd 1427/tcp # mloadd monitoring tool
+# Bob Braden <braden at isi.edu>
+informatik-lm 1428/udp # Informatik License Manager
+informatik-lm 1428/tcp # Informatik License Manager
+# Harald Schlangmann
+# <schlangm at informatik.uni-muenchen.de>
+nms 1429/udp # Hypercom NMS
+nms 1429/tcp # Hypercom NMS
+tpdu 1430/udp # Hypercom TPDU
+tpdu 1430/tcp # Hypercom TPDU
+# Noor Chowdhury <noor at hypercom.com>
+rgtp 1431/udp # Reverse Gossip Transport
+rgtp 1431/tcp # Reverse Gossip Transport
+# Ian Jackson <iwj at cam-orl.co.uk>
+blueberry-lm 1432/udp # Blueberry Software License Manager
+blueberry-lm 1432/tcp # Blueberry Software License Manager
+# Steve Beigel <ublueb!steve at uunet.uu.net>
+ms-sql-s 1433/udp # Microsoft-SQL-Server
+ms-sql-s 1433/tcp # Microsoft-SQL-Server
+ms-sql-m 1434/udp # Microsoft-SQL-Monitor
+ms-sql-m 1434/tcp # Microsoft-SQL-Monitor
+# Peter Hussey <peterhus at microsoft.com>
+ibm-cics 1435/udp # IBM CICS
+ibm-cics 1435/tcp # IBM CICS
+# Geoff Meacock <gbibmswl at ibmmail.COM>
+saism 1436/udp # Satellite-data Acquisition System 2
+saism 1436/tcp # Satellite-data Acquisition System 2
+# Bill Taylor <sais at ssec.wisc.edu>
+tabula 1437/udp # Tabula
+tabula 1437/tcp # Tabula
+# Marcelo Einhorn
+# <KGUNE%HUJIVM1.bitnet at taunivm.tau.ac.il>
+eicon-server 1438/udp # Eicon Security Agent/Server
+eicon-server 1438/tcp # Eicon Security Agent/Server
+eicon-x25 1439/udp # Eicon X25/SNA Gateway
+eicon-x25 1439/tcp # Eicon X25/SNA Gateway
+eicon-slp 1440/udp # Eicon Service Location Protocol
+eicon-slp 1440/tcp # Eicon Service Location Protocol
+# Pat Calhoun <CALHOUN at admin.eicon.qc.ca>
+cadis-1 1441/udp # Cadis License Management
+cadis-1 1441/tcp # Cadis License Management
+cadis-2 1442/udp # Cadis License Management
+cadis-2 1442/tcp # Cadis License Management
+# Todd Wichers <twichers at csn.org>
+ies-lm 1443/udp # Integrated Engineering Software
+ies-lm 1443/tcp # Integrated Engineering Software
+# David Tong <David_Tong at integrated.mb.ca>
+marcam-lm 1444/udp # Marcam License Management
+marcam-lm 1444/tcp # Marcam License Management
+# Therese Hunt <hunt at marcam.com>
+proxima-lm 1445/udp # Proxima License Manager
+proxima-lm 1445/tcp # Proxima License Manager
+ora-lm 1446/udp # Optical Research Associates License Manager
+ora-lm 1446/tcp # Optical Research Associates License Manager
+apri-lm 1447/udp # Applied Parallel Research LM
+apri-lm 1447/tcp # Applied Parallel Research LM
+# Jim Dillon <jed at apri.com>
+oc-lm 1448/udp # OpenConnect License Manager
+oc-lm 1448/tcp # OpenConnect License Manager
+# Sue Barnhill <snb at oc.com>
+peport 1449/udp # PEport
+peport 1449/tcp # PEport
+# Qentin Neill <quentin at ColumbiaSC.NCR.COM>
+dwf 1450/udp # Tandem Distributed Workbench Facility
+dwf 1450/tcp # Tandem Distributed Workbench Facility
+# Mike Bert <BERG_MIKE at tandem.com>
+infoman 1451/udp # IBM Information Management
+infoman 1451/tcp # IBM Information Management
+# Karen Burns <---none--->
+gtegsc-lm 1452/udp # GTE Government Systems License Man
+gtegsc-lm 1452/tcp # GTE Government Systems License Man
+# Mike Gregory <Gregory_Mike at msmail.iipo.gtegsc.com>
+genie-lm 1453/udp # Genie License Manager
+genie-lm 1453/tcp # Genie License Manager
+# Paul Applegate <p.applegate2 at genie.geis.com>
+interhdl_elmd 1454/udp # interHDL License Manager
+interhdl_elmd 1454/tcp # interHDL License Manager
+# Eli Sternheim eli at interhdl.com
+esl-lm 1455/udp # ESL License Manager
+esl-lm 1455/tcp # ESL License Manager
+# Abel Chou <abel at willy.esl.com>
+dca 1456/udp # DCA
+dca 1456/tcp # DCA
+# Jeff Garbers <jgarbers at netcom.com>
+valisys-lm 1457/udp # Valisys License Manager
+valisys-lm 1457/tcp # Valisys License Manager
+# Leslie Lincoln <leslie_lincoln at valisys.com>
+nrcabq-lm 1458/udp # Nichols Research Corp.
+nrcabq-lm 1458/tcp # Nichols Research Corp.
+# Howard Cole <hcole at tumbleweed.nrcabq.com>
+proshare1 1459/udp # Proshare Notebook Application
+proshare1 1459/tcp # Proshare Notebook Application
+proshare2 1460/udp # Proshare Notebook Application
+proshare2 1460/tcp # Proshare Notebook Application
+# Robin Kar <Robin_Kar at ccm.hf.intel.com>
+ibm_wrless_lan 1461/udp # IBM Wireless LAN
+ibm_wrless_lan 1461/tcp # IBM Wireless LAN
+# <flanne at vnet.IBM.COM>
+world-lm 1462/udp # World License Manager
+world-lm 1462/tcp # World License Manager
+# Michael S Amirault <ambi at world.std.com>
+nucleus 1463/udp # Nucleus
+nucleus 1463/tcp # Nucleus
+# Venky Nagar <venky at fafner.Stanford.EDU>
+msl_lmd 1464/udp # MSL License Manager
+msl_lmd 1464/tcp # MSL License Manager
+# Matt Timmermans
+pipes 1465/udp # Pipes Platform mfarlin at peerlogic.com
+pipes 1465/tcp # Pipes Platform
+# Mark Farlin <mfarlin at peerlogic.com>
+oceansoft-lm 1466/udp # Ocean Software License Manager
+oceansoft-lm 1466/tcp # Ocean Software License Manager
+# Randy Leonard <randy at oceansoft.com>
+csdmbase 1467/udp # CSDMBASE
+csdmbase 1467/tcp # CSDMBASE
+csdm 1468/udp # CSDM
+csdm 1468/tcp # CSDM
+# Robert Stabl <stabl at informatik.uni-muenchen.de>
+aal-lm 1469/udp # Active Analysis Limited License Manager
+aal-lm 1469/tcp # Active Analysis Limited License Manager
+# David Snocken +44 (71)437-7009
+uaiact 1470/udp # Universal Analytics
+uaiact 1470/tcp # Universal Analytics
+# Mark R. Ludwig <Mark-Ludwig at uai.com>
+csdmbase 1471/udp # csdmbase
+csdmbase 1471/tcp # csdmbase
+csdm 1472/udp # csdm
+csdm 1472/tcp # csdm
+# Robert Stabl <stabl at informatik.uni-muenchen.de>
+openmath 1473/udp # OpenMath
+openmath 1473/tcp # OpenMath
+# Garth Mayville <mayville at maplesoft.on.ca>
+telefinder 1474/udp # Telefinder
+telefinder 1474/tcp # Telefinder
+# Jim White <Jim_White at spiderisland.com>
+taligent-lm 1475/udp # Taligent License Manager
+taligent-lm 1475/tcp # Taligent License Manager
+# Mark Sapsford <Mark_Sapsford@@taligent.com>
+clvm-cfg 1476/udp # clvm-cfg
+clvm-cfg 1476/tcp # clvm-cfg
+# Eric Soderberg <seric at cup.hp.com>
+ms-sna-server 1477/udp # ms-sna-server
+ms-sna-server 1477/tcp # ms-sna-server
+ms-sna-base 1478/udp # ms-sna-base
+ms-sna-base 1478/tcp # ms-sna-base
+# Gordon Mangione <gordm at microsoft.com>
+dberegister 1479/udp # dberegister
+dberegister 1479/tcp # dberegister
+# Brian Griswold <brian at dancingbear.com>
+pacerforum 1480/udp # PacerForum
+pacerforum 1480/tcp # PacerForum
+# Peter Caswell <pfc at pacvax.pacersoft.com>
+airs 1481/udp # AIRS
+airs 1481/tcp # AIRS
+# Bruce Wilson, 905-771-6161
+miteksys-lm 1482/udp # Miteksys License Manager
+miteksys-lm 1482/tcp # Miteksys License Manager
+# Shane McRoberts <mcroberts at miteksys.com>
+afs 1483/udp # AFS License Manager
+afs 1483/tcp # AFS License Manager
+# Michael R. Pizolato <michael at afs.com>
+confluent 1484/udp # Confluent License Manager
+confluent 1484/tcp # Confluent License Manager
+# James Greenfiel <jim at pa.confluent.com>
+lansource 1485/udp # LANSource
+lansource 1485/tcp # LANSource
+# Christopher Wells <Christopher_Wells at 3com.com>
+nms_topo_serv 1486/udp # nms_topo_serv
+nms_topo_serv 1486/tcp # nms_topo_serv
+# Sylvia Siu <Sylvia_Siu at Novell.CO>
+localinfosrvr 1487/udp # LocalInfoSrvr
+localinfosrvr 1487/tcp # LocalInfoSrvr
+# Brian Matthews <brian_matthews at ibist.ibis.com>
+docstor 1488/udp # DocStor
+docstor 1488/tcp # DocStor
+# Brian Spears <bspears at salix.com>
+dmdocbroker 1489/udp # dmdocbroker
+dmdocbroker 1489/tcp # dmdocbroker
+# Razmik Abnous <abnous at documentum.com>
+insitu-conf 1490/udp # insitu-conf
+insitu-conf 1490/tcp # insitu-conf
+# Paul Blacknell <paul at insitu.com>
+anynetgateway 1491/udp # anynetgateway
+anynetgateway 1491/tcp # anynetgateway
+# Dan Poirier <poirier at VNET.IBM.COM>
+stone-design-1 1492/udp # stone-design-1
+stone-design-1 1492/tcp # stone-design-1
+# Andrew Stone <andrew at stone.com>
+netmap_lm 1493/udp # netmap_lm
+netmap_lm 1493/tcp # netmap_lm
+# Phillip Magson <philm at extro.ucc.su.OZ.AU>
+ica 1494/udp # ica
+ica 1494/tcp # ica
+# John Richardson, Citrix Systems
+cvc 1495/udp # cvc
+cvc 1495/tcp # cvc
+# Bill Davidson <billd at equalizer.cray.com>
+liberty-lm 1496/udp # liberty-lm
+liberty-lm 1496/tcp # liberty-lm
+# Jim Rogers <trane!jimbo at pacbell.com>
+rfx-lm 1497/udp # rfx-lm
+rfx-lm 1497/tcp # rfx-lm
+# Bill Bishop <bil at rfx.rfx.com>
+sybase-sqlany 1498/udp # Sybase SQL Any
+sybase-sqlany 1498/tcp # Sybase SQL Any
+# Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+fhc 1499/udp # Federico Heinz Consultora
+fhc 1499/tcp # Federico Heinz Consultora
+# Federico Heinz <federico at heinz.com>
+vlsi-lm 1500/udp # VLSI License Manager
+vlsi-lm 1500/tcp # VLSI License Manager
+# Shue-Lin Kuo <shuelin at mdk.sanjose.vlsi.com>
+saiscm 1501/udp # Satellite-data Acquisition System 3
+saiscm 1501/tcp # Satellite-data Acquisition System 3
+# Bill Taylor <sais at ssec.wisc.edu>
+shivadiscovery 1502/udp # Shiva
+shivadiscovery 1502/tcp # Shiva
+# Jonathan Wenocur <jhw at Shiva.COM>
+imtc-mcs 1503/udp # Databeam
+imtc-mcs 1503/tcp # Databeam
+# Jim Johnston <jjohnston at databeam.com>
+evb-elm 1504/udp # EVB Software Engineering License Manager
+evb-elm 1504/tcp # EVB Software Engineering License Manager
+# B.G. Mahesh < mahesh at sett.com>
+funkproxy 1505/udp # Funk Software, Inc.
+funkproxy 1505/tcp # Funk Software, Inc.
+# Robert D. Vincent <bert at willowpond.com>
+utcd 1506/udp # Universal Time daemon (utcd)
+utcd 1506/tcp # Universal Time daemon (utcd)
+# Walter Poxon <wdp at ironwood.cray.com>
+symplex 1507/udp # symplex
+symplex 1507/tcp # symplex
+# Mike Turley <turley at symplex.com>
+diagmond 1508/udp # diagmond
+diagmond 1508/tcp # diagmond
+# Pete Moscatelli <moscat at hprdstl0.rose.hp.com>
+robcad-lm 1509/udp # Robcad, Ltd. License Manager
+robcad-lm 1509/tcp # Robcad, Ltd. License Manager
+# Hindin Joseph <hindin%robcad at uunet.uu.net>
+mvx-lm 1510/udp # Midland Valley Exploration Ltd. Lic. Man.
+mvx-lm 1510/tcp # Midland Valley Exploration Ltd. Lic. Man.
+# Neil Salter <neil at indigo2.mvel.demon.co.uk>Laszlo
+3l-l1 1511/udp # 3l-l1
+3l-l1 1511/tcp # 3l-l1
+# Ian A. Young <iay at threel.co.uk>
+wins 1512/udp # Microsoft's Windows Internet Name Service
+wins 1512/tcp # Microsoft's Windows Internet Name Service
+# Pradeep Bahl <pradeepb at microsoft.com>
+fujitsu-dtc 1513/udp # Fujitsu Systems Business of America, Inc
+fujitsu-dtc 1513/tcp # Fujitsu Systems Business of America, Inc
+fujitsu-dtcns 1514/udp # Fujitsu Systems Business of America, Inc
+fujitsu-dtcns 1514/tcp # Fujitsu Systems Business of America, Inc
+# Charles A. Higgins <75730.2257 at compuserve.com>
+ifor-protocol 1515/udp # ifor-protocol
+ifor-protocol 1515/tcp # ifor-protocol
+# Dr. R.P. Alston <robin at gradient.com>
+vpad 1516/udp # Virtual Places Audio data
+vpad 1516/tcp # Virtual Places Audio data
+vpac 1517/udp # Virtual Places Audio control
+vpac 1517/tcp # Virtual Places Audio control
+vpvd 1518/udp # Virtual Places Video data
+vpvd 1518/tcp # Virtual Places Video data
+vpvc 1519/udp # Virtual Places Video control
+vpvc 1519/tcp # Virtual Places Video control
+# Avshalom Houri <Avshalom at ubique.com>
+atm-zip-office 1520/udp # atm zip office
+atm-zip-office 1520/tcp # atm zip office
+# Wilson Kwan <wilsonk%toronto at zip.atm.com>
+ncube-lm 1521/udp # nCube License Manager
+ncube-lm 1521/tcp # nCube License Manager
+# Maxine Yuen <maxine at hq.ncube.com>
+ricardo-lm 1522/udp # Ricardo North America License Manager
+ricardo-lm 1522/tcp # Ricardo North America License Manager
+# Mike Flemming <mf at xnet.com>
+cichild-lm 1523/udp # cichild
+cichild-lm 1523/tcp # cichild
+# Andy Burgess <aab at cichlid.com>
+ingreslock 1524/udp # ingres
+ingreslock 1524/tcp # ingres
+orasrv 1525/udp prospero-np # oracle
+orasrv 1525/tcp prospero-np # oracle
+pdap-np 1526/udp # Prospero Data Access Prot non-priv
+pdap-np 1526/tcp # Prospero Data Access Prot non-priv
+# B. Clifford Neuman <bcn at isi.edu>
+tlisrv 1527/udp # oracle
+tlisrv 1527/tcp # oracle
+mciautoreg 1528/udp # micautoreg
+mciautoreg 1528/tcp # micautoreg
+# John Klensin <klensin at MAIL1.RESTON.MCI.NET>
+coauthor 1529/udp # oracle
+coauthor 1529/tcp # oracle
+rap-service 1530/udp # rap-service
+rap-service 1530/tcp # rap-service
+rap-listen 1531/udp # rap-listen
+rap-listen 1531/tcp # rap-listen
+# Phil Servita <meister at ftp.com>
+miroconnect 1532/udp # miroconnect
+miroconnect 1532/tcp # miroconnect
+# Michael Fischer +49 531 21 13 0
+virtual-places 1533/udp # Virtual Places Software
+virtual-places 1533/tcp # Virtual Places Software
+# Avshalom Houri <Avshalom at ubique.com>
+micromuse-lm 1534/udp # micromuse-lm
+micromuse-lm 1534/tcp # micromuse-lm
+# Adam Kerrison <adam at micromuse.co.uk>
+ampr-info 1535/udp # ampr-info
+ampr-info 1535/tcp # ampr-info
+ampr-inter 1536/udp # ampr-inter
+ampr-inter 1536/tcp # ampr-inter
+# Rob Janssen <rob at sys3.pe1chl.ampr.org>
+sdsc-lm 1537/udp # isi-lm
+sdsc-lm 1537/tcp # isi-lm
+# Len Wanger <lrw at sdsc.edu>
+3ds-lm 1538/udp # 3ds-lm
+3ds-lm 1538/tcp # 3ds-lm
+# Keith Trummel <ktrummel at autodesk.com>
+intellistor-lm 1539/udp # Intellistor License Manager
+intellistor-lm 1539/tcp # Intellistor License Manager
+# Ron Vaughn <rv at intellistor.com>
+rds 1540/udp # rds
+rds 1540/tcp # rds
+rds2 1541/udp # rds2
+rds2 1541/tcp # rds2
+# Sudhakar Rajamannar <mobius1 at cerfnet.com>
+gridgen-elmd 1542/udp # gridgen-elmd
+gridgen-elmd 1542/tcp # gridgen-elmd
+# John R. Chawner +1 817 354-1004
+simba-cs 1543/udp # simba-cs
+simba-cs 1543/tcp # simba-cs
+# Betsy Alexander +1 604-681-4549
+aspeclmd 1544/udp # aspeclmd
+aspeclmd 1544/tcp # aspeclmd
+# V. Balaji <balaji at aspec.com>
+vistium-share 1545/udp # vistium-share
+vistium-share 1545/tcp # vistium-share
+# Allison Carleton
+# <acarleto at naper1.napervilleil.ncr.com>
+abbaccuray 1546/udp # abbaccuray
+abbaccuray 1546/tcp # abbaccuray
+# John Wendt 614-261-2000
+laplink 1547/udp # laplink
+laplink 1547/tcp # laplink
+# Michael Crawford <MichaelC at dev.travsoft.com>
+axon-lm 1548/udp # Axon License Manager
+axon-lm 1548/tcp # Axon License Manager
+# Mark Pearce <<Mark_A.._Pearce/AXON_Networks_Inc.. at notes.axon.com>
+shivasound 1549/udp # Shiva Sound
+shivahose 1549/tcp # Shiva Hose
+# Kin Chan <kchan at shiva.com>
+3m-image-lm 1550/udp # Image Storage license manager 3M Company
+3m-image-lm 1550/tcp # Image Storage license manager 3M Company
+# J. C. Canessa <jccanessa at mmm.com>
+hecmtl-db 1551/udp # HECMTL-DB
+hecmtl-db 1551/tcp # HECMTL-DB
+# Maxime Belanger <R173 at hec.ca>
+pciarray 1552/udp # pciarray
+pciarray 1552/tcp # pciarray
+# Ron Folk <rfolkes at avl.com>
+sna-cs 1553/udp # sna-cs
+sna-cs 1553/tcp # sna-cs
+# Tony Sowter <ts at datcon.co.uk>
+caci-lm 1554/udp # CACI Products Company License Manager
+caci-lm 1554/tcp # CACI Products Company License Manager
+# Erik Blume <erikb at caciasl.com>
+livelan 1555/udp # livelan
+livelan 1555/tcp # livelan
+# khedayat at roadrunner.pictel.com <Kaynam Hedayat>
+ashwin 1556/udp # AshWin CI Tecnologies
+ashwin 1556/tcp # AshWin CI Tecnologies
+# Dave Neal <daven at ashwin.com>
+arbortext-lm 1557/udp # ArborText License Manager
+arbortext-lm 1557/tcp # ArborText License Manager
+# David J. Wilson <djw at arbortext.com>
+xingmpeg 1558/udp # xingmpeg
+xingmpeg 1558/tcp # xingmpeg
+# Howard Gordon <hgordon at system.xingtech.com>
+web2host 1559/udp # web2host
+web2host 1559/tcp # web2host
+# Stephen Johnson <sjohnson at mindspring.com>
+asci-val 1560/udp # ASCI-RemoteSHADOW
+asci-val 1560/tcp # ASCI-RemoteSHADOW
+# Benjamin Rosenberg <brosenberg at advsyscon.com>
+facilityview 1561/udp # facilityview
+facilityview 1561/tcp # facilityview
+# Ed Green <egreen at pmeasuring.com>
+pconnectmgr 1562/udp # pconnectmgr
+pconnectmgr 1562/tcp # pconnectmgr
+# Bob Kaiser <BKaiser at palindrome.com>
+cadabra-lm 1563/udp # Cadabra License Manager
+cadabra-lm 1563/tcp # Cadabra License Manager
+# Arthur Castonguay <arthurc at doe.carleton.ca>
+pay-per-view 1564/udp # Pay-Per-View
+pay-per-view 1564/tcp # Pay-Per-View
+# Brian Tung <brian at isi.edu>
+winddlb 1565/udp # WinDD
+winddlb 1565/tcp # WinDD
+# Kelly Sims <kellys at garnet.wv.tek.com>
+corelvideo 1566/udp # CORELVIDEO
+corelvideo 1566/tcp # CORELVIDEO
+# Ming Poon <mingp at corel.ca>
+jlicelmd 1567/udp # jlicelmd
+jlicelmd 1567/tcp # jlicelmd
+# Christian Schormann <100410.3063 at compuserve.com>
+tsspmap 1568/udp # tsspmap
+tsspmap 1568/tcp # tsspmap
+# Paul W. Nelson <nelson at thursby.com>
+ets 1569/udp # ets
+ets 1569/tcp # ets
+# Carstein Seeberg <case at boole.no>
+orbixd 1570/udp # orbixd
+orbixd 1570/tcp # orbixd
+# Bridget Walsh <bwalsh at iona.ie>
+rdb-dbs-disp 1571/udp # Oracle Remote Data Base
+rdb-dbs-disp 1571/tcp # Oracle Remote Data Base
+# <mackin at us.oracle.com>
+chip-lm 1572/udp # Chipcom License Manager
+chip-lm 1572/tcp # Chipcom License Manager
+# Jerry Natowitz <Jerry Natowitz>
+itscomm-ns 1573/udp # itscomm-ns
+itscomm-ns 1573/tcp # itscomm-ns
+# Rich Thompson <richt at watson.ibm.com>
+mvel-lm 1574/udp # mvel-lm
+mvel-lm 1574/tcp # mvel-lm
+# David Bisset <dbisset at mvel.demon.co.uk>
+oraclenames 1575/udp # oraclenames
+oraclenames 1575/tcp # oraclenames
+# P.V.Shivkumar <PSHIVKUM at us.oracle.com>
+moldflow-lm 1576/udp # moldflow-lm
+moldflow-lm 1576/tcp # moldflow-lm
+# Paul Browne <browne at moldflow.com.au>
+hypercube-lm 1577/udp # hypercube-lm
+hypercube-lm 1577/tcp # hypercube-lm
+# Christopher McLendon <cem at hyper.com>
+jacobus-lm 1578/udp # Jacobus License Manager
+jacobus-lm 1578/tcp # Jacobus License Manager
+# Tony Cleveland <tony.cleveland at jacobus.com>
+ioc-sea-lm 1579/udp # ioc-sea-lm
+ioc-sea-lm 1579/tcp # ioc-sea-lm
+# Paul Nelson <paul at ioc-sea.com>
+tn-tl-r2 1580/udp # tn-tl-r2
+tn-tl-r1 1580/tcp # tn-tl-r1
+# Ed Kress <eskress at thinknet.com>
+mil-2045-47001 1581/udp # MIL-2045-47001
+mil-2045-47001 1581/tcp # MIL-2045-47001
+# Eric Whitehill <eawhiteh at itt.com>
+msims 1582/udp # MSIMS
+msims 1582/tcp # MSIMS
+# Glenn Olander <gjo at msi.com>
+simbaexpress 1583/udp # simbaexpress
+simbaexpress 1583/tcp # simbaexpress
+# Betsy Alexander +1 604-681-4549
+tn-tl-fd2 1584/udp # tn-tl-fd2
+tn-tl-fd2 1584/tcp # tn-tl-fd2
+# Ed Kress <eskress at thinknet.com>
+intv 1585/udp # intv
+intv 1585/tcp # intv
+# Dermot Tynand <dtynan at claddagh.ie>
+ibm-abtact 1586/udp # ibm-abtact
+ibm-abtact 1586/tcp # ibm-abtact
+# Sandeep K. Singhal <singhal at CS.Stanford.EDU>
+pra_elmd 1587/udp # pra_elmd
+pra_elmd 1587/tcp # pra_elmd
+# Dennis Mastin <dennis at tasmania.platte.com>
+triquest-lm 1588/udp # triquest-lm
+triquest-lm 1588/tcp # triquest-lm
+# Nand Kumar <nkumar at triquest-da.com>
+vqp 1589/udp # VQP
+vqp 1589/tcp # VQP
+# Keith McCloghrie <kzm at cisco.com>
+gemini-lm 1590/udp # gemini-lm
+gemini-lm 1590/tcp # gemini-lm
+# Tony Sawyer <tonys at gemtech.com>
+ncpm-pm 1591/udp # ncpm-pm
+ncpm-pm 1591/tcp # ncpm-pm
+# Ted Power <tedp at hpinpcb.cup.hp.com>
+commonspace 1592/udp # commonspace
+commonspace 1592/tcp # commonspace
+# Rob Chandhok <chandhok at within.com>
+mainsoft-lm 1593/udp # mainsoft-lm
+mainsoft-lm 1593/tcp # mainsoft-lm
+# Anand Gangadharan <anand at goa.mainsoft.com>
+sixtrak 1594/udp # sixtrak
+sixtrak 1594/tcp # sixtrak
+# Bob Rennie <rjrennie at wizvax.net>
+radio 1595/udp # radio
+radio 1595/tcp # radio
+radio-bc 1596/udp # radio-bc
+radio-sm 1596/tcp # radio-sm
+# Ken Chapman <kchapman at isis.com>
+orbplus-iiop 1597/udp # orbplus-iiop
+orbplus-iiop 1597/tcp # orbplus-iiop
+# Robert A. Kukura <kukura at apollo.hp.com>
+picknfs 1598/udp # picknfs
+picknfs 1598/tcp # picknfs
+# John Lombardo <johnl at picksys.com>
+simbaservices 1599/udp # simbaservices
+simbaservices 1599/tcp # simbaservices
+# Betsy Alexander +1 604-681-4549
+issd 1600/udp #
+issd 1600/tcp #
+aas 1601/udp # aas
+aas 1601/tcp # aas
+# Bob Beard <bobb at lachman.com>
+inspect 1602/udp # inspect
+inspect 1602/tcp # inspect
+# Frank O'Neill <frank at morse.ilo.dec.com>
+picodbc 1603/udp # pickodbc
+picodbc 1603/tcp # pickodbc
+# John Lombardo <johnl at picksys.com>
+icabrowser 1604/udp # icabrowser
+icabrowser 1604/tcp # icabrowser
+# Brad Pedersen <bradp at citrix.com>
+slp 1605/udp # Salutation Manager (Salutation Protocol)
+slp 1605/tcp # Salutation Manager (Salutation Protocol)
+slm-api 1606/udp # Salutation Manager (SLM-API)
+slm-api 1606/tcp # Salutation Manager (SLM-API)
+# Tohru Mori <tmori at VNET.IBM.COM>
+stt 1607/udp # stt
+stt 1607/tcp # stt
+# Ryan Bolz <ryanbo at microsoft.com>
+smart-lm 1608/udp # Smart Corp. License Manager
+smart-lm 1608/tcp # Smart Corp. License Manager
+# Connie Qiu <connie at scdb.com>
+isysg-lm 1609/udp # isysg-lm
+isysg-lm 1609/tcp # isysg-lm
+# Adam Curtin <adam.curtin at isysg.com>
+taurus-wh 1610/udp # taurus-wh
+taurus-wh 1610/tcp # taurus-wh
+# Jeff Moffatt <jeff at taurus.com>
+ill 1611/udp # Inter Library Loan
+ill 1611/tcp # Inter Library Loan
+# Niall Murphy <niallm at orca.ucd.ie>
+netbill-trans 1612/udp # NetBill Transaction Server
+netbill-trans 1612/tcp # NetBill Transaction Server
+netbill-keyrep 1613/udp # NetBill Key Repository
+netbill-keyrep 1613/tcp # NetBill Key Repository
+netbill-cred 1614/udp # NetBill Credential Server
+netbill-cred 1614/tcp # NetBill Credential Server
+netbill-auth 1615/udp # NetBill Authorization Server
+netbill-auth 1615/tcp # NetBill Authorization Server
+netbill-prod 1616/udp # NetBill Product Server
+netbill-prod 1616/tcp # NetBill Product Server
+# Marvin Sirbu <sirbu+ at andrew.cmu.edu>
+nimrod-agent 1617/udp # Nimrod Inter-Agent Communication
+nimrod-agent 1617/tcp # Nimrod Inter-Agent Communication
+# Charles Lynn <clynn at bbn.com>
+skytelnet 1618/udp # skytelnet
+skytelnet 1618/tcp # skytelnet
+# Byron Jones <byronj at bellsouth.net>
+xs-openstorage 1619/udp # xs-openstorage
+xs-openstorage 1619/tcp # xs-openstorage
+# XuiS Software Ltd. <100322.2376 at compuserve.com>
+faxportwinport 1620/udp # faxportwinport
+faxportwinport 1620/tcp # faxportwinport
+# Chris Wells <chris_wells at lansource.com>
+softdataphone 1621/udp # softdataphone
+softdataphone 1621/tcp # softdataphone
+# Dror Gill <drorgi at VNET.IBM.COM>n
+ontime 1622/udp # ontime
+ontime 1622/tcp # ontime
+# Keith Rhodes 810-559-5955
+jaleosnd 1623/udp # jaleosnd
+jaleosnd 1623/tcp # jaleosnd
+# Christian Schormann <100410.3063 at compuserve.com>
+udp-sr-port 1624/udp # udp-sr-port
+udp-sr-port 1624/tcp # udp-sr-port
+# Herb Jensen <HWJensen at nfsrv.avionics.itt.com>
+svs-omagent 1625/udp # svs-omagent
+svs-omagent 1625/tcp # svs-omagent
+# Alberto Berlen <aberlen at VNET.IBM.COM>
+shockwave 1626/udp # Shockwave
+shockwave 1626/tcp # Shockwave
+# Sarah Allen <sallen at macromedia.com>
+t128-gateway 1627/udp # T.128 Gateway
+t128-gateway 1627/tcp # T.128 Gateway
+# Phil May <pm at datcon.co.uk>
+lontalk-norm 1628/udp # LonTalk normal
+lontalk-norm 1628/tcp # LonTalk normal
+lontalk-urgnt 1629/udp # LonTalk urgent
+lontalk-urgnt 1629/tcp # LonTalk urgent
+# Dan Wing <dwing at cisco.com>
+oraclenet8cman 1630/udp # Oracle Net8 Cman
+oraclenet8cman 1630/tcp # Oracle Net8 Cman
+# Tong-Ming Lee <tmlee at us.oracle.com>
+visitview 1631/udp # Visit view
+visitview 1631/tcp # Visit view
+# Tom Whittaker <tomw at ssec.wisc.edu>
+pammratc 1632/udp # PAMMRATC
+pammratc 1632/tcp # PAMMRATC
+pammrpc 1633/udp # PAMMRPC
+pammrpc 1633/tcp # PAMMRPC
+# John Britton <johnb at peakaudio.com>
+loaprobe 1634/udp # Log On America Probe
+loaprobe 1634/tcp # Log On America Probe
+# James Tavares, Log On America <krontor at loa.com>
+edb-server1 1635/udp # EDB Server 1
+edb-server1 1635/tcp # EDB Server 1
+# Carlos Portela <cportela at simple-sw.com>
+cncp 1636/udp # CableNet Control Protocol
+cncp 1636/tcp # CableNet Control Protocol
+cnap 1637/udp # CableNet Admin Protocol
+cnap 1637/tcp # CableNet Admin Protocol
+cnip 1638/udp # CableNet Info Protocol
+cnip 1638/tcp # CableNet Info Protocol
+# Damian Hamill <damian at cablenet.net>
+cert-initiator 1639/udp # cert-initiator
+cert-initiator 1639/tcp # cert-initiator
+cert-responder 1640/udp # cert-responder
+cert-responder 1640/tcp # cert-responder
+# Tom Markson <markson at osmosys.incog.com>
+invision 1641/udp # InVision
+invision 1641/tcp # InVision
+# Christopher Davey <niallocl at quay.ie>
+isis-am 1642/udp # isis-am
+isis-am 1642/tcp # isis-am
+isis-ambc 1643/udp # isis-ambc
+isis-ambc 1643/tcp # isis-ambc
+# Ken Chapman <kchapman at isis.com>
+saiseh 1644/tcp # Satellite-data Acquisition System 4
+# Bill Taylor <sais at ssec.wisc.edu>
+sightline 1645/udp # SightLine
+sightline 1645/tcp # SightLine
+# Stuart J. Newman <stuart.newman at fortel.com>
+sa-msg-port 1646/udp # sa-msg-port
+sa-msg-port 1646/tcp # sa-msg-port
+# Eric Whitehill <eawhiteh at itt.com>
+rsap 1647/udp # rsap
+rsap 1647/tcp # rsap
+# Holger Reif
+# <Holger.Reif at prakinf.tu-ilmenau.de>
+concurrent-lm 1648/udp # concurrent-lm
+concurrent-lm 1648/tcp # concurrent-lm
+# Maggie Brinsford <mjb at concurrent.co.uk>
+kermit 1649/udp # kermit
+kermit 1649/tcp # kermit
+# Frank da Cruz <fdc at watsun.cc.columbia.edu>
+nkd 1650/udp # nkd
+nkd 1650/tcp # nkdn
+shiva_confsrvr 1651/udp # shiva_confsrvr
+shiva_confsrvr 1651/tcp # shiva_confsrvr
+# Mike Horowitz <mah at Shiva.COM>
+xnmp 1652/udp # xnmp
+xnmp 1652/tcp # xnmp
+# Ali Saleh <scomm at cerf.net>
+alphatech-lm 1653/udp # alphatech-lm
+alphatech-lm 1653/tcp # alphatech-lm
+# Joseph Hauk <joseph.hauk at alphatech.com>
+stargatealerts 1654/udp # stargatealerts
+stargatealerts 1654/tcp # stargatealerts
+# Tim Coppernoll
+# <Tim_Coppernoll at ccm.jf.intel.com>
+dec-mbadmin 1655/udp # dec-mbadmin
+dec-mbadmin 1655/tcp # dec-mbadmin
+dec-mbadmin-h 1656/udp # dec-mbadmin-h
+dec-mbadmin-h 1656/tcp # dec-mbadmin-h
+# Nick Shipman <Nick.Shipman at mrmog.reo.dec.com>
+fujitsu-mmpdc 1657/udp # fujitsu-mmpdc
+fujitsu-mmpdc 1657/tcp # fujitsu-mmpdc
+# Katsumi Oomuro <NAE01421 at niftyserve.or.jp>
+sixnetudr 1658/udp # sixnetudr
+sixnetudr 1658/tcp # sixnetudr
+# Bob Rennie <rjrennie at wizvax.net>
+sg-lm 1659/udp # Silicon Grail License Manager
+sg-lm 1659/tcp # Silicon Grail License Manager
+# William R Bishop <wrb at world.std.com>
+skip-mc-gikreq 1660/udp # skip-mc-gikreq
+skip-mc-gikreq 1660/tcp # skip-mc-gikreq
+# Tom Markson <markson at osmosys.incog.com>
+netview-aix-1 1661/udp # netview-aix-1
+netview-aix-1 1661/tcp # netview-aix-1
+netview-aix-2 1662/udp # netview-aix-2
+netview-aix-2 1662/tcp # netview-aix-2
+netview-aix-3 1663/udp # netview-aix-3
+netview-aix-3 1663/tcp # netview-aix-3
+netview-aix-4 1664/udp # netview-aix-4
+netview-aix-4 1664/tcp # netview-aix-4
+netview-aix-5 1665/udp # netview-aix-5
+netview-aix-5 1665/tcp # netview-aix-5
+netview-aix-6 1666/udp # netview-aix-6
+netview-aix-6 1666/tcp # netview-aix-6
+netview-aix-7 1667/udp # netview-aix-7
+netview-aix-7 1667/tcp # netview-aix-7
+netview-aix-8 1668/udp # netview-aix-8
+netview-aix-8 1668/tcp # netview-aix-8
+netview-aix-9 1669/udp # netview-aix-9
+netview-aix-9 1669/tcp # netview-aix-9
+netview-aix-10 1670/udp # netview-aix-10
+netview-aix-10 1670/tcp # netview-aix-10
+netview-aix-11 1671/udp # netview-aix-11
+netview-aix-11 1671/tcp # netview-aix-11
+netview-aix-12 1672/udp # netview-aix-12
+netview-aix-12 1672/tcp # netview-aix-12
+# Martha Crisson
+# <CRISSON at ralvm12.vnet.ibm.com>
+proshare-mc-1 1673/udp # Intel Proshare Multicast
+proshare-mc-1 1673/tcp # Intel Proshare Multicast
+proshare-mc-2 1674/udp # Intel Proshare Multicast
+proshare-mc-2 1674/tcp # Intel Proshare Multicast
+# Mark Lewis <Mark_Lewis at ccm.jf.intel.com>
+pdp 1675/udp # Pacific Data Products
+pdp 1675/tcp # Pacific Data Products
+# Gary Morton <mortong at pacdata.com>
+netcomm2 1676/udp # netcomm2
+netcomm1 1676/tcp # netcomm1
+# Bulent Kasman <BKasman at symantec.com>
+groupwise 1677/udp # groupwise
+groupwise 1677/tcp # groupwise
+# Brent Bradshaw <bbradshaw at novell.com>
+prolink 1678/udp # prolink
+prolink 1678/tcp # prolink
+# Brian Abramson <brianab at soul.tv.tek.com>
+darcorp-lm 1679/udp # darcorp-lm
+darcorp-lm 1679/tcp # darcorp-lm
+# <DARcorp at aol.com>
+microcom-sbp 1680/udp # microcom-sbp
+microcom-sbp 1680/tcp # microcom-sbp
+# Boris B. Maiden <Boris_Maiden at smtp.microcom.com>
+sd-elmd 1681/udp # sd-elmd
+sd-elmd 1681/tcp # sd-elmd
+# Bryan Otey <bwo at softdesk.com>
+lanyon-lantern 1682/udp # lanyon-lantern
+lanyon-lantern 1682/tcp # lanyon-lantern
+# Robin Lewis <robin.lewis at lanyon.com>
+ncpm-hip 1683/udp # ncpm-hip
+ncpm-hip 1683/tcp # ncpm-hip
+# Ken Hearn <hearn at hpindacx.cup.hp.com>
+snaresecure 1684/udp # SnareSecure
+snaresecure 1684/tcp # SnareSecure
+# Marty Batchelder <marty at capres.com>
+n2nremote 1685/udp # n2nremote
+n2nremote 1685/tcp # n2nremote
+# Kin Chan <kchan at net2net.com>
+cvmon 1686/udp # cvmon
+cvmon 1686/tcp # cvmon
+# Carol Ann Krug <carolann at hpmfas3.cup.hp.com>
+nsjtp-ctrl 1687/udp # nsjtp-ctrl
+nsjtp-ctrl 1687/tcp # nsjtp-ctrl
+nsjtp-data 1688/udp # nsjtp-data
+nsjtp-data 1688/tcp # nsjtp-data
+# Orazio Granato <og at wsbgrd01.italy.hp.com>
+firefox 1689/udp # firefox
+firefox 1689/tcp # firefox
+# Mark S. Edwards <marke at firefox.co.uk>
+ng-umds 1690/udp # ng-umds
+ng-umds 1690/tcp # ng-umds
+# Louis E. Simard <76400.3371 at compuserve.com>
+empire-empuma 1691/udp # empire-empuma
+empire-empuma 1691/tcp # empire-empuma
+# Bobby Krupczak <rdk at empiretech.com>
+sstsys-lm 1692/udp # sstsys-lm
+sstsys-lm 1692/tcp # sstsys-lm
+# Yih-Wu Wang <sstsys at ix.netcom.com>
+rrirtr 1693/udp # rrirtr
+rrirtr 1693/tcp # rrirtr
+rrimwm 1694/udp # rrimwm
+rrimwm 1694/tcp # rrimwm
+rrilwm 1695/udp # rrilwm
+rrilwm 1695/tcp # rrilwm
+rrifmm 1696/udp # rrifmm
+rrifmm 1696/tcp # rrifmm
+rrisat 1697/udp # rrisat
+rrisat 1697/tcp # rrisat
+# Allen Briggs <briggs at access.rrinc.com>
+rsvp-encap-1 1698/udp # RSVP-ENCAPSULATION-1
+rsvp-encap-1 1698/tcp # RSVP-ENCAPSULATION-1
+rsvp-encap-2 1699/udp # RSVP-ENCAPSULATION-2
+rsvp-encap-2 1699/tcp # RSVP-ENCAPSULATION-2
+# Bob Braden <braden at isi.edu>
+mps-raft 1700/udp # mps-raft
+mps-raft 1700/tcp # mps-raft
+# Jason Leupen <Jleupen at aol.com>
+l2f 1701/udp l2tp # l2f
+l2f 1701/tcp l2tp # l2f
+# Andy Valencia <vandys at vandys-lap.cisco.com>
+deskshare 1702/udp # deskshare
+deskshare 1702/tcp # deskshare
+# Sarah Thompson <sarah at telergy.com
+hb-engine 1703/udp # hb-engine
+hb-engine 1703/tcp # hb-engine
+# Charles C.L. Chou >cchou at zoom.com>
+bcs-broker 1704/udp # bcs-broker
+bcs-broker 1704/tcp # bcs-broker
+# Andy Warner <andyw at knoware.nl>
+slingshot 1705/udp # slingshot
+slingshot 1705/tcp # slingshot
+# Paul Groarke <paulg at quay.ie>
+jetform 1706/udp # jetform
+jetform 1706/tcp # jetform
+# gdeinsta <gdeinsta at jetform.com>
+vdmplay 1707/udp # vdmplay
+vdmplay 1707/tcp # vdmplay
+# Vadim Lebedev <vadim at magic.fr>
+gat-lmd 1708/udp # gat-lmd
+gat-lmd 1708/tcp # gat-lmd
+# Igor Zaoutine <igor at global-tech.com>
+centra 1709/udp # centra
+centra 1709/tcp # centra
+# Drew Wolff <dwolff at centra.net>
+impera 1710/udp # impera
+impera 1710/tcp # impera
+# Stepehen Campbell <campbell at uniprise.com>
+pptconference 1711/udp # pptconference
+pptconference 1711/tcp # pptconference
+# John Tafoya <johnt at microsoft.com>
+registrar 1712/udp # resource monitoring service
+registrar 1712/tcp # resource monitoring service
+# Ron Lawson <ronaldl at hpindacx.cup.hp.com>
+conferencetalk 1713/udp # ConferenceTalk
+conferencetalk 1713/tcp # ConferenceTalk
+# George Kajos <gkajos at mail1.videoserver.com>
+sesi-lm 1714/udp # sesi-lm
+sesi-lm 1714/tcp # sesi-lm
+houdini-lm 1715/udp # houdini-lm
+houdini-lm 1715/tcp # houdini-lm
+# Paul Breslin <phb at SIDEFX.COM>
+xmsg 1716/udp # xmsg
+xmsg 1716/tcp # xmsg
+# Mark E. Fogle <mefogle at xantel.com>
+fj-hdnet 1717/udp # fj-hdnet
+fj-hdnet 1717/tcp # fj-hdnet
+# Manabu Makino <m-makino at ael.fujitsu.co.jp>
+h323gatedisc 1718/udp # h323gatedisc
+h323gatedisc 1718/tcp # h323gatedisc
+h323gatestat 1719/udp # h323gatestat
+h323gatestat 1719/tcp # h323gatestat
+h323hostcall 1720/udp # h323hostcall
+h323hostcall 1720/tcp # h323hostcall
+# Jim Toga <jtoga at ibeam.jf.intel.com>
+caicci 1721/udp # caicci
+caicci 1721/tcp # caicci
+# Sylvia Scheuren <schsy02 at cai.com>
+hks-lm 1722/udp # HKS License Manager
+hks-lm 1722/tcp # HKS License Manager
+# Michael Wood <wood at althea.hks.com>
+pptp 1723/udp # pptp
+pptp 1723/tcp # pptp
+# Ken Crocker <kcrocker at microsoft.com>
+csbphonemaster 1724/udp # csbphonemaster
+csbphonemaster 1724/tcp # csbphonemaster
+# Mark Kellerhuis <Mark_Kellerhuis at msn.com>
+iden-ralp 1725/udp # iden-ralp
+iden-ralp 1725/tcp # iden-ralp
+# Chris Stanaway <stanaway at comm.mot.com>
+iberiagames 1726/udp # IBERIAGAMES
+iberiagames 1726/tcp # IBERIAGAMES
+# Jose Luis <73374.313 at compuserve.com>
+winddx 1727/udp # winddx
+winddx 1727/tcp # winddx
+# Bill Andrews <billa at vnd.tek.com>
+telindus 1728/udp # TELINDUS
+telindus 1728/tcp # TELINDUS
+# Paul Pyck <papy at telindus.be
+citynl 1729/udp # CityNL License Management
+citynl 1729/tcp # CityNL License Management
+# CityDisc >citydisc at euronet.nl>
+roketz 1730/udp # roketz
+roketz 1730/tcp # roketz
+# Ahti Heinla <ahti at ahti.bluemoon.ee>
+msiccp 1731/udp # MSICCP
+msiccp 1731/tcp # MSICCP
+# Max Morris <maxm at MICROSOFT.com>
+proxim 1732/udp # proxim
+proxim 1732/tcp # proxim
+# Srinivas N. Mogalapalli <srinivas at proxim.com>
+siipat 1733/udp # SIMS - SIIPAT Protocol for Alarm Transmission
+siipat 1733/tcp # SIMS - SIIPAT Protocol for Alarm Transmission
+# Steve Ryckman <sryckman at simsware.com>
+cambertx-lm 1734/udp # Camber Corporation License Management
+cambertx-lm 1734/tcp # Camber Corporation License Management
+# Jeannie Burleson <jeannie at cambertx.com>
+privatechat 1735/udp # PrivateChat
+privatechat 1735/tcp # PrivateChat
+# Louis E. Simard <76400.3371 at CompuServe.COM>
+street-stream 1736/udp # street-stream
+street-stream 1736/tcp # street-stream
+# Glenn Levitt <streetd1 at ix.netcom.com>
+ultimad 1737/udp # ultimad
+ultimad 1737/tcp # ultimad
+# (Michael Lanzetta <hagbard at ultimatech.com>
+gamegen1 1738/udp # GameGen1
+gamegen1 1738/tcp # GameGen1
+# Glen Pearson <GlenP at multigen.com>
+webaccess 1739/udp # webaccess
+webaccess 1739/tcp # webaccess
+# Christian Saether <ChristianS at asymetrix.com>
+encore 1740/udp # encore
+encore 1740/tcp # encore
+# Stuart Button <button at promis.com>
+cisco-net-mgmt 1741/udp # cisco-net-mgmt
+cisco-net-mgmt 1741/tcp # cisco-net-mgmt
+# John McCormack <jmac at cisco.com>
+3Com-nsd 1742/udp # 3Com-nsd
+3Com-nsd 1742/tcp # 3Com-nsd
+# Nitza Steinberg <nitza at isd.3com.com>
+cinegrfx-lm 1743/udp # Cinema Graphics License Manager
+cinegrfx-lm 1743/tcp # Cinema Graphics License Manager
+# Rodney Iwashina <rodney at cyclone.rfx.com>
+ncpm-ft 1744/udp # ncpm-ft
+ncpm-ft 1744/tcp # ncpm-ft
+# Ken Hearn <hearn at hpindacx.cup.hp.com>
+remote-winsock 1745/udp # remote-winsock
+remote-winsock 1745/tcp # remote-winsock
+# Avi Nathan <avin at microsoft.com>
+ftrapid-1 1746/udp # ftrapid-1
+ftrapid-1 1746/tcp # ftrapid-1
+ftrapid-2 1747/udp # ftrapid-2
+ftrapid-2 1747/tcp # ftrapid-2
+# Richard J. Williams <RJW1 at trpo4.tr.unisys.com>
+oracle-em1 1748/udp # oracle-em1
+oracle-em1 1748/tcp # oracle-em1
+# Bob Purvy <bpurvy at us.oracle.com>
+aspen-services 1749/udp # aspen-services
+aspen-services 1749/tcp # aspen-services
+# Mark B. Hurst <mhurst at aspenres.com>
+sslp 1750/udp # Simple Socket Library's PortMaster
+sslp 1750/tcp # Simple Socket Library's PortMaster
+# Dr. Charles E. Campbell Jr.
+# <cec at gryphon.gsfc.nasa.gov>
+swiftnet 1751/udp # SwiftNet
+swiftnet 1751/tcp # SwiftNet
+# Terry Lim <tkl at pentek.com>
+lofr-lm 1752/udp # Leap of Faith Research License Manager
+lofr-lm 1752/tcp # Leap of Faith Research License Manager
+#
+translogic-lm 1753/udp # Translogic License Manager
+translogic-lm 1753/tcp # Translogic License Manager
+# Stan Dallas <stan at translogic.com>
+oracle-em2 1754/udp # oracle-em2
+oracle-em2 1754/tcp # oracle-em2
+# Bob Purvy <bpurvy at us.oracle.com>
+ms-streaming 1755/udp # ms-streaming
+ms-streaming 1755/tcp # ms-streaming
+# Bret O'Rourke
+capfast-lmd 1756/udp # capfast-lmd
+capfast-lmd 1756/tcp # capfast-lmd
+# Chuck Neal <chuck at phase3.com>
+cnhrp 1757/udp # cnhrp
+cnhrp 1757/tcp # cnhrp
+# William Stoye <wstoye at atml.co.uk>
+tftp-mcast 1758/udp # tftp-mcast
+tftp-mcast 1758/tcp # tftp-mcast
+# Tom Emberson <tom at lanworks.com>
+spss-lm 1759/udp # SPSS License Manager
+spss-lm 1759/tcp # SPSS License Manager
+# Tex Hull <tex at spss.com>
+www-ldap-gw 1760/udp # www-ldap-gw
+www-ldap-gw 1760/tcp # www-ldap-gw
+# Nick Emery <Nick.Emery at altavista.digital.com>
+cft-0 1761/udp # cft-0
+cft-0 1761/tcp # cft-0
+cft-1 1762/udp # cft-1
+cft-1 1762/tcp # cft-1
+cft-2 1763/udp # cft-2
+cft-2 1763/tcp # cft-2
+cft-3 1764/udp # cft-3
+cft-3 1764/tcp # cft-3
+cft-4 1765/udp # cft-4
+cft-4 1765/tcp # cft-4
+cft-5 1766/udp # cft-5
+cft-5 1766/tcp # cft-5
+cft-6 1767/udp # cft-6
+cft-6 1767/tcp # cft-6
+cft-7 1768/udp # cft-7
+cft-7 1768/tcp # cft-7
+# Martine Marchand 16 1 46 59 24 84
+bmc-net-adm 1769/udp # bmc-net-adm
+bmc-net-adm 1769/tcp # bmc-net-adm
+# Cameron Haight <cameron_haight at bmc.com>
+bmc-net-svc 1770/udp # bmc-net-svc
+bmc-net-svc 1770/tcp # bmc-net-svc
+# Cameron Haight <cameron_haight at bmc.com>bmc-net-svc
+vaultbase 1771/udp # vaultbase
+vaultbase 1771/tcp # vaultbase
+# Jose A. Sesin <sesin at vaultbase.com>
+essweb-gw 1772/udp # EssWeb Gateway
+essweb-gw 1772/tcp # EssWeb Gateway
+# Bob Nattenberg <bnattenberg at arborsoft.com>
+kmscontrol 1773/udp # KMSControl
+kmscontrol 1773/tcp # KMSControl
+# Roy Chastain <roy at kmsys.com>
+global-dtserv 1774/udp # global-dtserv
+global-dtserv 1774/tcp # global-dtserv
+# Nicholas Davies <N.Davies at globalcomm.co.uk>
+# 1775/tcp
+femis 1776/udp # Federal Emergency Management Information System
+femis 1776/tcp # Federal Emergency Management Information System
+# Larry Gerhardstein <lh_gerhardstein at pnl.gov>
+powerguardian 1777/udp # powerguardian
+powerguardian 1777/tcp # powerguardian
+# Charles Bennett <chuck at benatong.com>
+prodigy-intrnet 1778/udp # prodigy-internet
+prodigy-intrnet 1778/tcp # prodigy-internet
+# Bob Dedrick <bob at staff.prodigy.com>
+pharmasoft 1779/udp # pharmasoft
+pharmasoft 1779/tcp # pharmasoft
+# Ola Strandberg <Ola.Strandberg at pharmasoft.se>
+dpkeyserv 1780/udp # dpkeyserv
+dpkeyserv 1780/tcp # dpkeyserv
+# Yasunari Gon Yamasita <yamasita at omronsoft.co.jp>
+answersoft-lm 1781/udp # answersoft-lm
+answersoft-lm 1781/tcp # answersoft-lm
+# James A. Brewster <jimbrew at answersoft.com>
+hp-hcip 1782/udp # hp-hcip
+hp-hcip 1782/tcp # hp-hcip
+# Allen Baker <abaker at boi.hp.com>
+# 1783 Decomissioned Port 04/14/00, ms
+# <naonao at kikaku.mmp.fujitsu.co.jp>
+finle-lm 1784/udp # Finle License Manager
+finle-lm 1784/tcp # Finle License Manager
+# Dongling Wang <dongling at finle.com>
+windlm 1785/udp # Wind River Systems License Manager
+windlm 1785/tcp # Wind River Systems License Manager
+# Will Dere <will at wrs.com>
+funk-logger 1786/udp # funk-logger
+funk-logger 1786/tcp # funk-logger
+funk-license 1787/udp # funk-license
+funk-license 1787/tcp # funk-license
+# Cimarron Boozer <cboozer at funk.com>
+# Eric Wilde <eric at funk.com>
+psmond 1788/udp # psmond
+psmond 1788/tcp # psmond
+# Will Golson <golson at fc.hp.com>
+hello 1789/udp # hello
+hello 1789/tcp # hello
+# D. J. Bernstein <djb at koobera.math.uic.edu>
+nmsp 1790/udp # Narrative Media Streaming Protocol
+nmsp 1790/tcp # Narrative Media Streaming Protocol
+# Paul Santinelli, Jr. <psantinelli at narrative.com>
+ea1 1791/udp # EA1
+ea1 1791/tcp # EA1
+# Kirk MacLean <kmaclean at ea.com>
+ibm-dt-2 1792/udp # ibm-dt-2
+ibm-dt-2 1792/tcp # ibm-dt-2
+# Sam Borman <sam_borman at uk.ibm.com>
+rsc-robot 1793/udp # rsc-robot
+rsc-robot 1793/tcp # rsc-robot
+# Andrew Jay Schneider <ajs at relsoft.com>
+cera-bcm 1794/udp # cera-bcm
+cera-bcm 1794/tcp # cera-bcm
+# Leo Moesgaard <leo_moesgaard at dk.ibm.com>
+dpi-proxy 1795/udp # dpi-proxy
+dpi-proxy 1795/tcp # dpi-proxy
+# Charles Gordon <cgordon at digprod.com>
+vocaltec-admin 1796/udp # Vocaltec Server Administration
+vocaltec-admin 1796/tcp # Vocaltec Server Administration
+# Scott Petrack <Scott_Petrack at vocaltec.com>
+uma 1797/udp # UMA
+uma 1797/tcp # UMA
+# Martin Kirk <m.kirk at opengroup.org>
+etp 1798/udp # Event Transfer Protocol
+etp 1798/tcp # Event Transfer Protocol
+# Mike Wray <mjw at hplb.hpl.hp.com>
+netrisk 1799/udp # NETRISK
+netrisk 1799/tcp # NETRISK
+# Kevin Green <Kevin_Green at tds.com>
+ansys-lm 1800/udp # ANSYS-License manager
+ansys-lm 1800/tcp # ANSYS-License manager
+# Suzanne Lorrin <sml at ansyspo.ansys.com>
+msmq 1801/udp # Microsoft Message Que
+msmq 1801/tcp # Microsoft Message Que
+# Amnon Horowitz <amnonh at MICROSOFT.com>
+concomp1 1802/udp # ConComp1
+concomp1 1802/tcp # ConComp1
+# Ed Vincent <@edv at concomp.com>
+hp-hcip-gwy 1803/udp # HP-HCIP-GWY
+hp-hcip-gwy 1803/tcp # HP-HCIP-GWY
+# Allen Baker <abaker at boi.hp.com>
+enl 1804/udp # ENL
+enl 1804/tcp # ENL
+# Brian Olson <BOlson at veritas.com>
+enl-name 1805/udp # ENL-Name
+enl-name 1805/tcp # ENL-Name
+# Brian Olson <BOlson at veritas.com>
+musiconline 1806/udp # Musiconline
+musiconline 1806/tcp # Musiconline
+# Craig Weeks <cweeks at syspace.co.uk>
+fhsp 1807/udp # Fujitsu Hot Standby Protocol
+fhsp 1807/tcp # Fujitsu Hot Standby Protocol
+# Eiki Iwata (eiki at nd.net.fujitsu.co.jp>
+oracle-vp2 1808/udp # Oracle-VP2
+oracle-vp2 1808/tcp # Oracle-VP2
+# Craig Fowler <cfowler at us.oracle.com>
+oracle-vp1 1809/udp # Oracle-VP1
+oracle-vp1 1809/tcp # Oracle-VP1
+# Craig Fowler <cfowler at us.oracle.com>
+jerand-lm 1810/udp # Jerand License Manager
+jerand-lm 1810/tcp # Jerand License Manager
+# Robert Monat <jerand at jerand.com>
+scientia-sdb 1811/udp # Scientia-SDB
+scientia-sdb 1811/tcp # Scientia-SDB
+# Ian Miller <Ian_Miller at scientia.com>
+radius 1812/udp # RADIUS
+radius 1812/tcp # RADIUS
+# Carl Rigney <cdr at livingston.com>
+radius-acct 1813/udp # RADIUS Accounting
+radius-acct 1813/tcp # RADIUS Accounting
+# Carl Rigney <cdr at livingston.com>
+tdp-suite 1814/udp # TDP Suite
+tdp-suite 1814/tcp # TDP Suite
+# Rob Lockhart <rob.lockhart at mot.com>
+mmpft 1815/udp # MMPFT
+mmpft 1815/tcp # MMPFT
+# Ralf Muckenhirn <FAX: 49-7622-398200>
+# <Phone: 49-7622-3980>
+harp 1816/udp # HARP
+harp 1816/tcp # HARP
+# Bjorn Chambless <bjorn at cs.pdx.edu>
+rkb-oscs 1817/udp # RKB-OSCS
+rkb-oscs 1817/tcp # RKB-OSCS
+# Robert Kevin Breton <BOBBRETON at HOTMAIL.COM>
+etftp 1818/udp # Enhanced Trivial File Transfer Protocol
+etftp 1818/tcp # Enhanced Trivial File Transfer Protocol
+# William Polites <wpolites at mitre.org>
+plato-lm 1819/udp # Plato License Manager
+plato-lm 1819/tcp # Plato License Manager
+# Mark Morris <mim at ermuk.com>
+mcagent 1820/udp # mcagent
+mcagent 1820/tcp # mcagent
+# Ryoichi Shinohara <shinohara at VNET.IBM.COM>
+donnyworld 1821/udp # donnyworld
+donnyworld 1821/tcp # donnyworld
+# Don Oliver <don at donnyworld.com>
+es-elmd 1822/udp # es-elmd
+es-elmd 1822/tcp # es-elmd
+# David Duncan <dduncan at es.com>
+unisys-lm 1823/udp # Unisys Natural Language License Manager
+unisys-lm 1823/tcp # Unisys Natural Language License Manager
+# Raymond A. Diedrichs <rayd at slu.tr.unisys.com>
+metrics-pas 1824/udp # metrics-pas
+metrics-pas 1824/tcp # metrics-pas
+# Tom Haapanen <tomh at metrics.com>
+direcpc-video 1825/udp # DirecPC Video
+direcpc-video 1825/tcp # DirecPC Video
+# Chris Kerrigan <ckerrigan at hns.com>
+ardt 1826/udp # ARDT
+ardt 1826/tcp # ARDT
+# Mike Goddard <mike.goddard at ardent.com.au>
+asi 1827/udp # ASI
+asi 1827/tcp # ASI
+# Bob Tournoux <bob.tournoux at usiny.mail.abb.com>
+itm-mcell-u 1828/udp # itm-mcell-u
+itm-mcell-u 1828/tcp # itm-mcell-u
+# Miles O'Neal <meo at us.itmasters.com>
+optika-emedia 1829/udp # Optika eMedia
+optika-emedia 1829/tcp # Optika eMedia
+# Daryle DeBalski <ddebalski at optika.com>
+net8-cman 1830/udp # Oracle Net8 CMan Admin
+net8-cman 1830/tcp # Oracle Net8 CMan Admin
+# Shuvayu Kanjilal
+myrtle 1831/udp # Myrtle
+myrtle 1831/tcp # Myrtle
+# Ron Achin <RAchin at genscan.com>
+tht-treasure 1832/udp # ThoughtTreasure
+tht-treasure 1832/tcp # ThoughtTreasure
+# Erik Mueller <erik at signiform.com>
+udpradio 1833/udp # udpradio
+udpradio 1833/tcp # udpradio
+# Guus Sliepen <guus at warande3094.warande.uu.nl>
+ardusuni 1834/udp # ARDUS Unicast
+ardusuni 1834/tcp # ARDUS Unicast
+ardusmul 1835/udp # ARDUS Multicast
+ardusmul 1835/tcp # ARDUS Multicast
+# Toshikatsu Ito <ito-t at pfu.co.jp>
+ste-smsc 1836/udp # ste-smsc
+ste-smsc 1836/tcp # ste-smsc
+# Tom Snauwaert <tom.snauwaert at st-electronics.be>
+csoft1 1837/udp # csoft1
+csoft1 1837/tcp # csoft1
+# John Coll <john at csoft.co.uk>
+talnet 1838/udp # TALNET
+talnet 1838/tcp # TALNET
+# Aaron Lav <aaron at taltrade.com>
+netopia-vo1 1839/udp # netopia-vo1
+netopia-vo1 1839/tcp # netopia-vo1
+netopia-vo2 1840/udp # netopia-vo2
+netopia-vo2 1840/tcp # netopia-vo2
+netopia-vo3 1841/udp # netopia-vo3
+netopia-vo3 1841/tcp # netopia-vo3
+netopia-vo4 1842/udp # netopia-vo4
+netopia-vo4 1842/tcp # netopia-vo4
+netopia-vo5 1843/udp # netopia-vo5
+netopia-vo5 1843/tcp # netopia-vo5
+# Marc Epard <marc at netopia.com>
+direcpc-dll 1844/udp # DirecPC-DLL
+direcpc-dll 1844/tcp # DirecPC-DLL
+# Chris Kerrigan <ckerrigan at hns.com>
+altalink 1845/udp # altalink
+altalink 1845/tcp # altalink
+# Alberto Raydan <alberto at altasol.com>
+tunstall-pnc 1846/udp # Tunstall PNC
+tunstall-pnc 1846/tcp # Tunstall PNC
+# Robert M. Moore <r_moore at tunstall.co.uk>
+slp-notify 1847/udp # SLP Notification
+slp-notify 1847/tcp # SLP Notification
+# James Kempf <james.kempf at sun.com>
+fjdocdist 1848/udp # fjdocdist
+fjdocdist 1848/tcp # fjdocdist
+# Yuichi Ohiwa <y-ohiwa at ael.fujitsu.co.jp>
+alpha-sms 1849/udp # ALPHA-SMS
+alpha-sms 1849/tcp # ALPHA-SMS
+# Benjamin Grimm <bg at webnetix.de>
+gsi 1850/udp # GSI
+gsi 1850/tcp # GSI
+# William Mullaney <mullanwi at usa.net>
+ctcd 1851/udp # ctcd
+ctcd 1851/tcp # ctcd
+# John Ryan <john at cybertrace.com>
+virtual-time 1852/udp # Virtual Time
+virtual-time 1852/tcp # Virtual Time
+# Angie S. Morner <webmaster at dsbcpas.com>
+vids-avtp 1853/udp # VIDS-AVTP
+vids-avtp 1853/tcp # VIDS-AVTP
+# Sascha Kuemmel <kuemmel at vidsoft.de>
+buddy-draw 1854/udp # Buddy Draw
+buddy-draw 1854/tcp # Buddy Draw
+# Marvin Shin <president at medialingo.com>
+fiorano-rtrsvc 1855/udp # Fiorano RtrSvc
+fiorano-rtrsvc 1855/tcp # Fiorano RtrSvc
+fiorano-msgsvc 1856/udp # Fiorano MsgSvc
+fiorano-msgsvc 1856/tcp # Fiorano MsgSvc
+# Albert Holt <alberth at fiorano.com>
+datacaptor 1857/udp # DataCaptor
+datacaptor 1857/tcp # DataCaptor
+# Steven M. Forrester <StevenF at CapsuleTech.com>
+privateark 1858/udp # PrivateArk
+privateark 1858/tcp # PrivateArk
+# Ronen Zoran <ronenz at cyber-ark.com>
+gammafetchsvr 1859/udp # Gamma Fetcher Server
+gammafetchsvr 1859/tcp # Gamma Fetcher Server
+# Cnaan Aviv <cnaan at gammasite.com>
+sunscalar-svc 1860/udp # SunSCALAR Services
+sunscalar-svc 1860/tcp # SunSCALAR Services
+# Sanjay Radia <srradia at kasumbi.Eng.Sun.COM>
+lecroy-vicp 1861/udp # LeCroy VICP
+lecroy-vicp 1861/tcp # LeCroy VICP
+# Anthony Cake <anthonyrc at lecroy.com>
+techra-server 1862/udp # techra-server
+techra-server 1862/tcp # techra-server
+# Roy Lyseng <roy.lyseng at maxware.no>
+msnp 1863/udp # MSNP
+msnp 1863/tcp # MSNP
+# William Lai <wlai at microsoft.com>
+paradym-31port 1864/udp # Paradym 31 Port
+paradym-31port 1864/tcp # Paradym 31 Port
+# David Wooden <dwooden at wizdom.com>
+entp 1865/udp # ENTP
+entp 1865/tcp # ENTP
+# Seiko Epson <Ishida.Hitoshi at exc.epson.co.jp>
+swrmi 1866/udp # swrmi
+swrmi 1866/tcp # swrmi
+# Jun Yoshii <yoshii at ael.fujitsu.co.jp>
+udrive 1867/udp # UDRIVE
+udrive 1867/tcp # UDRIVE
+# Robby Walker <webmaster at cd-lab.com>
+viziblebrowser 1868/udp # VizibleBrowser
+viziblebrowser 1868/tcp # VizibleBrowser
+# Jimmy Talbot <jtalbot at vizible.com>
+yestrader 1869/udp # YesTrader
+yestrader 1869/tcp # YesTrader
+# Robert Bryan <bbryan at yestrader.com>
+sunscalar-dns 1870/udp # SunSCALAR DNS Service
+sunscalar-dns 1870/tcp # SunSCALAR DNS Service
+# Sanjay Radia <srradia at kasumbi.Eng.Sun.COM>
+canocentral0 1871/udp # Cano Central 0
+canocentral0 1871/tcp # Cano Central 0
+canocentral1 1872/udp # Cano Central 1
+canocentral1 1872/tcp # Cano Central 1
+# Mark McNamara <markm at research.canon.com.au>
+fjmpjps 1873/udp # Fjmpjps
+fjmpjps 1873/tcp # Fjmpjps
+fjswapsnp 1874/udp # Fjswapsnp
+fjswapsnp 1874/tcp # Fjswapsnp
+# Y. Ohiwa <y-ohiwa at ael.fujitsu.co.jp>
+westell-stats 1875/udp # westell stats
+westell-stats 1875/tcp # westell stats
+# Thomas McCabe <tmcca at westell.com>
+ewcappsrv 1876/udp # ewcappsrv
+ewcappsrv 1876/tcp # ewcappsrv
+# Howard Yin <howard.yin at ericsson.com>
+hp-webqosdb 1877/udp # hp-webqosdb
+hp-webqosdb 1877/tcp # hp-webqosdb
+# Kim Scott <kims at cup.hp.com>
+drmsmc 1878/udp # drmsmc
+drmsmc 1878/tcp # drmsmc
+# Katsuhiko Abe <kabe at hst.fujitsu.co.jp>
+nettgain-nms 1879/udp # NettGain NMS
+nettgain-nms 1879/tcp # NettGain NMS
+# Dr. Yair Shapira <yair at flashnetworks.com>
+vsat-control 1880/udp # Gilat VSAT Control
+vsat-control 1880/tcp # Gilat VSAT Control
+# Yariv Kaplan <yarivk at gilat.com>
+ibm-mqseries2 1881/udp # IBM WebSphere MQ
+ibm-mqseries2 1881/tcp # IBM WebSphere MQ
+# Richard Maxwell <richard_maxwell at uk.ibm.com>
+ecsqdmn 1882/udp # ecsqdmn
+ecsqdmn 1882/tcp # ecsqdmn
+# Paul Wissmiller <Paul.Wissmiller at ca.com>
+ibm-mqisdp 1883/udp # IBM MQSeries SCADA
+ibm-mqisdp 1883/tcp # IBM MQSeries SCADA
+# Andy Stanford-Clark <andysc at uk.ibm.com>
+idmaps 1884/udp # Internet Distance Map Svc
+idmaps 1884/tcp # Internet Distance Map Svc
+# Sugih Jamim <jamin at eecs.umich.edu>
+vrtstrapserver 1885/udp # Veritas Trap Server
+vrtstrapserver 1885/tcp # Veritas Trap Server
+# Russell Thrasher <rthrashe at veritas.com>
+leoip 1886/udp # Leonardo over IP
+leoip 1886/tcp # Leonardo over IP
+# Dietmar Finkler <d.finkler at hermstedt.de>
+filex-lport 1887/udp # FileX Listening Port
+filex-lport 1887/tcp # FileX Listening Port
+# Megan Woods <meganwoods at datafast.net.au>
+ncconfig 1888/udp # NC Config Port
+ncconfig 1888/tcp # NC Config Port
+# Simon Parker <simon.j.parker at philips.com>
+unify-adapter 1889/udp # Unify Web Adapter Service
+unify-adapter 1889/tcp # Unify Web Adapter Service
+# Duane Gibson <ianaportmaster at unify.com>
+wilkenlistener 1890/udp # wilkenListener
+wilkenlistener 1890/tcp # wilkenListener
+# Wilken GmbH <fy at wilken.de>
+childkey-notif 1891/udp # ChildKey Notification
+childkey-notif 1891/tcp # ChildKey Notification
+childkey-ctrl 1892/udp # ChildKey Control
+childkey-ctrl 1892/tcp # ChildKey Control
+# Ivan Berardinelli <ivan at gestweb.com>
+elad 1893/udp # ELAD Protocol
+elad 1893/tcp # ELAD Protocol
+# Franco Milan <franco at eladit.com>
+o2server-port 1894/udp # O2Server Port
+o2server-port 1894/tcp # O2Server Port
+# Tim Howard <timothygh at hotmail.com>
+##### Microsoft (unoffically) using 1895 #####
+b-novative-ls 1896/udp # b-novative license server
+b-novative-ls 1896/tcp # b-novative license server
+# Matthias Riese <Matthias.Riese at b-novative.de>
+metaagent 1897/udp # MetaAgent
+metaagent 1897/tcp # MetaAgent
+# Stephane Vinsot <vinsot at enatel.com>
+cymtec-port 1898/udp # Cymtec secure management
+cymtec-port 1898/tcp # Cymtec secure management
+# Michael Mester <mmester at cymtec.com>
+mc2studios 1899/udp # MC2Studios
+mc2studios 1899/tcp # MC2Studios
+# Michael Coon <michael at thecube.com>
+ssdp 1900/udp # SSDP
+ssdp 1900/tcp # SSDP
+# Yaron Goland <yarong at microsoft.com>
+fjicl-tep-a 1901/udp # Fujitsu ICL Terminal Emulator Program A
+fjicl-tep-a 1901/tcp # Fujitsu ICL Terminal Emulator Program A
+# Bob Lyon <bl at oasis.icl.co.uk>
+fjicl-tep-b 1902/udp # Fujitsu ICL Terminal Emulator Program B
+fjicl-tep-b 1902/tcp # Fujitsu ICL Terminal Emulator Program B
+# Bob Lyon <bl at oasis.icl.co.uk>
+linkname 1903/udp # Local Link Name Resolution
+linkname 1903/tcp # Local Link Name Resolution
+# Dan Harrington <dth at lucent.com>
+fjicl-tep-c 1904/udp # Fujitsu ICL Terminal Emulator Program C
+fjicl-tep-c 1904/tcp # Fujitsu ICL Terminal Emulator Program C
+# Bob Lyon <bl at oasis.icl.co.uk>
+sugp 1905/udp # Secure UP.Link Gateway Protocol
+sugp 1905/tcp # Secure UP.Link Gateway Protocol
+# Peter King <king at uplanet.com>
+tpmd 1906/udp # TPortMapperReq
+tpmd 1906/tcp # TPortMapperReq
+# Sheila Devins <sheila_devins at VNET.IBM.COM>
+intrastar 1907/udp # IntraSTAR
+intrastar 1907/tcp # IntraSTAR
+# Peter Schoenberger <ps at teles.de>
+dawn 1908/udp # Dawn
+dawn 1908/tcp # Dawn
+# Michael Crawford <michaelc at travsoft.com>
+global-wlink 1909/udp # Global World Link
+global-wlink 1909/tcp # Global World Link
+# Nicholas Davies <N.Davies at globalcomm.co.uk>
+ultrabac 1910/udp # UltraBac Software communications port
+ultrabac 1910/tcp # UltraBac Software communications port
+# Paul Bunn <iana at ultrabac.com>
+mtp 1911/udp # Starlight Networks Multimedia Transport Protocol
+mtp 1911/tcp # Starlight Networks Multimedia Transport Protocol
+# Bruce Lieberman <brucel at iserver.starlight.com>
+rhp-iibp 1912/udp # rhp-iibp
+rhp-iibp 1912/tcp # rhp-iibp
+# George Nachman
+# Tom Lake <tlake at m-ware.com>
+armadp 1913/udp # armadp
+armadp 1913/tcp # armadp
+# Kevin Welton <Kevin.Welton at armltd.co.uk>
+elm-momentum 1914/udp # Elm-Momentum
+elm-momentum 1914/tcp # Elm-Momentum
+# Willie Wu <willie at mds.com>
+facelink 1915/udp # FACELINK
+facelink 1915/tcp # FACELINK
+# J.H. Hermans <j.h.hermans at hiscom.nl>
+persona 1916/udp # Persoft Persona
+persona 1916/tcp # Persoft Persona
+# Tom Spidell <spidell at persoft.com>
+noagent 1917/udp # nOAgent
+noagent 1917/tcp # nOAgent
+# Martin Bestmann <martin at datawatch.de>
+can-nds 1918/udp # Candle Directory Service - NDS
+can-nds 1918/tcp # Candle Directory Service - NDS
+can-dch 1919/udp # Candle Directory Service - DCH
+can-dch 1919/tcp # Candle Directory Service - DCH
+can-ferret 1920/udp # Candle Directory Service - FERRET
+can-ferret 1920/tcp # Candle Directory Service - FERRET
+# Dannis Yang <Dannis_Yang at candle.com>
+noadmin 1921/udp # NoAdmin
+noadmin 1921/tcp # NoAdmin
+# Martin Bestmann <martin at datawatch.de>
+tapestry 1922/udp # Tapestry
+tapestry 1922/tcp # Tapestry
+# Ken Oliver <koliver at anritsu.com>
+spice 1923/udp # SPICE
+spice 1923/tcp # SPICE
+# Nicholas Chua <nick at sendit.se>
+xiip 1924/udp # XIIP
+xiip 1924/tcp # XIIP
+# Alain Robert <Alain.Robert at HMRinc.com>
+discovery-port 1925/udp # Surrogate Discovery Port
+discovery-port 1925/tcp # Surrogate Discovery Port
+# Keith Thompson <keith.thompson at sun.com>
+egs 1926/udp # Evolution Game Server
+egs 1926/tcp # Evolution Game Server
+# Simon Butcher <simonb at alien.net.au>
+videte-cipc 1927/udp # Videte CIPC Port
+videte-cipc 1927/tcp # Videte CIPC Port
+# Videte IT <info at videte.com>
+emsd-port 1928/udp # Expnd Maui Srvr Dscovr
+emsd-port 1928/tcp # Expnd Maui Srvr Dscovr
+# Edo Yahav <standards at expand.com>
+bandwiz-system 1929/udp # Bandwiz System - Server
+bandwiz-system 1929/tcp # Bandwiz System - Server
+# Joseph Weihs <yossi at bandwiz.com>
+driveappserver 1930/udp # Drive AppServer
+driveappserver 1930/tcp # Drive AppServer
+# Andrew Johnson
+# <andrew.johnson at bliss-support.demon.co.uk>
+amdsched 1931/udp # AMD SCHED
+amdsched 1931/tcp # AMD SCHED
+# Michael Walsh <mww at warwick.net>
+ctt-broker 1932/udp # CTT Broker
+ctt-broker 1932/tcp # CTT Broker
+# Jens Edlund <edlund at speech.kth.se>
+xmapi 1933/udp # IBM LM MT Agent
+xmapi 1933/tcp # IBM LM MT Agent
+xaapi 1934/udp # IBM LM Appl Agent
+xaapi 1934/tcp # IBM LM Appl Agent
+# Helga Wolin <hwolin at us.ibm.com>
+macromedia-fcs 1935/udp # Macromedia Flash Communications server MX
+macromedia-fcs 1935/tcp # Macromedia Flash Communications Server MX
+# Pritham Shetty <pritham at macromedia.com>
+jetcmeserver 1936/udp # JetCmeServer Server Port
+jetcmeserver 1936/tcp # JetCmeServer Server Port
+jwserver 1937/udp # JetVWay Server Port
+jwserver 1937/tcp # JetVWay Server Port
+jwclient 1938/udp # JetVWay Client Port
+jwclient 1938/tcp # JetVWay Client Port
+jvserver 1939/udp # JetVision Server Port
+jvserver 1939/tcp # JetVision Server Port
+jvclient 1940/udp # JetVision Client Port
+jvclient 1940/tcp # JetVision Client Port
+# Stephen Tsun <stsun at jetstream.com>
+dic-aida 1941/udp # DIC-Aida
+dic-aida 1941/tcp # DIC-Aida
+# Frans S.C. Witte <fscwitte at dicgroep.nl>
+res 1942/udp # Real Enterprise Service
+res 1942/tcp # Real Enterprise Service
+# Bob Janssen <bob at res.nl>
+beeyond-media 1943/udp # Beeyond Media
+beeyond-media 1943/tcp # Beeyond Media
+# Bob Deblier <bob at virtualunlimited.com>
+close-combat 1944/udp # close-combat
+close-combat 1944/tcp # close-combat
+# David Hua <davhua at microsoft.com>
+dialogic-elmd 1945/udp # dialogic-elmd
+dialogic-elmd 1945/tcp # dialogic-elmd
+# Roger Kay <r.kay at nz.dialogic.com>
+tekpls 1946/udp # tekpls
+tekpls 1946/tcp # tekpls
+# Brian Abramson <brianab at vnd.tek.com>
+hlserver 1947/udp # hlserver
+hlserver 1947/tcp # hlserver
+# Michael Zzunke <mzunke at fast-ag.de>
+eye2eye 1948/udp # eye2eye
+eye2eye 1948/tcp # eye2eye
+# Trevor Bell <Trevor at iguana.iosoftware.com>
+ismaeasdaqlive 1949/udp # ISMA Easdaq Live
+ismaeasdaqlive 1949/tcp # ISMA Easdaq Live
+ismaeasdaqtest 1950/udp # ISMA Easdaq Test
+ismaeasdaqtest 1950/tcp # ISMA Easdaq Test
+# Stephen Dunne <sdun at isma.co.uk>
+bcs-lmserver 1951/udp # bcs-lmserver
+bcs-lmserver 1951/tcp # bcs-lmserver
+# Andy Warner <andyw at knoware.nl>
+mpnjsc 1952/udp # mpnjsc
+mpnjsc 1952/tcp # mpnjsc
+# Takenori Miyahara <miyahara at pfu.co.jp>
+rapidbase 1953/udp # Rapid Base
+rapidbase 1953/tcp # Rapid Base
+# Antoni Wolski <antoni.wolski at vtt.fi>
+abr-basic 1954/udp # ABR-Basic Data
+abr-basic 1954/tcp # ABR-Basic Data
+abr-secure 1955/udp # ABR-Secure Data
+abr-secure 1955/tcp # ABR-Secure Data
+# Aero9 - Graham Wooden <graham at aero9.com>
+vrtl-vmf-ds 1956/udp # Vertel VMF DS
+vrtl-vmf-ds 1956/tcp # Vertel VMF DS
+# Alan Akahoshi <alan-akahoshi at vertel.com>
+unix-status 1957/udp # unix-status
+unix-status 1957/tcp # unix-status
+# Thomas Erskine <erskine at sourceworks.com>
+dxadmind 1958/udp # CA Administration Daemon
+dxadmind 1958/tcp # CA Administration Daemon
+# John Birrell <birjo99 at cai.com>
+simp-all 1959/udp # SIMP Channel
+simp-all 1959/tcp # SIMP Channel
+# Tim Hunnewell <thunnewell at pinna.com>
+nasmanager 1960/udp # Merit DAC NASmanager
+nasmanager 1960/tcp # Merit DAC NASmanager
+# Richard S. Conto <rsc at merit.edu>
+bts-appserver 1961/udp # BTS APPSERVER
+bts-appserver 1961/tcp # BTS APPSERVER
+# Carl Obsorn <carl_osborn at sabre.com>
+biap-mp 1962/udp # BIAP-MP
+biap-mp 1962/tcp # BIAP-MP
+# Chuck Shotton <cshotton at biap.com>
+webmachine 1963/udp # WebMachine
+webmachine 1963/tcp # WebMachine
+# Tim Jowers <Tim.Jowers at ColumbiaSC.NCR.com>
+solid-e-engine 1964/udp # SOLID E ENGINE
+solid-e-engine 1964/tcp # SOLID E ENGINE
+# Ari Valtanen <ari.valtanen at solidtech.com>
+tivoli-npm 1965/udp # Tivoli NPM
+tivoli-npm 1965/tcp # Tivoli NPM
+# Ivana Cuozzo <Ivana.Cuozzo at tivoli.com>
+slush 1966/udp # Slush
+slush 1966/tcp # Slush
+# Damien Miller <damien at ibs.com.au>
+sns-quote 1967/udp # SNS Quote
+sns-quote 1967/tcp # SNS Quote
+# Robert Ellman <rellman at calicotech.com>
+lipsinc 1968/udp # LIPSinc
+lipsinc 1968/tcp # LIPSinc
+lipsinc1 1969/udp # LIPSinc 1
+lipsinc1 1969/tcp # LIPSinc 1
+# Robert Armington <rarmington at lipsinc.com>
+netop-rc 1970/udp # NetOp Remote Control
+netop-rc 1970/tcp # NetOp Remote Control
+netop-school 1971/udp # NetOp School
+netop-school 1971/tcp # NetOp School
+# NetOp Technical Support <support at danware.dk>
+intersys-cache 1972/udp # Cache
+intersys-cache 1972/tcp # Cache
+# Mark Hanson <markh at intersys.com>
+dlsrap 1973/udp # Data Link Switching Remote Access Protocol
+dlsrap 1973/tcp # Data Link Switching Remote Access Protocol
+# Steve T. Chiang <schiang at cisco.com>
+drp 1974/udp # DRP
+drp 1974/tcp # DRP
+# Richard Alan Johnson <raj at cisco.com>
+tcoflashagent 1975/udp # TCO Flash Agent
+tcoflashagent 1975/tcp # TCO Flash Agent
+tcoregagent 1976/udp # TCO Reg Agent
+tcoregagent 1976/tcp # TCO Reg Agent
+tcoaddressbook 1977/udp # TCO Address Book
+tcoaddressbook 1977/tcp # TCO Address Book
+# Allan Panitch <allanp at tcosoft.com>
+unisql 1978/udp # UniSQL
+unisql 1978/tcp # UniSQL
+unisql-java 1979/udp # UniSQL Java
+unisql-java 1979/tcp # UniSQL Java
+# Keith Yarbrough <kyarbro at windtraveller.com>
+pearldoc-xact 1980/udp # PearlDoc XACT
+pearldoc-xact 1980/tcp # PearlDoc XACT
+# Chris Vertonghen <chrisv at pearldoc.com>
+p2pq 1981/udp # p2pQ
+p2pq 1981/tcp # p2pQ
+# Warren Alexander <warren at chameleon-creative.co.uk>
+estamp 1982/udp # Evidentiary Timestamp
+estamp 1982/tcp # Evidentiary Timestamp
+# Todd Glassey <todd.glassey at att.net>
+lhtp 1983/udp # Loophole Test Protocol
+lhtp 1983/tcp # Loophole Test Protocol
+# Kade Hansson <kade_fh at postoffice.utas.edu.au>
+bb 1984/udp # BB
+bb 1984/tcp # BB
+# Sean MacGuire <sean at maclawran.ca>
+hsrp 1985/udp # Hot Standby Router Protocol
+hsrp 1985/tcp # Hot Standby Router Protocol
+# Phil Morton <pmorton at cisco.com>
+licensedaemon 1986/udp # cisco license management
+licensedaemon 1986/tcp # cisco license management
+tr-rsrb-p1 1987/udp # cisco RSRB Priority 1 port
+tr-rsrb-p1 1987/tcp # cisco RSRB Priority 1 port
+tr-rsrb-p2 1988/udp # cisco RSRB Priority 2 port
+tr-rsrb-p2 1988/tcp # cisco RSRB Priority 2 port
+tr-rsrb-p3 1989/udp # cisco RSRB Priority 3 port
+tr-rsrb-p3 1989/tcp # cisco RSRB Priority 3 port
+# The following entry records an unassigned but widespread use
+mshnet 1989/udp # MHSnet system
+mshnet 1989/tcp # MHSnet system
+# Bob Kummerfeld <bob at sarad.cs.su.oz.au>
+stun-p1 1990/udp # cisco STUN Priority 1 port
+stun-p1 1990/tcp # cisco STUN Priority 1 port
+stun-p2 1991/udp # cisco STUN Priority 2 port
+stun-p2 1991/tcp # cisco STUN Priority 2 port
+stun-p3 1992/udp # cisco STUN Priority 3 port
+stun-p3 1992/tcp # cisco STUN Priority 3 port
+# The following entry records an unassigned but widespread use
+ipsendmsg 1992/udp # IPsendmsg
+ipsendmsg 1992/tcp # IPsendmsg
+# Bob Kummerfeld <bob at sarad.cs.su.oz.au>
+snmp-tcp-port 1993/udp # cisco SNMP TCP port
+snmp-tcp-port 1993/tcp # cisco SNMP TCP port
+stun-port 1994/udp # cisco serial tunnel port
+stun-port 1994/tcp # cisco serial tunnel port
+perf-port 1995/udp # cisco perf port
+perf-port 1995/tcp # cisco perf port
+tr-rsrb-port 1996/udp # cisco Remote SRB port
+tr-rsrb-port 1996/tcp # cisco Remote SRB port
+gdp-port 1997/udp # cisco Gateway Discovery Protocol
+gdp-port 1997/tcp # cisco Gateway Discovery Protocol
+x25-svc-port 1998/udp # cisco X.25 service (XOT)
+x25-svc-port 1998/tcp # cisco X.25 service (XOT)
+tcp-id-port 1999/udp # cisco identification port
+tcp-id-port 1999/tcp # cisco identification port
+#
+callbook 2000/udp # callbook
+callbook 2000/tcp # callbook
+# Devon Bowen <bowen at cs.buffalo.edu>
+wizard 2001/udp # curry
+dc 2001/tcp #
+globe 2002/udp #
+globe 2002/tcp #
+emce 2004/udp # CCWS mm conf
+mailbox 2004/tcp #
+oracle 2005/udp #
+berknet 2005/tcp #
+raid-cc 2006/udp # raid
+invokator 2006/tcp #
+raid-am 2007/udp #
+dectalk 2007/tcp #
+terminaldb 2008/udp #
+conf 2008/tcp #
+whosockami 2009/udp #
+news 2009/tcp #
+pipe_server 2010/udp #
+search 2010/tcp #
+servserv 2011/udp #
+raid-cc 2011/tcp # raid
+raid-ac 2012/udp #
+ttyinfo 2012/tcp #
+raid-cd 2013/udp #
+raid-am 2013/tcp #
+raid-sf 2014/udp #
+troff 2014/tcp #
+raid-cs 2015/udp #
+cypress 2015/tcp #
+bootserver 2016/udp #
+bootserver 2016/tcp #
+bootclient 2017/udp #
+cypress-stat 2017/tcp #
+rellpack 2018/udp #
+terminaldb 2018/tcp #
+about 2019/udp #
+whosockami 2019/tcp #
+xinupageserver 2020/udp #
+xinupageserver 2020/tcp #
+xinuexpansion1 2021/udp #
+servexec 2021/tcp #
+xinuexpansion2 2022/udp #
+down 2022/tcp #
+xinuexpansion3 2023/udp #
+xinuexpansion3 2023/tcp #
+xinuexpansion4 2024/udp #
+xinuexpansion4 2024/tcp #
+xribs 2025/udp #
+ellpack 2025/tcp #
+scrabble 2026/udp #
+scrabble 2026/tcp #
+shadowserver 2027/udp #
+shadowserver 2027/tcp #
+submitserver 2028/udp #
+submitserver 2028/tcp #
+# 2029 Unassigned
+device2 2030/udp #
+device2 2030/tcp #
+# 2031 Unassigned
+blackboard 2032/udp #
+blackboard 2032/tcp #
+glogger 2033/udp #
+glogger 2033/tcp #
+scoremgr 2034/udp #
+scoremgr 2034/tcp #
+imsldoc 2035/udp #
+imsldoc 2035/tcp #
+# 2036 Unassigned
+p2plus 2037/udp # P2plus Application Server
+p2plus 2037/tcp # P2plus Application Server
+# Thomas Boerkel <tb at ap-ag.com>
+objectmanager 2038/udp #
+objectmanager 2038/tcp #
+# 2039 Unassigned
+lam 2040/udp #
+lam 2040/tcp #
+interbase 2041/udp #
+interbase 2041/tcp #
+isis 2042/udp # isis
+isis 2042/tcp # isis
+isis-bcast 2043/udp # isis-bcast
+isis-bcast 2043/tcp # isis-bcast
+# Ken Chapman <kchapman at isis.com>
+rimsl 2044/udp #
+rimsl 2044/tcp #
+cdfunc 2045/udp #
+cdfunc 2045/tcp #
+sdfunc 2046/udp #
+sdfunc 2046/tcp #
+dls 2047/udp #
+dls 2047/tcp #
+dls-monitor 2048/udp #
+dls-monitor 2048/tcp #
+# <== NOTE Conflict on 2049 !
+shilp 2049/udp nfs #
+shilp 2049/tcp nfs #
+# Brent Callaghan <brent at terra.eng.sun.com>
+av-emb-config 2050/udp # Avaya EMB Config Port
+av-emb-config 2050/tcp # Avaya EMB Config Port
+# John Yeager <johnyeager at avaya.com>
+epnsdp 2051/udp # EPNSDP
+epnsdp 2051/tcp # EPNSDP
+# Hiroyasu Ogata <Ogata.Hiroyasu at exc.epson.co.jp>
+clearvisn 2052/udp # clearVisn Services Port
+clearvisn 2052/tcp # clearVisn Services Port
+# Dave Lyons <dlyons at dnpg.com>
+lot105-ds-upd 2053/udp # Lot105 DSuper Updates
+lot105-ds-upd 2053/tcp # Lot105 DSuper Updates
+# Piers Scannell <iana-form at lot105.com>
+weblogin 2054/udp # Weblogin Port
+weblogin 2054/tcp # Weblogin Port
+# Diego Saravia <dsa at unsa.edu.ar>
+iop 2055/udp # Iliad-Odyssey Protocol
+iop 2055/tcp # Iliad-Odyssey Protocol
+# Bruce Lueckenhoff <brucelu at cisco.com>
+omnisky 2056/udp # OmniSky Port
+omnisky 2056/tcp # OmniSky Port
+# Oren Hurvitz <oren at omnisky.com>
+rich-cp 2057/udp # Rich Content Protocol
+rich-cp 2057/tcp # Rich Content Protocol
+# Ronen Vainish <ronen at digitalfountain.com>
+newwavesearch 2058/udp # NewWaveSearchables RMI
+newwavesearch 2058/tcp # NewWaveSearchables RMI
+# Thomas Kerkau <Thomas.Kerkau at io-software.com>
+bmc-messaging 2059/udp # BMC Messaging Service
+bmc-messaging 2059/tcp # BMC Messaging Service
+# Roger Huebner <Roger_Huebner at bmc.com>
+teleniumdaemon 2060/udp # Telenium Daemon IF
+teleniumdaemon 2060/tcp # Telenium Daemon IF
+# Nick Woronuk <nick.woronuk at megasys.com>
+netmount 2061/udp # NetMount
+netmount 2061/tcp # NetMount
+# Alex Oberlander <alexo at netmount.com>
+icg-swp 2062/udp # ICG SWP Port
+icg-swp 2062/tcp # ICG SWP Port
+icg-bridge 2063/udp # ICG Bridge Port
+icg-bridge 2063/tcp # ICG Bridge Port
+icg-iprelay 2064/udp # ICG IP Relay Port
+icg-iprelay 2064/tcp # ICG IP Relay Port
+# Steve Quintana <steve at icgresearch.com>
+dlsrpn 2065/udp # Data Link Switch Read Port Number
+dlsrpn 2065/tcp # Data Link Switch Read Port Number
+# Amir Peless <amirp at radware.co.il>
+# 2066 Unassigned
+dlswpn 2067/udp # Data Link Switch Write Port Number
+dlswpn 2067/tcp # Data Link Switch Write Port Number
+# Amir Peless <amirp at radware.co.il>
+avauthsrvprtcl 2068/udp # Avocent AuthSrv Protocol
+avauthsrvprtcl 2068/tcp # Avocent AuthSrv Protocol
+# Steven W. Clark <sclark at equinox.com>
+event-port 2069/udp # HTTP Event Port
+event-port 2069/tcp # HTTP Event Port
+# Larry Emlich <larry.emlich at compaq.com>
+ah-esp-encap 2070/udp # AH and ESP Encapsulated in UDP packet
+ah-esp-encap 2070/tcp # AH and ESP Encapsulated in UDP packet
+# Amy Weaver <aweaver at vpnet.com>
+acp-port 2071/udp # Axon Control Protocol
+acp-port 2071/tcp # Axon Control Protocol
+# Christiaan Simons <christiaan.simons at axon.nl>
+msync 2072/udp # GlobeCast mSync
+msync 2072/tcp # GlobeCast mSync
+# Piers Scannell <piers at globecastne.com>
+gxs-data-port 2073/udp # DataReel Database Socket
+gxs-data-port 2073/tcp # DataReel Database Socket
+# Douglas M. Gaer <doug at datareel.com>
+vrtl-vmf-sa 2074/udp # Vertel VMF SA
+vrtl-vmf-sa 2074/tcp # Vertel VMF SA
+# Alan Akahoshi <alan-akahoshi at vertel.com>
+newlixengine 2075/udp # Newlix ServerWare Engine
+newlixengine 2075/tcp # Newlix ServerWare Engine
+newlixconfig 2076/udp # Newlix JSPConfig
+newlixconfig 2076/tcp # Newlix JSPConfig
+# Jean-Serge Gagnon <jean-serge.gagnon at newlix.com>
+trellisagt 2077/udp # TrelliSoft Agent
+trellisagt 2077/tcp # TrelliSoft Agent
+trellissvr 2078/udp # TrelliSoft Server
+trellissvr 2078/tcp # TrelliSoft Server
+# Justin R. Bendich <bendich at TrelliSoft.com>
+idware-router 2079/udp # IDWARE Router Port
+idware-router 2079/tcp # IDWARE Router Port
+# Zdenek Kolba <zdenek.kolba at id-karta.cz>
+autodesk-nlm 2080/udp # Autodesk NLM (FLEXlm)
+autodesk-nlm 2080/tcp # Autodesk NLM (FLEXlm)
+# Greg Suppes <greg.suppes at autodesk.com>
+kme-trap-port 2081/udp # KME PRINTER TRAP PORT
+kme-trap-port 2081/tcp # KME PRINTER TRAP PORT
+# Masakatsu Matsuo <masa at sdsft.kme.mei.co.jp>
+infowave 2082/udp # Infowave Mobiltiy Server
+infowave 2082/tcp # Infowave Mobility Server
+# Kaz Kylheku <kkylheku at infowave.com>
+# 2083-2085 Unassigned
+gnunet 2086/udp # GNUnet
+gnunet 2086/tcp # GNUnet
+# Christian Grothoff <grothoff at cs.purdue.edu> October 2002
+eli 2087/udp # ELI - Event Logging Integration
+eli 2087/tcp # ELI - Event Logging Integration
+# Maya Zimerman <mayaz at radware.co.il>
+# 2088 Unassigned
+sep 2089/udp # Security Encapsulation Protocol - SEP
+sep 2089/tcp # Security Encapsulation Protocol - SEP
+# Maya Zimerman <mayaz at radware.co.il>
+lrp 2090/udp # Load Report Protocol
+lrp 2090/tcp # Load Report Protocol
+# Amir Peless <amirp at radware.co.il>
+prp 2091/udp # PRP
+prp 2091/tcp # PRP
+# Amir Peless <amirp at radware.co.il>
+descent3 2092/udp # Descent 3
+descent3 2092/tcp # Descent 3
+# Kevin Bentley <Kevin at outrage.com>
+nbx-cc 2093/udp # NBX CC
+nbx-cc 2093/tcp # NBX CC
+nbx-au 2094/udp # NBX AU
+nbx-au 2094/tcp # NBX AU
+nbx-ser 2095/udp # NBX SER
+nbx-ser 2095/tcp # NBX SER
+nbx-dir 2096/udp # NBX DIR
+nbx-dir 2096/tcp # NBX DIR
+# Henry Houh <hhouh at nbxcorp.com>
+jetformpreview 2097/udp # Jet Form Preview
+jetformpreview 2097/tcp # Jet Form Preview
+# Zygmunt Wiercioch <zyg at jetform.com>
+dialog-port 2098/udp # Dialog Port
+dialog-port 2098/tcp # Dialog Port
+# Joseph Mathew <mjoseph at dosa.cisco.com>
+h2250-annex-g 2099/udp # H.225.0 Annex G
+h2250-annex-g 2099/tcp # H.225.0 Annex G
+# Gur Kimchi <gur.kimchi at vocaltec.com>
+amiganetfs 2100/udp # Amiga Network Filesystem
+amiganetfs 2100/tcp # Amiga Network Filesystem
+# Rudi Chiarito <nutello at sweetness.com>
+rtcm-sc104 2101/udp # rtcm-sc104
+rtcm-sc104 2101/tcp # rtcm-sc104
+# Wolfgang Rupprecht <wolfgang at wsrcc.com>
+zephyr-srv 2102/udp # Zephyr server
+zephyr-srv 2102/tcp # Zephyr server
+zephyr-clt 2103/udp # Zephyr serv-hm connection
+zephyr-clt 2103/tcp # Zephyr serv-hm connection
+zephyr-hm 2104/udp # Zephyr hostmanager
+zephyr-hm 2104/tcp # Zephyr hostmanager
+# Greg Hudson <zephyr-bugs at mit.edu>
+minipay 2105/udp # MiniPay
+minipay 2105/tcp # MiniPay
+# Amir Herzberg <amirh at vnet.ibm.com>
+mzap 2106/udp # MZAP
+mzap 2106/tcp # MZAP
+# Dave Thaler <dthaler at microsoft.com>
+bintec-admin 2107/udp # BinTec Admin
+bintec-admin 2107/tcp # BinTec Admin
+# Thomas Schmidt <ts at bintec.de>
+comcam 2108/udp # Comcam
+comcam 2108/tcp # Comcam
+# Don Gilbreath <don at comcam.net>
+ergolight 2109/udp # Ergolight
+ergolight 2109/tcp # Ergolight
+# Jindra Ryvola <jryvola at ledalite.com>
+umsp 2110/udp # UMSP
+umsp 2110/tcp # UMSP
+# Alexander Bogdanov <alexander_bgd at softhome.net>
+dsatp 2111/udp # DSATP
+dsatp 2111/tcp # DSATP
+# Ralph Beck <beck at altaworks.com>
+idonix-metanet 2112/udp # Idonix MetaNet
+idonix-metanet 2112/tcp # Idonix MetaNet
+# Paul Harrison <paulh at idonix.co.uk>
+hsl-storm 2113/udp # HSL StoRM
+hsl-storm 2113/tcp # HSL StoRM
+# Jost Faganel <jost.faganel at hermes.si>
+newheights 2114/udp # NEWHEIGHTS
+newheights 2114/tcp # NEWHEIGHTS
+# Michael Levy <ml at nh.ca>
+kdm 2115/udp # Key Distribution Manager
+kdm 2115/tcp # Key Distribution Manager
+# Mike Little <mike.little at GDC4S.com>
+ccowcmr 2116/udp # CCOWCMR
+ccowcmr 2116/tcp # CCOWCMR
+# Mark Morwood <markm at sentillion.com>
+mentaclient 2117/udp # MENTACLIENT
+mentaclient 2117/tcp # MENTACLIENT
+mentaserver 2118/udp # MENTASERVER
+mentaserver 2118/tcp # MENTASERVER
+# Ilan Shlosberg <ilan at mentasoftware.com>
+gsigatekeeper 2119/udp # GSIGATEKEEPER
+gsigatekeeper 2119/tcp # GSIGATEKEEPER
+# Steve Tuecke <tuecke at mcs.anl.gov>
+qencp 2120/udp # Quick Eagle Networks CP
+qencp 2120/tcp # Quick Eagle Networks CP
+# Santa Dasu <Santa_Dasu at quickeagle.com>
+scientia-ssdb 2121/udp # SCIENTIA-SSDB
+scientia-ssdb 2121/tcp # SCIENTIA-SSDB
+# Ian Miller <Ian_Miller at scientia.com>
+caupc-remote 2122/udp # CauPC Remote Control
+caupc-remote 2122/tcp # CauPC Remote Control
+# Environics Oy <pasi.nuutinmaki at environics.fi>
+gtp-control 2123/udp # GTP-Control Plane (3GPP)
+gtp-control 2123/tcp # GTP-Control Plane (3GPP)
+# Alessio Casati <a.casati at computer.org>
+elatelink 2124/udp # ELATELINK
+elatelink 2124/tcp # ELATELINK
+# Tim Lawrence <lawrence at tao-group.com>
+lockstep 2125/udp # LOCKSTEP
+lockstep 2125/tcp # LOCKSTEP
+# Karl Forster <kforster at lockstep.com>
+pktcable-cops 2126/udp # PktCable-COPS
+pktcable-cops 2126/tcp # PktCable-COPS
+# Glenn Russell <grussell at cablelabs.com>
+index-pc-wb 2127/udp # INDEX-PC-WB
+index-pc-wb 2127/tcp # INDEX-PC-WB
+# James David Fisher <jfisher1 at avaya.com>
+net-steward 2128/udp # Net Steward Control
+net-steward 2128/tcp # Net Steward Control
+# Martin Norman <martin at ndl.co.uk>
+cs-live 2129/udp # cs-live.com
+cs-live 2129/tcp # cs-live.com
+# Matt Lachance <matt at cs-live.com>
+swc-xds 2130/udp # SWC-XDS
+swc-xds 2130/tcp # SWC-XDS
+# Peter Zurich <peter.zurich at swc.com>
+avantageb2b 2131/udp # Avantageb2b
+avantageb2b 2131/tcp # Avantageb2b
+# Avi Software <srobert at logava.com>
+avail-epmap 2132/udp # AVAIL-EPMAP
+avail-epmap 2132/tcp # AVAIL-EPMAP
+# Mark Armstrong <avail at pacbell.net>
+zymed-zpp 2133/udp # ZYMED-ZPP
+zymed-zpp 2133/tcp # ZYMED-ZPP
+# Gregg Welker <greggw at zmi.com>
+avenue 2134/udp # AVENUE
+avenue 2134/tcp # AVENUE
+# Jason Cater <jason at ncsmags.com>
+gris 2135/udp # Grid Resource Information Server
+gris 2135/tcp # Grid Resource Information Server
+# Steve Tuecke <tuecke at mcs.anl.gov>
+appworxsrv 2136/udp # APPWORXSRV
+appworxsrv 2136/tcp # APPWORXSRV
+# Fred McLain <fmclain at appworx.com>
+connect 2137/udp # CONNECT
+connect 2137/tcp # CONNECT
+# Reid Ligon <reid at connectrf.com>
+unbind-cluster 2138/udp # UNBIND-CLUSTER
+unbind-cluster 2138/tcp # UNBIND-CLUSTER
+# Francois Harvey <securiweb at pandore.qc.ca>
+ias-auth 2139/udp # IAS-AUTH
+ias-auth 2139/tcp # IAS-AUTH
+ias-reg 2140/udp # IAS-REG
+ias-reg 2140/tcp # IAS-REG
+ias-admind 2141/udp # IAS-ADMIND
+ias-admind 2141/tcp # IAS-ADMIND
+# Baiju V. Patel <Baiju.v.patel at intel.com>
+tdm-over-ip 2142/udp # TDM-OVER-IP
+tdm-over-ip 2142/tcp # TDM-OVER-IP
+# Tal Gilad <tal_g at rad.co.il>
+lv-jc 2143/udp # Live Vault Job Control
+lv-jc 2143/tcp # Live Vault Job Control
+lv-ffx 2144/udp # Live Vault Fast Object Transfer
+lv-ffx 2144/tcp # Live Vault Fast Object Transfer
+lv-pici 2145/udp # Live Vault Remote Diagnostic Console Support
+lv-pici 2145/tcp # Live Vault Remote Diagnostic Console Support
+lv-not 2146/udp # Live Vault Admin Event Notification
+lv-not 2146/tcp # Live Vault Admin Event Notification
+lv-auth 2147/udp # Live Vault Authentication
+lv-auth 2147/tcp # Live Vault Authentication
+# Ted Hess <thess at livevault.com>
+veritas-ucl 2148/udp # VERITAS UNIVERSAL COMMUNICATION LAYER
+veritas-ucl 2148/tcp # VERITAS UNIVERSAL COMMUNICATION LAYER
+# Songlin Ren <ren at veritas.com>
+acptsys 2149/udp # ACPTSYS
+acptsys 2149/tcp # ACPTSYS
+# Michael Lekias <admin at psdesign.com.au>
+dynamic3d 2150/udp # DYNAMIC3D
+dynamic3d 2150/tcp # DYNAMIC3D
+# Tobias Wegner <wegner at novagate.de>
+docent 2151/udp # DOCENT
+docent 2151/tcp # DOCENT
+# Hali Lindbloom <halil at docent.com>
+gtp-user 2152/udp # GTP-User Plane (3GPP)
+gtp-user 2152/tcp # GTP-User Plane (3GPP)
+# Alessio Casati <a.casati at computer.org>
+# 2153-2158 Unassigned
+gdbremote 2159/udp # GDB Remote Debug Port
+gdbremote 2159/tcp # GDB Remote Debug Port
+# Nigel Stephens <nigel at algor.co.uk>
+apc-2160 2160/udp # APC 2160
+apc-2160 2160/tcp # APC 2160
+# American Power Conversion <ports at apcc.com>
+apc-2161 2161/udp # APC 2161
+apc-2161 2161/tcp # APC 2161
+# American Power Conversion <ports at apcc.com>
+navisphere 2162/udp # Navisphere
+navisphere 2162/tcp # Navisphere
+navisphere-sec 2163/udp # Navisphere Secure
+navisphere-sec 2163/tcp # Navisphere Secure
+# Andreas Bauer <bauer_andreas at emc.com>
+ddns-v3 2164/udp # Dynamic DNS Version 3
+ddns-v3 2164/tcp # Dynamic DNS Version 3
+# Alan Yates <alany at ay.com.au>
+x-bone-api 2165/udp # X-Bone API
+x-bone-api 2165/tcp # X-Bone API
+# Joe Touch <touch at isi.edu>
+iwserver 2166/udp # iwserver
+iwserver 2166/tcp # iwserver
+# Fred Surr <quest_iana at oz.quest.com>
+raw-serial 2167/udp # Raw Async Serial Link
+raw-serial 2167/tcp # Raw Async Serial Link
+# Benjamin Green <benjamin at lh.co.nz>
+# 2168-2179 Unassigned
+mc-gt-srv 2180/udp # Millicent Vendor Gateway Server
+mc-gt-srv 2180/tcp # Millicent Vendor Gateway Server
+# Steve Glassman <steveg at pa.dec.com>
+eforward 2181/udp # eforward
+eforward 2181/tcp # eforward
+# Greg Pringle <admin at corvedia.com>
+# 2182-2189 Unassigned
+tivoconnect 2190/udp # TiVoConnect Beacon
+tivoconnect 2190/tcp # TiVoConnect Beacon
+# Jeffrey J. Peters <jpeters at tivo.com> August 2002
+tvbus 2191/udp # TvBus Messaging
+tvbus 2191/tcp # TvBus Messaging
+# Brian W. Beach <brian at tivo.com> January 2003
+# 2192-2199 Unassigned
+ici 2200/udp # ICI
+ici 2200/tcp # ICI
+# Brent Hines <brent.hines at unisys.com>
+ats 2201/udp # Advanced Training System Program
+ats 2201/tcp # Advanced Training System Program
+# (Need contact info)
+imtc-map 2202/udp # Int. Multimedia Teleconferencing Cosortium
+imtc-map 2202/tcp # Int. Multimedia Teleconferencing Cosortium
+# Pat Galvin <pgalvin at databeam.com>
+kali 2213/udp # Kali
+kali 2213/tcp # Kali
+# Jay Cotton <JAY at calc.vet.uga.edu>
+netiq 2220/udp # NetIQ End2End
+netiq 2220/tcp # NetIQ End2End
+# Gary Weichinger <gary.weichinger at netiq.com>
+rockwell-csp1 2221/udp # Rockwell CSP1
+rockwell-csp1 2221/tcp # Rockwell CSP1
+rockwell-csp2 2222/udp # Rockwell CSP2
+rockwell-csp2 2222/tcp # Rockwell CSP2
+rockwell-csp3 2223/udp # Rockwell CSP3
+rockwell-csp3 2223/tcp # Rockwell CSP3
+# Brian Batke <babatke at ra.rockwell.com>
+#
+ivs-video 2232/udp # IVS Video default
+ivs-video 2232/tcp # IVS Video default
+# Thierry Turletti <Thierry.Turletti at sophia.inria.fr>
+infocrypt 2233/udp # INFOCRYPT
+infocrypt 2233/tcp # INFOCRYPT
+# Erica Liu <liue at isolation.com>
+directplay 2234/udp # DirectPlay
+directplay 2234/tcp # DirectPlay
+# Ajay Jindal <ajayj at microsoft.com>
+sercomm-wlink 2235/udp # Sercomm-WLink
+sercomm-wlink 2235/tcp # Sercomm-WLink
+# Melinda Tsao <melinda at tpe1.sercomm.com.tw>
+nani 2236/udp # Nani
+nani 2236/tcp # Nani
+# Steve Benoit <sbenoi01 at eng.eds.com>
+optech-port1-lm 2237/udp # Optech Port1 License Manager
+optech-port1-lm 2237/tcp # Optech Port1 License Manager
+# Gerard Cannie <jcannie at opticaltech.com>
+aviva-sna 2238/udp # AVIVA SNA SERVER
+aviva-sna 2238/tcp # AVIVA SNA SERVER
+# Vick Keshishian <vickenK at 192.219.82.71>
+imagequery 2239/udp # Image Query
+imagequery 2239/tcp # Image Query
+# Charles Jacobs <cjacobs at numinous.com>
+recipe 2240/udp # RECIPe
+recipe 2240/tcp # RECIPe
+# Charlie Limoges <charlie.limoges at gd-cs.com>
+ivsd 2241/udp # IVS Daemon
+ivsd 2241/tcp # IVS Daemon
+# Thierry Turletti
+# <Thierry.Turletti at sophia.inria.fr>
+foliocorp 2242/udp # Folio Remote Server
+foliocorp 2242/tcp # Folio Remote Server
+# Pat Mcgowan <pmcgowan at folio.com>
+magicom 2243/udp # Magicom Protocol
+magicom 2243/tcp # Magicom Protocol
+# Yossi Appleboum <yossia at magicom.co.il>
+nmsserver 2244/udp # NMS Server
+nmsserver 2244/tcp # NMS Server
+# Dmitry Krasnonosenkikh
+# <Dmitry_Krasnonosenkih at nmss.com>
+hao 2245/udp # HaO
+hao 2245/tcp # HaO
+# Panic Ride <panicride at hao.org>
+pc-mta-addrmap 2246/udp # PacketCable MTA Addr Map
+pc-mta-addrmap 2246/tcp # PacketCable MTA Addr Map
+# Dave Maxwell <d.maxwell at cablelabs.com>
+# 2247 Unassigned
+ums 2248/udp # User Management Service
+ums 2248/tcp # User Management Service
+# Andrew Crockford
+# <andrew.crockford at modus-interactive.co.uk>
+rfmp 2249/udp # RISO File Manager Protocol
+rfmp 2249/tcp # RISO File Manager Protocol
+# Shinji Yamanaka <syamanaka at jci.co.jp>
+remote-collab 2250/udp # remote-collab
+remote-collab 2250/tcp # remote-collab
+# Richard Walters <walters at cs.ucdavis.edu>
+dif-port 2251/udp # Distributed Framework Port
+dif-port 2251/tcp # Distributed Framework Port
+# Sebastien Lambla <lambla at bouygtel.com>
+njenet-ssl 2252/udp # NJENET using SSL
+njenet-ssl 2252/tcp # NJENET using SSL
+# Hans U Schmidt <schmidth at de.ibm.com>
+dtv-chan-req 2253/udp # DTV Channel Request
+dtv-chan-req 2253/tcp # DTV Channel Request
+# Richard Hodges <rh at matriplex.com>
+seispoc 2254/udp # Seismic P.O.C. Port
+seispoc 2254/tcp # Seismic P.O.C. Port
+# Robert Reimiller <bob at certsoft.com>
+vrtp 2255/udp # VRTP - ViRtue Transfer Protocol
+vrtp 2255/tcp # VRTP - ViRtue Transfer Protocol
+# Max Fudim <fudim at virtue3d.com>
+# 2256-2259 Unassigned
+apc-2260 2260/udp # APC 2260
+apc-2260 2260/tcp # APC 2260
+# American Power Conversion <ports at apcc.com> February 2002
+# 2261-2278 Unassigned
+xmquery 2279/udp # xmquery
+xmquery 2279/tcp # xmquery
+# Niels Christiansen <nchris at austin.ibm.com>
+lnvpoller 2280/udp # LNVPOLLER
+lnvpoller 2280/tcp # LNVPOLLER
+lnvconsole 2281/udp # LNVCONSOLE
+lnvconsole 2281/tcp # LNVCONSOLE
+lnvalarm 2282/udp # LNVALARM
+lnvalarm 2282/tcp # LNVALARM
+lnvstatus 2283/udp # LNVSTATUS
+lnvstatus 2283/tcp # LNVSTATUS
+lnvmaps 2284/udp # LNVMAPS
+lnvmaps 2284/tcp # LNVMAPS
+lnvmailmon 2285/udp # LNVMAILMON
+lnvmailmon 2285/tcp # LNVMAILMON
+# John Payne <jpayne at lotus.com>
+nas-metering 2286/udp # NAS-Metering
+nas-metering 2286/tcp # NAS-Metering
+# Steven Sawkins <ssawkins at symantec.com>
+dna 2287/udp # DNA
+dna 2287/tcp # DNA
+# Tung Nguyen <dash at ricochet.net>
+netml 2288/udp # NETML
+netml 2288/tcp # NETML
+# Jochen Hansmeyer <cjh at krypton.de>
+# 2289-2293 Unassigned
+konshus-lm 2294/udp # Konshus License Manager (FLEX)
+konshus-lm 2294/tcp # Konshus License Manager (FLEX)
+# Francois Painchaud <fpainchaud at konshus.com>
+advant-lm 2295/udp # Advant License Manager
+advant-lm 2295/tcp # Advant License Manager
+# Lars-Goran Magnusson
+# <lars-goran.magnusson at seisy.mail.abb.com>
+theta-lm 2296/udp # Theta License Manager (Rainbow)
+theta-lm 2296/tcp # Theta License Manager (Rainbow)
+# David Thompson <theta at theta-ent.com>
+d2k-datamover1 2297/udp # D2K DataMover 1
+d2k-datamover1 2297/tcp # D2K DataMover 1
+d2k-datamover2 2298/udp # D2K DataMover 2
+d2k-datamover2 2298/tcp # D2K DataMover 2
+# Eric Lan <elan at d2k.com>
+pc-telecommute 2299/udp # PC Telecommute
+pc-telecommute 2299/tcp # PC Telecommute
+# John Daniel Bonamico <jbonamico at symantec.com>
+cvmmon 2300/udp # CVMMON
+cvmmon 2300/tcp # CVMMON
+# Roger Kumpf <kumpf at cup.hp.com>
+cpq-wbem 2301/udp # Compaq HTTP
+cpq-wbem 2301/tcp # Compaq HTTP
+# Scott Shaffer <scott.shaffer at hp.com>
+binderysupport 2302/udp # Bindery Support
+binderysupport 2302/tcp # Bindery Support
+# Narasimha Rao N. <nnarasimharao at novell.com>
+proxy-gateway 2303/udp # Proxy Gateway
+proxy-gateway 2303/tcp # Proxy Gateway
+# Paul Funk <paul at funk.com>
+attachmate-uts 2304/udp # Attachmate UTS
+attachmate-uts 2304/tcp # Attachmate UTS
+# George Gianelos <Georgegi at Attachmate.com>
+mt-scaleserver 2305/udp # MT ScaleServer
+mt-scaleserver 2305/tcp # MT ScaleServer
+# Paul Glaubitz <Paul.Glaubitz at mt.com>
+tappi-boxnet 2306/udp # TAPPI BoxNet
+tappi-boxnet 2306/tcp # TAPPI BoxNet
+# Richard Spartz <rspartz at alliancetechnical.com>
+pehelp 2307/udp # pehelp
+pehelp 2307/tcp # pehelp
+# Jens Kilian <jensk at hpbeo82.bbn.hp.com>
+sdhelp 2308/udp # sdhelp
+sdhelp 2308/tcp # sdhelp
+# Annette Klecha <annette_klecha at bbn.hp.com>
+sdserver 2309/udp # SD Server
+sdserver 2309/tcp # SD Server
+sdclient 2310/udp # SD Client
+sdclient 2310/tcp # SD Client
+# Jeurgen Broesamle <juergb at bbn.hp.com>
+messageservice 2311/udp # Message Service
+messageservice 2311/tcp # Message Service
+# No contact Listed
+iapp 2313/udp # IAPP (Inter Access Point Protocol)
+iapp 2313/tcp # IAPP (Inter Access Point Protocol)
+# Henri Moelard <moelard at lucent.com>
+cr-websystems 2314/udp # CR WebSystems
+cr-websystems 2314/tcp # CR WebSystems
+# Robin Giese <rgiese at peddie.org>
+precise-sft 2315/udp # Precise Sft.
+precise-sft 2315/tcp # Precise Sft.
+# Michael Landwehr <mikel at precisesoft.co.il>
+sent-lm 2316/udp # SENT License Manager
+sent-lm 2316/tcp # SENT License Manager
+# Pisharath Krishnan <krishnan at axis-inc.com>
+attachmate-g32 2317/udp # Attachmate G32
+attachmate-g32 2317/tcp # Attachmate G32
+# Bryce Bhatnagar <BRYCEBH at Attachmate.com>
+cadencecontrol 2318/udp # Cadence Control
+cadencecontrol 2318/tcp # Cadence Control
+# Buck Caldwell <buck_c at polygon.com>
+infolibria 2319/udp # InfoLibria
+infolibria 2319/tcp # InfoLibria
+# Chris Chiotasso <cchiotasso at infolibria.com>
+siebel-ns 2320/udp # Siebel NS
+siebel-ns 2320/tcp # Siebel NS
+# Gilberto Arnaiz <garnaiz at siebel.com>
+rdlap 2321/udp # RDLAP
+rdlap 2321/tcp # RDLAP
+# Robert Wiebe <crw010 at email.mot.com>
+ofsd 2322/udp # ofsd
+ofsd 2322/tcp # ofsd
+3d-nfsd 2323/udp # 3d-nfsd
+3d-nfsd 2323/tcp # 3d-nfsd
+# Mike Sherrill <sherrill at commvault.com>
+cosmocall 2324/udp # Cosmocall
+cosmocall 2324/tcp # Cosmocall
+# Steve Dellutri
+designspace-lm 2325/udp # Design Space License Management
+designspace-lm 2325/tcp # Design Space License Management
+# Suzanne Lorrin <suzanne.lorrin at ansys.com>
+idcp 2326/udp # IDCP
+idcp 2326/tcp # IDCP
+# Keisokugiken Corp. <adda at kgc.co.jp>
+xingcsm 2327/udp # xingcsm
+xingcsm 2327/tcp # xingcsm
+# Dave Spencer <dspencer at xingtech.com>
+netrix-sftm 2328/udp # Netrix SFTM
+netrix-sftm 2328/tcp # Netrix SFTM
+# Garrett Herschleb <garrett at netrix.com>
+nvd 2329/udp # NVD
+nvd 2329/tcp # NVD
+# Peter Weyman <pjweyman at noblenet.com>
+tscchat 2330/udp # TSCCHAT
+tscchat 2330/tcp # TSCCHAT
+# Mike Jackson <mhjack at tscnet.com>
+agentview 2331/udp # AGENTVIEW
+agentview 2331/tcp # AGENTVIEW
+# Ram Iyer <ram at aaccorp.com>
+rcc-host 2332/udp # RCC Host
+rcc-host 2332/tcp # RCC Host
+# Martin Shoemaker <shoemakerml at rapistan.com>
+snapp 2333/udp # SNAPP
+snapp 2333/tcp # SNAPP
+# Kevin Osborn <kosborn at snapappliance.com>
+ace-client 2334/udp # ACE Client Auth
+ace-client 2334/tcp # ACE Client Auth
+ace-proxy 2335/udp # ACE Proxy
+ace-proxy 2335/tcp # ACE Proxy
+# Riaz Zolfonoon <rzolfonoon at securitydynamics.com>
+appleugcontrol 2336/udp # Apple UG Control
+appleugcontrol 2336/tcp # Apple UG Control
+# Gene Tyacke <gene at apple.com>
+ideesrv 2337/udp # ideesrv
+ideesrv 2337/tcp # ideesrv
+# Marazzi <fmarazzi at ideetique.com>
+norton-lambert 2338/udp # Norton Lambert
+norton-lambert 2338/tcp # Norton Lambert
+# Richard de Mornay <rdemornay at norton-lambert.com>
+3com-webview 2339/udp # 3Com WebView
+3com-webview 2339/tcp # 3Com WebView
+# Jennifer Grace <Jennifer_Grace at 3com.com>
+wrs_registry 2340/udp # WRS Registry
+wrs_registry 2340/tcp # WRS Registry
+# Christophe Cleraux <chrisc at wrs.com>
+xiostatus 2341/udp # XIO Status
+xiostatus 2341/tcp # XIO Status
+# Randy Maas <randym at xiotech.com>
+manage-exec 2342/udp # Seagate Manage Exec
+manage-exec 2342/tcp # Seagate Manage Exec
+# Jim Flaherty <jim.flaherty at seagatesoftware.com>
+nati-logos 2343/udp # nati logos
+nati-logos 2343/tcp # nati logos
+# David Pierce <David.Pierce at natinst.com>
+fcmsys 2344/udp # fcmsys
+fcmsys 2344/tcp # fcmsys
+dbm 2345/udp # dbm
+dbm 2345/tcp # dbm
+# Dean Robson <dean.robson at fujitsu.com.au>
+redstorm_join 2346/udp # Game Connection Port
+redstorm_join 2346/tcp # Game Connection Port
+redstorm_find 2347/udp # Game Announcement and Location
+redstorm_find 2347/tcp # Game Announcement and Location
+redstorm_info 2348/udp # Information to query for game status
+redstorm_info 2348/tcp # Information to query for game status
+redstorm_diag 2349/udp # Diagnostics Port
+redstorm_diag 2349/tcp # Diagnostics Port
+# David Weinstein <david.weinstein at redstorm.com>
+psbserver 2350/udp # psbserver
+psbserver 2350/tcp # psbserver
+psrserver 2351/udp # psrserver
+psrserver 2351/tcp # psrserver
+pslserver 2352/udp # pslserver
+pslserver 2352/tcp # pslserver
+pspserver 2353/udp # pspserver
+pspserver 2353/tcp # pspserver
+psprserver 2354/udp # psprserver
+psprserver 2354/tcp # psprserver
+psdbserver 2355/udp # psdbserver
+psdbserver 2355/tcp # psdbserver
+# Paul Reddy <Paul at pharos.co.nz>
+gxtelmd 2356/udp # GXT License Managemant
+gxtelmd 2356/tcp # GXT License Managemant
+# Robert Hodgson <rrh at gxt.com>
+unihub-server 2357/udp # UniHub Server
+unihub-server 2357/tcp # UniHub Server
+# Tim Kenyon <Tim_Kenyon at csicontrols.com>
+futrix 2358/udp # Futrix
+futrix 2358/tcp # Futrix
+# Peter Frankenberg <pcfberg at ibm.net>
+flukeserver 2359/udp # FlukeServer
+flukeserver 2359/tcp # FlukeServer
+# Bill Marbaker <wrm at fortenet.com>
+nexstorindltd 2360/udp # NexstorIndLtd
+nexstorindltd 2360/tcp # NexstorIndLtd
+# NexStor India Limited <next at nda.vsnl.net.in>
+tl1 2361/udp # TL1
+tl1 2361/tcp # TL1
+# Charles Scott Roberson <chip at cerent.com>
+digiman 2362/udp # digiman
+digiman 2362/tcp # digiman
+# Aaron S. Kurland <akurland at netsilicon.com>
+mediacntrlnfsd 2363/udp # Media Central NFSD
+mediacntrlnfsd 2363/tcp # Media Central NFSD
+# shivakumar s. govindarajapuram <shivak at eng.sun.com>
+oi-2000 2364/udp # OI-2000
+oi-2000 2364/tcp # OI-2000
+# Software Horizons Inc. <oi2000 at shorizons.com>
+dbref 2365/udp # dbref
+dbref 2365/tcp # dbref
+# Yoshihiro Yamazaki <yamazaki at ael.fujitsu.co.jp>
+qip-login 2366/udp # qip-login
+qip-login 2366/tcp # qip-login
+# Mike Morgan <mmorgan at lucent.com>
+service-ctrl 2367/udp # Service Control
+service-ctrl 2367/tcp # Service Control
+# Humberto Sanchez <Humberto_Sanchez at hp.com>
+opentable 2368/udp # OpenTable
+opentable 2368/tcp # OpenTable
+# Thomas Theobald <ttheobald at opentable.com>
+acs2000-dsp 2369/udp # ACS2000 DSP
+acs2000-dsp 2369/tcp # ACS2000 DSP
+# Jeffrey Beauchamp <jeffrey.beauchamp at acs2000.net>
+l3-hbmon 2370/udp # L3-HBMon
+l3-hbmon 2370/tcp # L3-HBMon
+# Dolores Scott <Dolores.Scott at L-3security.com>
+#### Port 2370 Unofficially used by Compaq ####
+worldwire 2371/udp # Compaq WorldWire Port
+worldwire 2371/tcp # Compaq WorldWire Port
+# Michael Spratte <michael.spratte at compaq.com>
+# 2372-2380 Unassigned
+compaq-https 2381/udp # Compaq HTTPS
+compaq-https 2381/tcp # Compaq HTTPS
+# Scott Shaffer <scott.shaffer at hp.com>
+ms-olap3 2382/udp # Microsoft OLAP
+ms-olap3 2382/tcp # Microsoft OLAP
+ms-olap4 2383/udp # Microsoft OLAP
+ms-olap4 2383/tcp # Microsoft OLAP
+# Mosha Pasumansky <moshap at microsoft.com>
+sd-capacity 2384/udp # SD-CAPACITY
+sd-request 2384/tcp # SD-REQUEST
+# Jason McManus <jasonm at sleepdep.net>
+sd-data 2385/udp # SD-DATA
+sd-data 2385/tcp # SD-DATA
+# Jason McManus <jasonm at sleepdep.net>
+virtualtape 2386/udp # Virtual Tape
+virtualtape 2386/tcp # Virtual Tape
+vsamredirector 2387/udp # VSAM Redirector
+vsamredirector 2387/tcp # VSAM Redirector
+# Ingo Franzki <ifranzki at de.ibm.com>
+mynahautostart 2388/udp # MYNAH AutoStart
+mynahautostart 2388/tcp # MYNAH AutoStart
+# Thomas J. Klehr <tklehr at telcordia.com>
+ovsessionmgr 2389/udp # OpenView Session Mgr
+ovsessionmgr 2389/tcp # OpenView Session Mgr
+# Eric Pulsipher <eric_pulsipher at hp.com>
+rsmtp 2390/udp # RSMTP
+rsmtp 2390/tcp # RSMTP
+# Geoff Collyer <geoff at research.bell-labs.com>
+3com-net-mgmt 2391/udp # 3COM Net Management
+3com-net-mgmt 2391/tcp # 3COM Net Management
+# Prathibha Nagvar
+tacticalauth 2392/udp # Tactical Auth
+tacticalauth 2392/tcp # Tactical Auth
+# David Yon <yon at tactical-sw.com>
+ms-olap1 2393/udp # MS OLAP 1
+ms-olap1 2393/tcp # MS OLAP 1
+ms-olap2 2394/udp # MS OLAP 2
+ms-olap2 2394/tcp # MS OLAP 2
+# Mosha Pasumansky <moshap at microsoft.com>
+lan900_remote 2395/udp # LAN900 Remote
+lan900_remote 2395/tcp # LAN900 Remote
+# Tom Quinlan <tquinlan at digitechinc.com>
+wusage 2396/udp # Wusage
+wusage 2396/tcp # Wusage
+# Thomas Boutell <boutell at boutell.com>
+ncl 2397/udp # NCL
+ncl 2397/tcp # NCL
+# Robert Wiebe <crw010 at email.mot.com>
+orbiter 2398/udp # Orbiter
+orbiter 2398/tcp # Orbiter
+# David Goldberg <dgoldberg at callisto.com>
+fmpro-fdal 2399/udp # FileMaker, Inc. - Data Access Layer
+fmpro-fdal 2399/tcp # FileMaker, Inc. - Data Access Layer
+# Clay Maeckal <clay_maeckel at filemaker.com>
+opequus-server 2400/udp # OpEquus Server
+opequus-server 2400/tcp # OpEquus Server
+# Gavin Hutchinson <gavinh at tesl.com>
+cvspserver 2401/udp # cvspserver
+cvspserver 2401/tcp # cvspserver
+# Jim Kingdon <kingdon at harvey.cyclic.com>
+taskmaster2000 2402/udp # TaskMaster 2000 Server
+taskmaster2000 2402/tcp # TaskMaster 2000 Server
+taskmaster2000 2403/udp # TaskMaster 2000 Web
+taskmaster2000 2403/tcp # TaskMaster 2000 Web
+# Ed Odjaghian <edo at datacap.com>
+iec-104 2404/udp # IEC 60870-5-104 process control over IP
+iec-104 2404/tcp # IEC 60870-5-104 process control over IP
+# Walter K. Eichelburg <walter.eichelburg at sat-automation.com>
+trc-netpoll 2405/udp # TRC Netpoll
+trc-netpoll 2405/tcp # TRC Netpoll
+# Bizhan Ghavami <ghavami at telcores.com>
+jediserver 2406/udp # JediServer
+jediserver 2406/tcp # JediServer
+# Paul McEntire <paul.mcentire at columbiasc.ncr.com>
+orion 2407/udp # Orion
+orion 2407/tcp # Orion
+# Matthew Horoschun <mhoroschun at canprint.com.au>
+optimanet 2408/udp # OptimaNet
+optimanet 2408/tcp # OptimaNet
+# John Graham-Cumming <jgc at optimal.com>
+sns-protocol 2409/udp # SNS Protocol
+sns-protocol 2409/tcp # SNS Protocol
+# Amir Blich <amir at netmanage.co.il>
+vrts-registry 2410/udp # VRTS Registry
+vrts-registry 2410/tcp # VRTS Registry
+# Pranay Varma <pran at veritas.com>
+netwave-ap-mgmt 2411/udp # Netwave AP Management
+netwave-ap-mgmt 2411/tcp # Netwave AP Management
+# Johnny Zweig <zweig at netwave-wireless.com>
+cdn 2412/udp # CDN
+cdn 2412/tcp # CDN
+# Alan Noble <noble at netmind.com>
+orion-rmi-reg 2413/udp # orion-rmi-reg
+orion-rmi-reg 2413/tcp # orion-rmi-reg
+# J.S. Greenfield <greeny at us.ibm.com>
+beeyond 2414/udp # Beeyond
+beeyond 2414/tcp # Beeyond
+# Bob Deblier <bob at virtualunlimited.com>
+codima-rtp 2415/udp # Codima Remote Transaction Protocol
+codima-rtp 2415/tcp # Codima Remote Transaction Protocol
+# Sylvia Ross <sross at codimatech.com>
+rmtserver 2416/udp # RMT Server
+rmtserver 2416/tcp # RMT Server
+# Yvon Marineau <yvon at simware.com>
+composit-server 2417/udp # Composit Server
+composit-server 2417/tcp # Composit Server
+# Katsuaki Naoi <naoi at pfu.co.jp>
+cas 2418/udp # cas
+cas 2418/tcp # cas
+# Akiyoshi Ochi <akiyoshi at net.paso.fujitsu.co.jp>
+attachmate-s2s 2419/udp # Attachmate S2S
+attachmate-s2s 2419/tcp # Attachmate S2S
+# Chris Rominski <ChrisRom at attachmate.com>
+dslremote-mgmt 2420/udp # DSL Remote Management
+dslremote-mgmt 2420/tcp # DSL Remote Management
+# Westell, Inc. <jronk at westell.com>
+g-talk 2421/udp # G-Talk
+g-talk 2421/tcp # G-Talk
+# Matt Hammond <matt_hammond at four-sight.co.uk>
+crmsbits 2422/udp # CRMSBITS
+crmsbits 2422/tcp # CRMSBITS
+# Rod Ward <RWard at vaccmel1.telstra.com.au>
+rnrp 2423/udp # RNRP
+rnrp 2423/tcp # RNRP
+# Per Sahlqvist <psahlqvi at sw.seisy.abb.se>
+kofax-svr 2424/udp # KOFAX-SVR
+kofax-svr 2424/tcp # KOFAX-SVR
+# Terry Reagan <treagan at kofax.com>
+fjitsuappmgr 2425/udp # Fujitsu App Manager
+fjitsuappmgr 2425/tcp # Fujitsu App Manager
+# Hiroyuki Kawabuchi <buchi at ael.fujitsu.co.jp>
+# 2426 Unassigned (Removed 2002-04-29)
+mgcp-gateway 2427/udp # Media Gateway Control Protocol Gateway
+mgcp-gateway 2427/tcp # Media Gateway Control Protocol Gateway
+# Christian Huitema <huitema at research.telcordia.com>
+ott 2428/udp # One Way Trip Time
+ott 2428/tcp # One Way Trip Time
+# Greg Troxel <gdt at ir.bbn.com>
+ft-role 2429/udp # FT-ROLE
+ft-role 2429/tcp # FT-ROLE
+# Doug Boone <dboone at atg.CLR.com>
+venus 2430/udp # venus
+venus 2430/tcp # venus
+venus-se 2431/udp # venus-se
+venus-se 2431/tcp # venus-se
+codasrv 2432/udp # codasrv
+codasrv 2432/tcp # codasrv
+codasrv-se 2433/udp # codasrv-se
+codasrv-se 2433/tcp # codasrv-se
+# Robert Watson <robert at cyrus.watson.org>
+pxc-epmap 2434/udp # pxc-epmap
+pxc-epmap 2434/tcp # pxc-epmap
+# Jun Nakamura <jnakamur at cp10.es.xerox.com>
+optilogic 2435/udp # OptiLogic
+optilogic 2435/tcp # OptiLogic
+# Clark Williams <clark at wirespeed.com>
+topx 2436/udp # TOP/X
+topx 2436/tcp # TOP/X
+# Dragos Pop <dragos at cs.ubbcluj.ro>
+unicontrol 2437/udp # UniControl
+unicontrol 2437/tcp # UniControl
+# Ing. Markus Huemer <markus.huemer at hsd.at>
+msp 2438/udp # MSP
+msp 2438/tcp # MSP
+# Evan Caves <evan at acc.com>
+sybasedbsynch 2439/udp # SybaseDBSynch
+sybasedbsynch 2439/tcp # SybaseDBSynch
+# Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+spearway 2440/udp # Spearway Lockers
+spearway 2440/tcp # Spearway Lockers
+# Pierre Frisch <Pierre.Frisch at spearway.com>
+pvsw-inet 2441/udp # Pervasive I*net Data Server
+pvsw-inet 2441/tcp # Pervasive I*net Data Server
+# Chuck Talk <ctalk at pervasive.com>
+netangel 2442/udp # Netangel
+netangel 2442/tcp # Netangel
+# Ladislav Baranyay <identcod at identcode.sk>
+powerclientcsf 2443/udp # PowerClient Central Storage Facility
+powerclientcsf 2443/tcp # PowerClient Central Storage Facility
+# Brian Klassen <Brian.Klassen at Unisys.com>
+btpp2sectrans 2444/udp # BT PP2 Sectrans
+btpp2sectrans 2444/tcp # BT PP2 Sectrans
+# Ian Daniels <btexact.ports at bt.com>
+dtn1 2445/udp # DTN1
+dtn1 2445/tcp # DTN1
+# Bob Gaddie <bobg at dtn.com>
+bues_service 2446/udp # bues_service
+bues_service 2446/tcp # bues_service
+# Leonhard Diekmann
+# <diekmann at 04.mstr02.telekom400.dbp.de>
+ovwdb 2447/udp # OpenView NNM daemon
+ovwdb 2447/tcp # OpenView NNM daemon
+# Eric Pulsipher <eric_pulsipher at fc.hp.com>
+hpppssvr 2448/udp # hpppsvr
+hpppssvr 2448/tcp # hpppsvr
+# Bridgette Landers <blanders at boi.hp.com>
+ratl 2449/udp # RATL
+ratl 2449/tcp # RATL
+# Paul Greenfield <paul.greenfield at unisys.com>
+netadmin 2450/udp # netadmin
+netadmin 2450/tcp # netadmin
+netchat 2451/udp # netchat
+netchat 2451/tcp # netchat
+# Julian Mehnle <julian at mehnle.net>
+snifferclient 2452/udp # SnifferClient
+snifferclient 2452/tcp # SnifferClient
+# Amy Weaver <amy_weaver at nai.com>
+madge-om 2453/udp # madge-om
+madge-om 2453/tcp # madge-om
+# Andrew Draper <adraper at dev.madge.com>
+indx-dds 2454/udp # IndX-DDS
+indx-dds 2454/tcp # IndX-DDS
+# Paul Carmichael <paulcarmichael at indx.net>
+wago-io-system 2455/udp # WAGO-IO-SYSTEM
+wago-io-system 2455/tcp # WAGO-IO-SYSTEM
+# Uwe Rathert <uwe.rathert at ieee.org>
+altav-remmgt 2456/udp # altav-remmgt
+altav-remmgt 2456/tcp # altav-remmgt
+# Gary M. Allen <gallen at symantec.com>
+rapido-ip 2457/udp # Rapido_IP
+rapido-ip 2457/tcp # Rapido_IP
+# Man Shuen Cheung <man_shuen_cheung at wamnet.co.uk>
+griffin 2458/udp # griffin
+griffin 2458/tcp # griffin
+# Tom Taylor <Tom.Taylor at unisys.com>
+community 2459/udp # Community
+community 2459/tcp # Community
+# David Schwartz <davids at webmaster.com>
+ms-theater 2460/udp # ms-theater
+ms-theater 2460/tcp # ms-theater
+# Anton Kucer <a-antonk at microsoft.com>
+qadmifoper 2461/udp # qadmifoper
+qadmifoper 2461/tcp # qadmifoper
+qadmifevent 2462/udp # qadmifevent
+qadmifevent 2462/tcp # qadmifevent
+# Pekka Takaranta <pekka.takaranta at tellabs.fi>
+symbios-raid 2463/udp # Symbios Raid
+symbios-raid 2463/tcp # Symbios Raid
+# Bill Delaney <bill.delaney at symbios.com>
+direcpc-si 2464/udp # DirecPC SI
+direcpc-si 2464/tcp # DirecPC SI
+# Doug Dillon <dillon at hns.com>
+lbm 2465/udp # Load Balance Management
+lbm 2465/tcp # Load Balance Management
+lbf 2466/udp # Load Balance Forwarding
+lbf 2466/tcp # Load Balance Forwarding
+# Kazuhiro Koide <kaz at pfu.co.jp>
+high-criteria 2467/udp # High Criteria
+high-criteria 2467/tcp # High Criteria
+# Konstantin Iavid <kiavid at highcriteria.com>
+qip-msgd 2468/udp # qip_msgd
+qip-msgd 2468/tcp # qip_msgd
+# Mike Morgan <mmorgan at lucent.com>
+mti-tcs-comm 2469/udp # MTI-TCS-COMM
+mti-tcs-comm 2469/tcp # MTI-TCS-COMM
+# Mario Bonin <boninm at microtempus.com>
+taskman-port 2470/udp # taskman port
+taskman-port 2470/tcp # taskman port
+# Boris Panteleev <bpanteleev at himel.com>
+seaodbc 2471/udp # SeaODBC
+seaodbc 2471/tcp # SeaODBC
+# Adrian Hornby <Adrian.Hornby at aran.co.uk>
+c3 2472/udp # C3
+c3 2472/tcp # C3
+# Eckhard Grieger <e.grieger at com-on.de>
+aker-cdp 2473/udp # Aker-cdp
+aker-cdp 2473/tcp # Aker-cdp
+# Rodrigo Ormonde <ormonde at aker.com.br>
+vitalanalysis 2474/udp # Vital Analysis
+vitalanalysis 2474/tcp # Vital Analysis
+# Srinivas Reddy <sreddy at vitalsigns.com>
+ace-server 2475/udp # ACE Server
+ace-server 2475/tcp # ACE Server
+ace-svr-prop 2476/udp # ACE Server Propagation
+ace-svr-prop 2476/tcp # ACE Server Propagation
+ssm-cvs 2477/udp # SecurSight Certificate Valifation Service
+ssm-cvs 2477/tcp # SecurSight Certificate Valifation Service
+ssm-cssps 2478/udp # SecurSight Authentication Server (SSL)
+ssm-cssps 2478/tcp # SecurSight Authentication Server (SSL)
+ssm-els 2479/udp # SecurSight Event Logging Server (SSL)
+ssm-els 2479/tcp # SecurSight Event Logging Server (SSL)
+# John Linn <jlinn at securitydynamics.com>
+lingwood 2480/udp # Lingwood's Detail
+lingwood 2480/tcp # Lingwood's Detail
+# Dave Richmond <drichmond at striva.com>
+giop 2481/udp # Oracle GIOP
+giop 2481/tcp # Oracle GIOP
+giop-ssl 2482/udp # Oracle GIOP SSL
+giop-ssl 2482/tcp # Oracle GIOP SSL
+ttc 2483/udp # Oracle TTC
+ttc 2483/tcp # Oracle TTC
+ttc-ssl 2484/udp # Oracle TTC SSL
+ttc-ssl 2484/tcp # Oracle TTC SSL
+# Chandar Venkataraman <CVENKATA at us.oracle.com>
+netobjects1 2485/udp # Net Objects1
+netobjects1 2485/tcp # Net Objects1
+netobjects2 2486/udp # Net Objects2
+netobjects2 2486/tcp # Net Objects2
+# Francois Granade <francois at netobjects.com>
+pns 2487/udp # Policy Notice Service
+pns 2487/tcp # Policy Notice Service
+# Akiyoshi Ochi <akiyoshi at net.paso.fujitsu.co.jp>
+moy-corp 2488/udp # Moy Corporation
+moy-corp 2488/tcp # Moy Corporation
+# Gang Gong Moy
+tsilb 2489/udp # TSILB
+tsilb 2489/tcp # TSILB
+# James Irwin <jimi at travsoft.com>
+qip-qdhcp 2490/udp # qip_qdhcp
+qip-qdhcp 2490/tcp # qip_qdhcp
+# Mike Morgan <mmorgan at lucent.com>
+conclave-cpp 2491/udp # Conclave CPP
+conclave-cpp 2491/tcp # Conclave CPP
+# Larry Lipstone <lrl at interdyn.com>
+groove 2492/udp # GROOVE
+groove 2492/tcp # GROOVE
+# Ray Ozzie <ray at rocks.net>
+talarian-mqs 2493/udp # Talarian MQS
+talarian-mqs 2493/tcp # Talarian MQS
+# Jim Stabile <jstabile at talarian.com>
+bmc-ar 2494/udp # BMC AR
+bmc-ar 2494/tcp # BMC AR
+# Shelia Childs <sheila_childs at bmc.com>
+fast-rem-serv 2495/udp # Fast Remote Services
+fast-rem-serv 2495/tcp # Fast Remote Services
+# Scott St. Clair <stclair at NTC.ADAPTEC.com>
+dirgis 2496/udp # DIRGIS
+dirgis 2496/tcp # DIRGIS
+# Deutschland Informations- und
+# Reservierungsgesellschaft mbH <beratung at dirg.de>
+quaddb 2497/udp # Quad DB
+quaddb 2497/tcp # Quad DB
+# Jeff Rosenthal <jrosenthal at quad-sys.com>
+odn-castraq 2498/udp # ODN-CasTraq
+odn-castraq 2498/tcp # ODN-CasTraq
+# Richard Hodges <rh at source.net>
+unicontrol 2499/udp # UniControl
+unicontrol 2499/tcp # UniControl
+# Ing. Markus Huemer
+rtsserv 2500/udp # Resource Tracking system server
+rtsserv 2500/tcp # Resource Tracking system server
+rtsclient 2501/udp # Resource Tracking system client
+rtsclient 2501/tcp # Resource Tracking system client
+# Aubrey Turner
+# <S95525ta%etsuacad.bitnet at ETSUADMN.ETSU.EDU>
+kentrox-prot 2502/udp # Kentrox Protocol
+kentrox-prot 2502/tcp # Kentrox Protocol
+# Anil Lakhwara <anil_lakhwara at kentrox.com>
+nms-dpnss 2503/udp # NMS-DPNSS
+nms-dpnss 2503/tcp # NMS-DPNSS
+# Jean-Christophe Desire
+# <Jean-Christophe_Desire at NMS-Europe.com>
+wlbs 2504/udp # WLBS
+wlbs 2504/tcp # WLBS
+# William Bain <bbain at microsoft.com>
+# 2505 Removed (2002-06-14)
+jbroker 2506/udp # jbroker
+jbroker 2506/tcp # jbroker
+# Rohit Garg <rohit at objectScape.com>
+spock 2507/udp # spock
+spock 2507/tcp # spock
+# Jon A. Christopher <jac8792 at tamu.edu>
+jdatastore 2508/udp # JDataStore
+jdatastore 2508/tcp # JDataStore
+# Tod Landis <tlandis at inprise.com>
+fjmpss 2509/udp # fjmpss
+fjmpss 2509/tcp # fjmpss
+# Makoto Watanabe <makoto at saint.nm.fujitsu.co.jp>
+fjappmgrbulk 2510/udp # fjappmgrbulk
+fjappmgrbulk 2510/tcp # fjappmgrbulk
+# Hiroyuki Kawabuchi <buchi at ael.fujitsu.co.jp>
+metastorm 2511/udp # Metastorm
+metastorm 2511/tcp # Metastorm
+# Eric Isom <eisom at metastorm.com>
+citrixima 2512/udp # Citrix IMA
+citrixima 2512/tcp # Citrix IMA
+citrixadmin 2513/udp # Citrix ADMIN
+citrixadmin 2513/tcp # Citrix ADMIN
+# Myk Willis <myk.willis at citrix.com>
+facsys-ntp 2514/udp # Facsys NTP
+facsys-ntp 2514/tcp # Facsys NTP
+facsys-router 2515/udp # Facsys Router
+facsys-router 2515/tcp # Facsys Router
+# Jeff Hoffman <jeffh at facsys.com>
+maincontrol 2516/udp # Main Control
+maincontrol 2516/tcp # Main Control
+# Nathan Sadia <sadia at maincontrol.com>
+call-sig-trans 2517/udp # H.323 Annex E call signaling transport
+call-sig-trans 2517/tcp # H.323 Annex E call signaling transport
+# Gur Kimchi <gur.kimchi at vocaltec.com>
+willy 2518/udp # Willy
+willy 2518/tcp # Willy
+# Carl-Johan Wik <cjw at hudsmoar.com>
+globmsgsvc 2519/udp # globmsgsvc
+globmsgsvc 2519/tcp # globmsgsvc
+# David Wiltz <dwiltz at hf.intel.com>
+pvsw 2520/udp # Pervasive Listener
+pvsw 2520/tcp # Pervasive Listener
+# Chuck Talk <ctalk at pervasive.com>
+adaptecmgr 2521/udp # Adaptec Manager
+adaptecmgr 2521/tcp # Adaptec Manager
+# Mark Parenti <map at ntc.adaptec.com>
+windb 2522/udp # WinDb
+windb 2522/tcp # WinDb
+# Larry Traylor <larry at arium.com>
+qke-llc-v3 2523/udp # Qke LLC V.3
+qke-llc-v3 2523/tcp # Qke LLC V.3
+# Joerg Niehoff <joerg.niehoff at alcatel-ke.de>
+optiwave-lm 2524/udp # Optiwave License Management
+optiwave-lm 2524/tcp # Optiwave License Management
+# Slawomir Krzesinski <slavek at optiwave.com>
+ms-v-worlds 2525/udp # MS V-Worlds
+ms-v-worlds 2525/tcp # MS V-Worlds
+# Pete Wong <petewong at microsoft.com>
+ema-sent-lm 2526/udp # EMA License Manager
+ema-sent-lm 2526/tcp # EMA License Manager
+# Thaddeus Perala <tr at emaden.com>
+iqserver 2527/udp # IQ Server
+iqserver 2527/tcp # IQ Server
+# Nick Straguzzi <Nick_Straguzzi at akbs.com>
+ncr_ccl 2528/udp # NCR CCL
+ncr_ccl 2528/tcp # NCR CCL
+# Amitava Dutta <Amitava.Dutta at WoodbridgeNJ.ncr.com>
+utsftp 2529/udp # UTS FTP
+utsftp 2529/tcp # UTS FTP
+# David Moore <dmoore at uttc-uts.com>
+vrcommerce 2530/udp # VR Commerce
+vrcommerce 2530/tcp # VR Commerce
+# Yosi Mass <yosimass at haifa.vnet.ibm.com>
+ito-e-gui 2531/udp # ITO-E GUI
+ito-e-gui 2531/tcp # ITO-E GUI
+# Michael Haeuptle <Michael_Haeuptle at hp.com>
+ovtopmd 2532/udp # OVTOPMD
+ovtopmd 2532/tcp # OVTOPMD
+# Eric Pulsipher <eric_pulsipher at hp.com>
+snifferserver 2533/udp # SnifferServer
+snifferserver 2533/tcp # SnifferServer
+# Amy Weaver <Amy_Weaver at NAI.com>
+combox-web-acc 2534/udp # Combox Web Access
+combox-web-acc 2534/tcp # Combox Web Access
+# Yochai Cohen <yochai at combox.co.il>
+madcap 2535/udp # MADCAP
+madcap 2535/tcp # MADCAP
+# Stephen Hanna <steve.hanna at sun.com>
+btpp2audctr1 2536/udp # btpp2audctr1
+btpp2audctr1 2536/tcp # btpp2audctr1
+# Ian Daniels <btexact.ports at bt.com>
+upgrade 2537/udp # Upgrade Protocol
+upgrade 2537/tcp # Upgrade Protocol
+# Breck Auten <bauten at dst-inc.com>
+vnwk-prapi 2538/udp # vnwk-prapi
+vnwk-prapi 2538/tcp # vnwk-prapi
+# John Hasselkus <Jhasselkus at VisualNetworks.com>
+vsiadmin 2539/udp # VSI Admin
+vsiadmin 2539/tcp # VSI Admin
+# Rob Juergens <robj at vsi.com>
+lonworks 2540/udp # LonWorks
+lonworks 2540/tcp # LonWorks
+lonworks2 2541/udp # LonWorks2
+lonworks2 2541/tcp # LonWorks2
+# Gary Bartlett <garyb at echelon.com>
+davinci 2542/udp # daVinci Presenter
+davinci 2542/tcp # daVinci Presenter
+# b-novative GmbH <info at b-novative.com>
+reftek 2543/udp # REFTEK
+reftek 2543/tcp # REFTEK
+# Robert Banfill <r.banfill at reftek.com>
+novell-zen 2544/udp # Novell ZEN
+novell-zen 2544/tcp # Novell ZEN
+# Randy Cook <RACOOK at novell.com>
+sis-emt 2545/udp # sis-emt
+sis-emt 2545/tcp # sis-emt
+# Bill Crawford <Bill.Crawford at securicor.co.uk>
+vytalvaultbrtp 2546/udp # vytalvaultbrtp
+vytalvaultbrtp 2546/tcp # vytalvaultbrtp
+vytalvaultvsmp 2547/udp # vytalvaultvsmp
+vytalvaultvsmp 2547/tcp # vytalvaultvsmp
+vytalvaultpipe 2548/udp # vytalvaultpipe
+vytalvaultpipe 2548/tcp # vytalvaultpipe
+# Tim Boldt <timb at vytalnet.com>
+ipass 2549/udp # IPASS
+ipass 2549/tcp # IPASS
+# Michael Fischer <otterley at Pass.COM>
+ads 2550/udp # ADS
+ads 2550/tcp # ADS
+# Michael O'Connor <moconnor at adobe.com>
+isg-uda-server 2551/udp # ISG UDA Server
+isg-uda-server 2551/tcp # ISG UDA Server
+# Dror Harari <Dror.Harari at isgsoft.com>
+call-logging 2552/udp # Call Logging
+call-logging 2552/tcp # Call Logging
+# Dean Webb <dean.webb at ascend.com>
+efidiningport 2553/udp # efidiningport
+efidiningport 2553/tcp # efidiningport
+# Lynn Carter <carterl at execpc.com>
+vcnet-link-v10 2554/udp # VCnet-Link v10
+vcnet-link-v10 2554/tcp # VCnet-Link v10
+# Csaba Mate <mc36 at freemail.c3.hu>
+compaq-wcp 2555/udp # Compaq WCP
+compaq-wcp 2555/tcp # Compaq WCP
+# Ferruccio Barletta <ferruccio.barletta at compaq.com>
+nicetec-nmsvc 2556/udp # nicetec-nmsvc
+nicetec-nmsvc 2556/tcp # nicetec-nmsvc
+nicetec-mgmt 2557/udp # nicetec-mgmt
+nicetec-mgmt 2557/tcp # nicetec-mgmt
+# Joerg Paulus <tech at nicetec.de>
+pclemultimedia 2558/udp # PCLE Multi Media
+pclemultimedia 2558/tcp # PCLE Multi Media
+# Bernd Scharping <bscharping at pinnaclesys.com>
+lstp 2559/udp # LSTP
+lstp 2559/tcp # LSTP
+# Waiki Wright <waiki at us.ibm.com>
+labrat 2560/udp # labrat
+labrat 2560/tcp # labrat
+# John Harvey <johnbob at austin.ibm.com>
+mosaixcc 2561/udp # MosaixCC
+mosaixcc 2561/tcp # MosaixCC
+# Steven Frare <stevefr at mosaix.com>
+delibo 2562/udp # Delibo
+delibo 2562/tcp # Delibo
+# NovaWiz LTD <Moshe at Novawiz.com>
+cti-redwood 2563/udp # CTI Redwood
+cti-redwood 2563/tcp # CTI Redwood
+# Songwon Chi <swchi at daou.co.kr>
+hp-3000-telnet 2564/tcp # HP 3000 NS/VT block mode telnet
+#
+coord-svr 2565/udp # Coordinator Server
+coord-svr 2565/tcp # Coordinator Server
+# Richard Steiger <steiger at ensemblesoft.com>
+pcs-pcw 2566/udp # pcs-pcw
+pcs-pcw 2566/tcp # pcs-pcw
+# W. Jordan Fitzhugh <jfitz at pcare.com>
+clp 2567/udp # Cisco Line Protocol
+clp 2567/tcp # Cisco Line Protocol
+# Susan Hinrichs <shinrich at cisco.com>
+spamtrap 2568/udp # SPAM TRAP
+spamtrap 2568/tcp # SPAM TRAP
+# Chuck Bennett <chuck at benatong.com>
+sonuscallsig 2569/udp # Sonus Call Signal
+sonuscallsig 2569/tcp # Sonus Call Signal
+# Mark Garti <mgarti at sonusnet.com>
+hs-port 2570/udp # HS Port
+hs-port 2570/tcp # HS Port
+# Uri Doron <uri at il.netect.com>
+cecsvc 2571/udp # CECSVC
+cecsvc 2571/tcp # CECSVC
+# Roger Pao <rpao at corder-eng.com>
+ibp 2572/udp # IBP
+ibp 2572/tcp # IBP
+# Jonathan Downes <jonno at activ.net.au>
+trustestablish 2573/udp # Trust Establish
+trustestablish 2573/tcp # Trust Establish
+# Yosi Mass <yosimass at haifa.vnet.ibm.com>
+blockade-bpsp 2574/udp # Blockade BPSP
+blockade-bpsp 2574/tcp # Blockade BPSP
+# VP - Research & Development <development at blockade.com>
+hl7 2575/udp # HL7
+hl7 2575/tcp # HL7
+# Tim Jacobs
+tclprodebugger 2576/udp # TCL Pro Debugger
+tclprodebugger 2576/tcp # TCL Pro Debugger
+scipticslsrvr 2577/udp # Scriptics Lsrvr
+scipticslsrvr 2577/tcp # Scriptics Lsrvr
+# Brent Welch <welch at scriptics.com>
+rvs-isdn-dcp 2578/udp # RVS ISDN DCP
+rvs-isdn-dcp 2578/tcp # RVS ISDN DCP
+# Michael Zirpel <mbz at rvscom.com>
+mpfoncl 2579/udp # mpfoncl
+mpfoncl 2579/tcp # mpfoncl
+# Itaru Kimura <kimura at kel.fujitsu.co.jp>
+tributary 2580/udp # Tributary
+tributary 2580/tcp # Tributary
+# Louis Lu <LouisL at bristol.com>
+argis-te 2581/udp # ARGIS TE
+argis-te 2581/tcp # ARGIS TE
+argis-ds 2582/udp # ARGIS DS
+argis-ds 2582/tcp # ARGIS DS
+# John Legh-Page <john.legh-page at argis.com>
+mon 2583/udp # MON
+mon 2583/tcp # MON
+# Jim Trocki <trockij at transmeta.com>
+cyaserv 2584/udp # cyaserv
+cyaserv 2584/tcp # cyaserv
+# Morgan Jones <mwj at cyasolutions.com>
+netx-server 2585/udp # NETX Server
+netx-server 2585/tcp # NETX Server
+netx-agent 2586/udp # NETX Agent
+netx-agent 2586/tcp # NETX Agent
+# Brett Dolecheck <Dolecheck at IPMetrics.com>
+masc 2587/udp # MASC
+masc 2587/tcp # MASC
+# Pavlin Ivanov Radoslavov
+# <pavlin at catarina.usc.edu>
+privilege 2588/udp # Privilege
+privilege 2588/tcp # Privilege
+# Gil Hecht <GilH at aks.com>
+quartus-tcl 2589/udp # quartus tcl
+quartus-tcl 2589/tcp # quartus tcl
+# Subroto Datta <subrotod at altera.com>
+idotdist 2590/udp # idotdist
+idotdist 2590/tcp # idotdist
+# Jason Hunter <jthunter at invino.com>
+maytagshuffle 2591/udp # Maytag Shuffle
+maytagshuffle 2591/tcp # Maytag Shuffle
+# Maytag Corporation <hbuck at maytag.com>
+netrek 2592/udp # netrek
+netrek 2592/tcp # netrek
+# Al Guetzlaff <aeg at teamquest.com>
+mns-mail 2593/udp # MNS Mail Notice Service
+mns-mail 2593/tcp # MNS Mail Notice Service
+# Rumiko Kikuta <kiku at nd.net.fujitsu.co.jp>
+dts 2594/udp # Data Base Server
+dts 2594/tcp # Data Base Server
+# Andreas Roene <support at home-online.de>
+worldfusion1 2595/udp # World Fusion 1
+worldfusion1 2595/tcp # World Fusion 1
+worldfusion2 2596/udp # World Fusion 2
+worldfusion2 2596/tcp # World Fusion 2
+# World Fusion <net at worldfusion.com>
+homesteadglory 2597/udp # Homestead Glory
+homesteadglory 2597/tcp # Homestead Glory
+# John Tokash <jtokash at homestead.com>
+citriximaclient 2598/udp # Citrix MA Client
+citriximaclient 2598/tcp # Citrix MA Client
+# Myk Willis <myk.willis at citrix.com>
+snapd 2599/udp # Snap Discovery
+snapd 2599/tcp # Snap Discovery
+# Kevin Osborn <kosborn at snapappliance.com>
+hpstgmgr 2600/udp # HPSTGMGR
+hpstgmgr 2600/tcp # HPSTGMGR
+# Kevin Collins <kevinc at .cnd.hp.com>
+discp-client 2601/udp # discp client
+discp-client 2601/tcp # discp client
+discp-server 2602/udp # discp server
+discp-server 2602/tcp # discp server
+# Peter White <peter_white at 3com.com>
+servicemeter 2603/udp # Service Meter
+servicemeter 2603/tcp # Service Meter
+# Duncan Hare <Duncan.Hare at synoia.com>
+nsc-ccs 2604/udp # NSC CCS
+nsc-ccs 2604/tcp # NSC CCS
+nsc-posa 2605/udp # NSC POSA
+nsc-posa 2605/tcp # NSC POSA
+# Tom Findley <tom.findley at networksciences.net>
+netmon 2606/udp # Dell Netmon
+netmon 2606/tcp # Dell Netmon
+connection 2607/udp # Dell Connection
+connection 2607/tcp # Dell Connection
+# Sudhir Shetty <Sudhir_Shetty at Dell.com>
+wag-service 2608/udp # Wag Service
+wag-service 2608/tcp # Wag Service
+# Gilles Bourquard <gbo at wag.ch>
+system-monitor 2609/udp # System Monitor
+system-monitor 2609/tcp # System Monitor
+# Greg Robson-Garth <gregr at alphalink.com.au>
+versa-tek 2610/udp # VersaTek
+versa-tek 2610/tcp # VersaTek
+# James Kou <Jamesk at versatek.com>
+lionhead 2611/udp # LIONHEAD
+lionhead 2611/tcp # LIONHEAD
+# Tim Rance <trance at lionhead.co.uk>
+qpasa-agent 2612/udp # Qpasa Agent
+qpasa-agent 2612/tcp # Qpasa Agent
+# Craig Ching <cching at mqsoftware.com>
+smntubootstrap 2613/udp # SMNTUBootstrap
+smntubootstrap 2613/tcp # SMNTUBootstrap
+# Matt Cecile <mattc at metrics.com>
+neveroffline 2614/udp # Never Offline
+neveroffline 2614/tcp # Never Offline
+# Dustin Brand <amo at amo.net>
+firepower 2615/udp # firepower
+firepower 2615/tcp # firepower
+# Jason Volk <jason at teknidude.com>
+appswitch-emp 2616/udp # appswitch-emp
+appswitch-emp 2616/tcp # appswitch-emp
+# Ted Ross <ross at TopLayer.com>
+cmadmin 2617/udp # Clinical Context Managers
+cmadmin 2617/tcp # Clinical Context Managers
+# Mark Morwood <markm at sentillion.com>
+priority-e-com 2618/udp # Priority E-Com
+priority-e-com 2618/tcp # Priority E-Com
+# Marcelo Einhorn <marcelo at eshbel.com>
+bruce 2619/udp # bruce
+bruce 2619/tcp # bruce
+# Alec Muffett <alecm at sun.com>
+lpsrecommender 2620/udp # LPSRecommender
+lpsrecommender 2620/tcp # LPSRecommender
+# Pritham Shetty <pritham at andromedia.com>
+miles-apart 2621/udp # Miles Apart Jukebox Server
+miles-apart 2621/tcp # Miles Apart Jukebox Server
+# Michael Rathmann <rathmann_ia at milesinfo.com>
+metricadbc 2622/udp # MetricaDBC
+metricadbc 2622/tcp # MetricaDBC
+# Russ Olivant <russ.olivant at metrica.co.uk>
+lmdp 2623/udp # LMDP
+lmdp 2623/tcp # LMDP
+# Ken Bailey <kbailey at rockettalk.com>
+aria 2624/udp # Aria
+aria 2624/tcp # Aria
+# Logan Bruns <logan at andromedia.com>
+blwnkl-port 2625/udp # Blwnkl Port
+blwnkl-port 2625/tcp # Blwnkl Port
+# Weng Chin (Winson) Yung <Winson_Yung at 3com.com>
+gbjd816 2626/udp # gbjd816
+gbjd816 2626/tcp # gbjd816
+# George Balesta <George.Baletsa at tfn.com>
+moshebeeri 2627/udp # Moshe Beeri
+moshebeeri 2627/tcp # Moshe Beeri
+# Moshe Beeri <moshe at whale-com.com>
+dict 2628/udp # DICT
+dict 2628/tcp # DICT
+# Rik Faith <faith at cs.unc.edu>
+sitaraserver 2629/udp # Sitara Server
+sitaraserver 2629/tcp # Sitara Server
+sitaramgmt 2630/udp # Sitara Management
+sitaramgmt 2630/tcp # Sitara Management
+sitaradir 2631/udp # Sitara Dir
+sitaradir 2631/tcp # Sitara Dir
+# Manickam R.Sridhar <msridhar at sitaranetworks.com>
+irdg-post 2632/udp # IRdg Post
+irdg-post 2632/tcp # IRdg Post
+# IRdg, Inc. <jtaylor at irdg.com>
+interintelli 2633/udp # InterIntelli
+interintelli 2633/tcp # InterIntelli
+# Mike Gagle <MikeG at inter-intelli.com>
+pk-electronics 2634/udp # PK Electronics
+pk-electronics 2634/tcp # PK Electronics
+# Seb Ibis <seb_ibis at pkworld.com>
+backburner 2635/udp # Back Burner
+backburner 2635/tcp # Back Burner
+# Kevin Teiskoetter <kevint at metacreations.com>
+solve 2636/udp # Solve
+solve 2636/tcp # Solve
+# Peter Morrison <peter_morrison at sydney.sterling.com>
+imdocsvc 2637/udp # Import Document Service
+imdocsvc 2637/tcp # Import Document Service
+# Zia Bhatti <zia at netright.com>
+sybaseanywhere 2638/udp # Sybase Anywhere
+sybaseanywhere 2638/tcp # Sybase Anywhere
+# Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+aminet 2639/udp # AMInet
+aminet 2639/tcp # AMInet
+# Alcorn McBride Inc. <jeff at alcorn.com>
+sai_sentlm 2640/udp # Sabbagh Associates Licence Manager
+sai_sentlm 2640/tcp # Sabbagh Associates Licence Manager
+# Elias Sabbagh <ehs at sabbagh.com>
+hdl-srv 2641/udp # HDL Server
+hdl-srv 2641/tcp # HDL Server
+# David Ely <dely at cnri.reston.va.us>
+tragic 2642/udp # Tragic
+tragic 2642/tcp # Tragic
+# Stu Mark <fordii at j51.com>
+gte-samp 2643/udp # GTE-SAMP
+gte-samp 2643/tcp # GTE-SAMP
+# Asher Altman <Asher.Altman at GSC.GTE.Com>
+travsoft-ipx-t 2644/udp # Travsoft IPX Tunnel
+travsoft-ipx-t 2644/tcp # Travsoft IPX Tunnel
+# Jack Wilson <JackW at travsoft.com>
+novell-ipx-cmd 2645/udp # Novell IPX CMD
+novell-ipx-cmd 2645/tcp # Novell IPX CMD
+# Juan Carlos Luciani <jluciani at novell.com>
+and-lm 2646/udp # AND License Manager
+and-lm 2646/tcp # AND License Manager
+# Dick van der Sijs <dick at and.nl>
+syncserver 2647/udp # SyncServer
+syncserver 2647/tcp # SyncServer
+# Dave Finnegan <dave at syncinc.com>
+upsnotifyprot 2648/udp # Upsnotifyprot
+upsnotifyprot 2648/tcp # Upsnotifyprot
+# Mario Leboute <leboute at pro.via-rs.com.br>
+vpsipport 2649/udp # VPSIPPORT
+vpsipport 2649/tcp # VPSIPPORT
+# Joon Radley <jradley at csir.co.za>
+eristwoguns 2650/udp # eristwoguns
+eristwoguns 2650/tcp # eristwoguns
+# NetPro Computing Inc. <ports at netpro.com>
+ebinsite 2651/udp # EBInSite
+ebinsite 2651/tcp # EBInSite
+# Lefteris Kalamaras <lefteris at ebi.com>
+interpathpanel 2652/udp # InterPathPanel
+interpathpanel 2652/tcp # InterPathPanel
+# Stephen Misel <steve.misel at interpath.net>
+sonus 2653/udp # Sonus
+sonus 2653/tcp # Sonus
+# Mark Garti <mgarti at sonusnet.com>
+corel_vncadmin 2654/udp # Corel VNC Admin
+corel_vncadmin 2654/tcp # Corel VNC Admin
+# Oleg Noskov <olegn at corelcomputer.com>
+unglue 2655/udp # UNIX Nt Glue
+unglue 2655/tcp # UNIX Nt Glue
+# Peter Santoro <peter at pscomp.com>
+kana 2656/udp # Kana
+kana 2656/tcp # Kana
+# Colin Goldstein <Colin at kana.com>
+sns-dispatcher 2657/udp # SNS Dispatcher
+sns-dispatcher 2657/tcp # SNS Dispatcher
+sns-admin 2658/udp # SNS Admin
+sns-admin 2658/tcp # SNS Admin
+sns-query 2659/udp # SNS Query
+sns-query 2659/tcp # SNS Query
+# Mary Holstege <holstege at firstfloor.com>
+gcmonitor 2660/udp # GC Monitor
+gcmonitor 2660/tcp # GC Monitor
+# Gustavo Rodriguez-Rivera <grr at geodesic.com>
+olhost 2661/udp # OLHOST
+olhost 2661/tcp # OLHOST
+# Robert Ripberger <rip at lan-aces.com>
+bintec-capi 2662/udp # BinTec-CAPI
+bintec-capi 2662/tcp # BinTec-CAPI
+bintec-tapi 2663/udp # BinTec-TAPI
+bintec-tapi 2663/tcp # BinTec-TAPI
+#
+patrol-mq-gm 2664/udp # Patrol for MQ GM
+patrol-mq-gm 2664/tcp # Patrol for MQ GM
+patrol-mq-nm 2665/udp # Patrol for MQ NM
+patrol-mq-nm 2665/tcp # Patrol for MQ NM
+# Richard Nikula <richard_nikula at bmc.com>
+extensis 2666/udp # extensis
+extensis 2666/tcp # extensis
+# Milton Sagen <msagen at extensis.com>
+alarm-clock-s 2667/udp # Alarm Clock Server
+alarm-clock-s 2667/tcp # Alarm Clock Server
+alarm-clock-c 2668/udp # Alarm Clock Client
+alarm-clock-c 2668/tcp # Alarm Clock Client
+toad 2669/udp # TOAD
+toad 2669/tcp # TOAD
+# Michael Marking <marking at tatanka.com>
+tve-announce 2670/udp # TVE Announce
+tve-announce 2670/tcp # TVE Announce
+# Dean Blackketter <dean at corp.webtv.net>
+newlixreg 2671/udp # newlixreg
+newlixreg 2671/tcp # newlixreg
+# Jean-Serge Gagnon <jsg at newlix.com>
+nhserver 2672/udp # nhserver
+nhserver 2672/tcp # nhserver
+# Adrian Hornby <Adrian.Hornby at aran.co.uk>
+firstcall42 2673/udp # First Call 42
+firstcall42 2673/tcp # First Call 42
+# Luke Bowen <leb at tfn.com>
+ewnn 2674/udp # ewnn
+ewnn 2674/tcp # ewnn
+# Yasunari Yamashita <yamasita at omronsoft.co.jp>
+ttc-etap 2675/udp # TTC ETAP
+ttc-etap 2675/tcp # TTC ETAP
+# Daniel Becker <becker2d at ttc.com>
+simslink 2676/udp # SIMSLink
+simslink 2676/tcp # SIMSLink
+# Steve Ryckman <sryckman at simsware.com>
+gadgetgate1way 2677/udp # Gadget Gate 1 Way
+gadgetgate1way 2677/tcp # Gadget Gate 1 Way
+gadgetgate2way 2678/udp # Gadget Gate 2 Way
+gadgetgate2way 2678/tcp # Gadget Gate 2 Way
+# Matt Rollins <matt at internetgadgets.com>
+syncserverssl 2679/udp # Sync Server SSL
+syncserverssl 2679/tcp # Sync Server SSL
+# Dave Finnegan <dave at syncinc.com>
+pxc-sapxom 2680/udp # pxc-sapxom
+pxc-sapxom 2680/tcp # pxc-sapxom
+# Hideki Kiriyama <kiriyama at cp10.es.xerox.com>
+mpnjsomb 2681/udp # mpnjsomb
+mpnjsomb 2681/tcp # mpnjsomb
+# Takenori Miyahara <miyahara at pfu.co.jp>
+# 2682 Removed (2002-04-30)
+ncdloadbalance 2683/udp # NCDLoadBalance
+ncdloadbalance 2683/tcp # NCDLoadBalance
+# Tim Stevenson <tes at ncd.com>
+mpnjsosv 2684/udp # mpnjsosv
+mpnjsosv 2684/tcp # mpnjsosv
+mpnjsocl 2685/udp # mpnjsocl
+mpnjsocl 2685/tcp # mpnjsocl
+mpnjsomg 2686/udp # mpnjsomg
+mpnjsomg 2686/tcp # mpnjsomg
+# Takenori Miyahara <miyahara at pfu.co.jp>
+pq-lic-mgmt 2687/udp # pq-lic-mgmt
+pq-lic-mgmt 2687/tcp # pq-lic-mgmt
+# Bob Sledge <bob at pqsystems.com>
+md-cg-http 2688/udp # md-cf-http
+md-cg-http 2688/tcp # md-cf-http
+# Lyndon Nerenberg <lyndon at execmail.ca>
+fastlynx 2689/udp # FastLynx
+fastlynx 2689/tcp # FastLynx
+# Dave Sewell <dave at sewelld.com>
+hp-nnm-data 2690/udp # HP NNM Embedded Database
+hp-nnm-data 2690/tcp # HP NNM Embedded Database
+# Chris Das <cdas at cnd.hp.com>
+itinternet 2691/udp # ITInternet ISM Server
+itinternet 2691/tcp # ITInternet ISM Server
+# Ron Ehli <ron at itinternet.net>
+admins-lms 2692/udp # Admins LMS
+admins-lms 2692/tcp # Admins LMS
+# Dagfinn Saether <Dagfinn at admins.com>
+belarc-http 2693/udp # belarc-http
+belarc-http 2693/tcp # belarc-http
+# Gary Newman <gnewman at belarc.com>
+pwrsevent 2694/udp # pwrsevent
+pwrsevent 2694/tcp # pwrsevent
+# Yoshinobu Nakamura
+# <nakamura at np.lps.cs.fujitsu.co.jp>
+vspread 2695/udp # VSPREAD
+vspread 2695/tcp # VSPREAD
+# Sumitake kobayashi
+# <kobayashi at np.lps.cs.fujitsu.co.jp>
+unifyadmin 2696/udp # Unify Admin
+unifyadmin 2696/tcp # Unify Admin
+# Duane Gibson <ianaportmaster at unify.com>
+oce-snmp-trap 2697/udp # Oce SNMP Trap Port
+oce-snmp-trap 2697/tcp # Oce SNMP Trap Port
+# Peter Teeuwen <ptee at oce.nl>
+mck-ivpip 2698/udp # MCK-IVPIP
+mck-ivpip 2698/tcp # MCK-IVPIP
+# Robert Vincent <bert at mck.com>
+csoft-plusclnt 2699/udp # Csoft Plus Client
+csoft-plusclnt 2699/tcp # Csoft Plus Client
+# Nedelcho Stanev <nstanev at csoft.bg>
+tqdata 2700/udp # tqdata
+tqdata 2700/tcp # tqdata
+# Al Guetzlaff <aeg at teamquest.com>
+sms-rcinfo 2701/udp # SMS RCINFO
+sms-rcinfo 2701/tcp # SMS RCINFO
+sms-xfer 2702/udp # SMS XFER
+sms-xfer 2702/tcp # SMS XFER
+sms-chat 2703/udp # SMS CHAT
+sms-chat 2703/tcp # SMS CHAT
+sms-remctrl 2704/udp # SMS REMCTRL
+sms-remctrl 2704/tcp # SMS REMCTRL
+# Tom Friend <tomfr at microsoft.com>
+sds-admin 2705/udp # SDS Admin
+sds-admin 2705/tcp # SDS Admin
+# Don Traub <don.traub at sun.com>
+ncdmirroring 2706/udp # NCD Mirroring
+ncdmirroring 2706/tcp # NCD Mirroring
+# Tim Stevenson <tes at ncd.com>
+emcsymapiport 2707/udp # EMCSYMAPIPORT
+emcsymapiport 2707/tcp # EMCSYMAPIPORT
+# Bruce Ferjulian <ferjulian_bruce at emc.com>
+banyan-net 2708/udp # Banyan-Net
+banyan-net 2708/tcp # Banyan-Net
+# R. Thirumurthy <rtm at banyannetworks.com>
+supermon 2709/udp # Supermon
+supermon 2709/tcp # Supermon
+# Ron Minnich <rminnich at acl.lanl.gov>
+sso-service 2710/udp # SSO Service
+sso-service 2710/tcp # SSO Service
+sso-control 2711/udp # SSO Control
+sso-control 2711/tcp # SSO Control
+# Martin Proulx <mproulx at okiok.com>
+aocp 2712/udp # Axapta Object Communication Protocol
+aocp 2712/tcp # Axapta Object Communication Protocol
+# Jakob Steen Hansen <jsh at dk.damgaard.com>
+raven1 2713/udp # Raven1
+raven1 2713/tcp # Raven1
+raven2 2714/udp # Raven2
+raven2 2714/tcp # Raven2
+# Daniel Sorlov <Daniel at sorlov.com>
+hpstgmgr2 2715/udp # HPSTGMGR2
+hpstgmgr2 2715/tcp # HPSTGMGR2
+# Kevin Collins <kevinc at cnd.hp.com>
+inova-ip-disco 2716/udp # Inova IP Disco
+inova-ip-disco 2716/tcp # Inova IP Disco
+# Chris Koeritz <ckoeritz at inovacorp.com>
+pn-requester 2717/udp # PN REQUESTER
+pn-requester 2717/tcp # PN REQUESTER
+pn-requester2 2718/udp # PN REQUESTER 2
+pn-requester2 2718/tcp # PN REQUESTER 2
+# Edmund Chang <Edmund_Chang at bmc.com>
+scan-change 2719/udp # Scan & Change
+scan-change 2719/tcp # Scan & Change
+# Alexander Raji <araji at lucent.com>
+wkars 2720/udp # wkars
+wkars 2720/tcp # wkars
+# Barry Shelton <bshelton at wirelessknowledge.com>
+smart-diagnose 2721/udp # Smart Diagnose
+smart-diagnose 2721/tcp # Smart Diagnose
+# Geoffry Meek <geoff at meek.com>
+proactivesrvr 2722/udp # Proactive Server
+proactivesrvr 2722/tcp # Proactive Server
+# Dalit Naor <dalit at il.ibm.com>
+watchdognt 2723/udp # WatchDog NT
+watchdognt 2723/tcp # WatchDog NT
+# Glen Sansoucie <glens at llmwin.com>
+qotps 2724/udp # qotps
+qotps 2724/tcp # qotps
+# Piotr Parlewicz <pparlewicz at queryobject.com>
+msolap-ptp2 2725/udp # MSOLAP PTP2
+msolap-ptp2 2725/tcp # MSOLAP PTP2
+# Cristian Petculescu <cristp at microsoft.com>
+tams 2726/udp # TAMS
+tams 2726/tcp # TAMS
+# David Leinbach <dleinbach at jti.bc.ca>
+mgcp-callagent 2727/udp # Media Gateway Control Protocol Call Agent
+mgcp-callagent 2727/tcp # Media Gateway Control Protocol Call Agent
+# Christian Huitema <huitema at research.telcordia.com>
+sqdr 2728/udp # SQDR
+sqdr 2728/tcp # SQDR
+# Matthew Orzen <standards at starquest.com>
+tcim-control 2729/udp # TCIM Control
+tcim-control 2729/tcp # TCIM Control
+# Dean Skelton <mdskel at ftw.rsc.raytheon.com>
+nec-raidplus 2730/udp # NEC RaidPlus
+nec-raidplus 2730/tcp # NEC RaidPlus
+# Yusuke Asai <yasai at nw1.file.fc.nec.co.jp>
+fyre-messanger 2731/udp # Fyre Messagner
+fyre-messanger 2731/tcp # Fyre Messanger
+# Robert Waters <bobtek at hotmail.com>
+g5m 2732/udp # G5M
+g5m 2732/tcp # G5M
+# Graham Klyne <GK at ACM.ORG>
+signet-ctf 2733/udp # Signet CTF
+signet-ctf 2733/tcp # Signet CTF
+# Greg Broiles <greg at sac.net>
+ccs-software 2734/udp # CCS Software
+ccs-software 2734/tcp # CCS Software
+# Bertus Jacobs <bertus at ccs-software.co.za>
+netiq-mc 2735/udp # NetIQ Monitor Console
+netiq-mc 2735/tcp # NetIQ Monitor Console
+# Scott Southard <scott.southard at netiq.com>
+radwiz-nms-srv 2736/udp # RADWIZ NMS SRV
+radwiz-nms-srv 2736/tcp # RADWIZ NMS SRV
+# Israel Shainert <israels at 209.88.177.2>
+srp-feedback 2737/udp # SRP Feedback
+srp-feedback 2737/tcp # SRP Feedback
+# Werner Almesberger <Werner.Almesberger at epfl.ch>
+ndl-tcp-ois-gw 2738/udp # NDL TCP-OSI Gateway
+ndl-tcp-ois-gw 2738/tcp # NDL TCP-OSI Gateway
+# Martin Norman <martin at ndl.co.uk>
+tn-timing 2739/udp # TN Timing
+tn-timing 2739/tcp # TN Timing
+# Paul Roberts <PaulRoberts at engineer.com>
+alarm 2740/udp # Alarm
+alarm 2740/tcp # Alarm
+# Uriy Makasjuk <racer at bfpg.ru>
+tsb 2741/udp # TSB
+tsb 2741/tcp # TSB
+tsb2 2742/udp # TSB2
+tsb2 2742/tcp # TSB2
+# Ashish Chatterjee
+# <achatterjee at freeway.proxy.lucent.com>
+murx 2743/udp # murx
+murx 2743/tcp # murx
+# Thomas Kuiper <engerim at dachbu.de>
+honyaku 2744/udp # honyaku
+honyaku 2744/tcp # honyaku
+# Yasunari Yamashita <yamasita at omronsoft.co.jp>
+urbisnet 2745/udp # URBISNET
+urbisnet 2745/tcp # URBISNET
+# Urbis.Net Ltd <postmaster at urbis.net>
+cpudpencap 2746/udp # CPUDPENCAP
+cpudpencap 2746/tcp # CPUDPENCAP
+# Tamir Zegman <zegman at checkpoint.com>
+fjippol-swrly 2747/udp #
+fjippol-swrly 2747/tcp #
+fjippol-polsvr 2748/udp #
+fjippol-polsvr 2748/tcp #
+fjippol-cnsl 2749/udp #
+fjippol-cnsl 2749/tcp #
+fjippol-port1 2750/udp #
+fjippol-port1 2750/tcp #
+fjippol-port2 2751/udp #
+fjippol-port2 2751/tcp #
+# Shoichi Tachibana <tatibana at yk.fujitsu.co.jp>
+rsisysaccess 2752/udp # RSISYS ACCESS
+rsisysaccess 2752/tcp # RSISYS ACCESS
+# Christophe Besant
+de-spot 2753/udp # de-spot
+de-spot 2753/tcp # de-spot
+# Sanjay Parekh <spot at digitalenvoy.net>
+apollo-cc 2754/udp # APOLLO CC
+apollo-cc 2754/tcp # APOLLO CC
+# Brand Communications <donovan at brandcomms.com>
+expresspay 2755/udp # Express Pay
+expresspay 2755/tcp # Express Pay
+# Ben Higgins <bhiggins at netcom.ca>
+simplement-tie 2756/udp # simplement-tie
+simplement-tie 2756/tcp # simplement-tie
+# Tzvika Chumash <tzvikac at netvision.net.il>
+cnrp 2757/udp # CNRP
+cnrp 2757/tcp # CNRP
+# Jacob Ulmert <Jacob.Ulmert at se.abb.com>
+apollo-status 2758/udp # APOLLO Status
+apollo-status 2758/tcp # APOLLO Status
+apollo-gms 2759/udp # APOLLO GMS
+apollo-gms 2759/tcp # APOLLO GMS
+# Simon Hovell <simonh at brandcomms.com>
+sabams 2760/udp # Saba MS
+sabams 2760/tcp # Saba MS
+# Davoud Maha <dmaha at saba.com>
+dicom-iscl 2761/udp # DICOM ISCL
+dicom-iscl 2761/tcp # DICOM ISCL
+dicom-tls 2762/udp # DICOM TLS
+dicom-tls 2762/tcp # DICOM TLS
+# Lawrence Tarbox <ltarbox at scr.siemens.com>
+desktop-dna 2763/udp # Desktop DNA
+desktop-dna 2763/tcp # Desktop DNA
+# Jon Walker <jwalker at miramarsys.com>
+data-insurance 2764/udp # Data Insurance
+data-insurance 2764/tcp # Data Insurance
+# Brent Irwin <birwin at standard.com>
+qip-audup 2765/udp # qip-audup
+qip-audup 2765/tcp # qip-audup
+# Mike Morgan <mmorgan at lucent.com>
+compaq-scp 2766/udp # Compaq SCP
+compaq-scp 2766/tcp # Compaq SCP
+# Ferruccio Barletta <ferruccio.barletta at compaq.com>
+uadtc 2767/udp # UADTC
+uadtc 2767/tcp # UADTC
+uacs 2768/udp # UACS
+uacs 2768/tcp # UACS
+# Vishwas Lele <Vishwas_Lele at appliedis.com>
+singlept-mvs 2769/udp # Single Point MVS
+singlept-mvs 2769/tcp # Single Point MVS
+# Thomas Anderson <anderson at clark.net>
+veronica 2770/udp # Veronica
+veronica 2770/tcp # Veronica
+# Jonas Oberg <jonas at coyote.org>
+vergencecm 2771/udp # Vergence CM
+vergencecm 2771/tcp # Vergence CM
+# Mark Morwood <markm at sentillion.com>
+auris 2772/udp # auris
+auris 2772/tcp # auris
+# Francisco Saez Arance <fsaez at tid.es>
+rbakcup1 2773/udp # RBackup Remote Backup
+rbakcup1 2773/tcp # RBackup Remote Backup
+rbakcup2 2774/udp # RBackup Remote Backup
+rbakcup2 2774/tcp # RBackup Remote Backup
+# Rob Cosgrove <rob at alice.net>
+smpp 2775/udp # SMPP
+smpp 2775/tcp # SMPP
+# Owen Sullivan <owen.sullivan at aldiscon.ie>
+ridgeway1 2776/udp # Ridgeway Systems & Software
+ridgeway1 2776/tcp # Ridgeway Systems & Software
+ridgeway2 2777/udp # Ridgeway Systems & Software
+ridgeway2 2777/tcp # Ridgeway Systems & Software
+# Steve Read <sread at ridgeway-sys.com>
+gwen-sonya 2778/udp # Gwen-Sonya
+gwen-sonya 2778/tcp # Gwen-Sonya
+# Mark Hurst <mhurst at inconnect.com>
+lbc-sync 2779/udp # LBC Sync
+lbc-sync 2779/tcp # LBC Sync
+lbc-control 2780/udp # LBC Control
+lbc-control 2780/tcp # LBC Control
+# Keiji Michine <michine at net.paso.fujitsu.co.jp>
+whosells 2781/udp # whosells
+whosells 2781/tcp # whosells
+# William Randolph Royere III
+# <william at royere.net>
+everydayrc 2782/udp # everydayrc
+everydayrc 2782/tcp # everydayrc
+# Ahti Heinla <ahti at ahti.bluemoon.ee>
+aises 2783/udp # AISES
+aises 2783/tcp # AISES
+# Daniel Grazioli <dgrazioli at pgaero.co.uk>
+www-dev 2784/udp # world wide web - development
+www-dev 2784/tcp # world wide web - development
+aic-np 2785/udp # aic-np
+aic-np 2785/tcp # aic-np
+# Brad Parker <brad at american.com>
+aic-oncrpc 2786/udp # aic-oncrpc - Destiny MCD database
+aic-oncrpc 2786/tcp # aic-oncrpc - Destiny MCD database
+# Brad Parker <brad at american.com>
+piccolo 2787/udp # piccolo - Cornerstone Software
+piccolo 2787/tcp # piccolo - Cornerstone Software
+# Dave Bellivea <DaveBelliveau at corsof.com>
+fryeserv 2788/udp # NetWare Loadable Module - Seagate Software
+fryeserv 2788/tcp # NetWare Loadable Module - Seagate Software
+# Joseph LoPilato
+# <Joseph_M_LoPilato at notes.seagate.com>
+media-agent 2789/udp # Media Agent
+media-agent 2789/tcp # Media Agent
+# Nitzan Daube <nitzan at brm.com>
+plgproxy 2790/udp # PLG Proxy
+plgproxy 2790/tcp # PLG Proxy
+# Charlie Hava <charlieh at aks.com>
+mtport-regist 2791/udp # MT Port Registrator
+mtport-regist 2791/tcp # MT Port Registrator
+# Maxim Tseitlin <mtseitlin at iname.com>
+f5-globalsite 2792/udp # f5-globalsite
+f5-globalsite 2792/tcp # f5-globalsite
+# Christian Saether <c.saether at f5.com>
+initlsmsad 2793/udp # initlsmsad
+initlsmsad 2793/tcp # initlsmsad
+# Kelly Green <green at compaq.com>
+aaftp 2794/udp # aaftp
+aaftp 2794/tcp # aaftp
+# E. Jay Berkenbilt <ejb at ql.org>
+livestats 2795/udp # LiveStats
+livestats 2795/tcp # LiveStats
+# Chris Greene <cgreeneOA at avidsports.com>
+ac-tech 2796/udp # ac-tech
+ac-tech 2796/tcp # ac-tech
+# Chiming Huang <chuang at ac-tech.com>
+esp-encap 2797/udp # esp-encap
+esp-encap 2797/tcp # esp-encap
+# Jorn Sierwald <joern.sierwald at datafellows.com>
+tmesis-upshot 2798/udp # TMESIS-UPShot
+tmesis-upshot 2798/tcp # TMESIS-UPShot
+# Brian Schenkenberger <VAXman at TMESIS.COM>
+icon-discover 2799/udp # ICON Discover
+icon-discover 2799/tcp # ICON Discover
+# Alexander Falk <falk at icon.at>
+acc-raid 2800/udp # ACC RAID
+acc-raid 2800/tcp # ACC RAID
+# Scott St. Clair <stclair at ntc.adaptec.com>
+igcp 2801/udp # IGCP
+igcp 2801/tcp # IGCP
+# David Hampson <davidha at codemasters.com>
+veritas-udp1 2802/udp # Veritas UDP1
+veritas-tcp1 2802/tcp # Veritas TCP1
+# Russ Thrasher <Russell.Thrasher at veritas.com>
+btprjctrl 2803/udp # btprjctrl
+btprjctrl 2803/tcp # btprjctrl
+# Huw Thomas <huw.thomas at bt.com>
+telexis-vtu 2804/udp # Telexis VTU
+telexis-vtu 2804/tcp # Telexis VTU
+# Todd White <twhite at telexicorp.com>
+wta-wsp-s 2805/udp # WTA WSP-S
+wta-wsp-s 2805/tcp # WTA WSP-S
+# Sebastien Bury (WAP Forum)
+# <sebastien.bury at art.alcatel.fr>
+cspuni 2806/udp # cspuni
+cspuni 2806/tcp # cspuni
+cspmulti 2807/udp # cspmulti
+cspmulti 2807/tcp # cspmulti
+# Terumasa Yoneda <yonedat at pfu.co.jp>
+j-lan-p 2808/udp # J-LAN-P
+j-lan-p 2808/tcp # J-LAN-P
+# Takeshi Sahara <sahara at jdl.co.jp>
+corbaloc 2809/udp # CORBA LOC
+corbaloc 2809/tcp # CORBA LOC
+# Ted McFadden <mcfadden at dstc.edu.au>
+netsteward 2810/udp # Active Net Steward
+netsteward 2810/tcp # Active Net Steward
+# Keith Morley <keith at ndl.co.uk>
+gsiftp 2811/udp # GSI FTP
+gsiftp 2811/tcp # GSI FTP
+# Von Welch <vwelch at ncsa.uiuc.edu>
+atmtcp 2812/udp # atmtcp
+atmtcp 2812/tcp # atmtcp
+# Werner Almesberger <Werner.Almesberger at epfl.ch>
+llm-pass 2813/udp # llm-pass
+llm-pass 2813/tcp # llm-pass
+llm-csv 2814/udp # llm-csv
+llm-csv 2814/tcp # llm-csv
+# Glen Sansoucie <glen at llmwin.com>
+lbc-measure 2815/udp # LBC Measurement
+lbc-measure 2815/tcp # LBC Measurement
+lbc-watchdog 2816/udp # LBC Watchdog
+lbc-watchdog 2816/tcp # LBC Watchdog
+# Akiyoshi Ochi <akiyoshi at net.paso.fujitsu.co.jp>
+nmsigport 2817/udp # NMSig Port
+nmsigport 2817/tcp # NMSig Port
+# Peter Egli <peter.egli at mail.inalp.com>
+rmlnk 2818/udp # rmlnk
+rmlnk 2818/tcp # rmlnk
+fc-faultnotify 2819/udp # FC Fault Notification
+fc-faultnotify 2819/tcp # FC Fault Notification
+# Dave Watkins <davew at boi.hp.com>
+univision 2820/udp # UniVision
+univision 2820/tcp # UniVision
+# Keith Ansell <KeithA at fastfreenet.com>
+vrts-at-port 2821/udp # VERITAS Authentication Service
+vrts-at-port 2821/tcp # VERITAS Authentication Service
+# Stefan Winkel <stefan at veritas.com>
+ka0wuc 2822/udp # ka0wuc
+ka0wuc 2822/tcp # ka0wuc
+# Kit Haskins <kit at ka0wuc.org>
+cqg-netlan 2823/udp # CQG Net/LAN
+cqg-netlan 2823/tcp # CQG Net/LAN
+cqg-netlan-1 2824/udp # CQG Net/Lan 1
+cqg-netlan-1 2824/tcp # CQG Net/LAN 1
+# Jeff Wood <jw at cqg.com>
+# 2825 (unassigned) Possibly assigned
+slc-systemlog 2826/udp # slc systemlog
+slc-systemlog 2826/tcp # slc systemlog
+slc-ctrlrloops 2827/udp # slc ctrlrloops
+slc-ctrlrloops 2827/tcp # slc ctrlrloops
+# Erwin Hogeweg <erwin at airtech.demon.nl>
+itm-lm 2828/udp # ITM License Manager
+itm-lm 2828/tcp # ITM License Manager
+# Miles O'Neal <meo at us.itmasters.com>
+silkp1 2829/udp # silkp1
+silkp1 2829/tcp # silkp1
+silkp2 2830/udp # silkp2
+silkp2 2830/tcp # silkp2
+silkp3 2831/udp # silkp3
+silkp3 2831/tcp # silkp3
+silkp4 2832/udp # silkp4
+silkp4 2832/tcp # silkp4
+# Erik Skyten <eki at silknet.com>
+glishd 2833/udp # glishd
+glishd 2833/tcp # glishd
+# Darrell Schiebel <dschieb at cv.nrao.edu>
+evtp 2834/udp # EVTP
+evtp 2834/tcp # EVTP
+evtp-data 2835/udp # EVTP-DATA
+evtp-data 2835/tcp # EVTP-DATA
+# Eric Bruno <ebruno at solution-soft.com>
+catalyst 2836/udp # catalyst
+catalyst 2836/tcp # catalyst
+# Garret Tollkuhn <garret at multiviewgroup.com>
+repliweb 2837/udp # Repliweb
+repliweb 2837/tcp # Repliweb
+# William Orme <bill at repliweb.com>
+starbot 2838/udp # Starbot
+starbot 2838/tcp # Starbot
+# Markus Sabadello <sabadello at starbot.org>
+nmsigport 2839/udp # NMSigPort
+nmsigport 2839/tcp # NMSigPort
+# Peter Egli <peter.egli at mail.inalp.com>
+l3-exprt 2840/udp # l3-exprt
+l3-exprt 2840/tcp # l3-exprt
+l3-ranger 2841/udp # l3-ranger
+l3-ranger 2841/tcp # l3-ranger
+l3-hawk 2842/udp # l3-hawk
+l3-hawk 2842/tcp # l3-hawk
+# Dolores Scott <dolores.scott at l-3security.com>
+pdnet 2843/udp # PDnet
+pdnet 2843/tcp # PDnet
+# Torsten Scheffler <torsten.scheffler at apex.de>
+bpcp-poll 2844/udp # BPCP POLL
+bpcp-poll 2844/tcp # BPCP POLL
+bpcp-trap 2845/udp # BPCP TRAP
+bpcp-trap 2845/tcp # BPCP TRAP
+# Steve Van Duser
+# <steve.vanduser at bestpower.gensig.com>
+aimpp-hello 2846/udp # AIMPP Hello
+aimpp-hello 2846/tcp # AIMPP Hello
+aimpp-port-req 2847/udp # AIMPP Port Req
+aimpp-port-req 2847/tcp # AIMPP Port Req
+# Brian Martinicky
+# <Brian_Martinicky at automationintelligence.com>
+amt-blc-port 2848/udp # AMT-BLC-PORT
+amt-blc-port 2848/tcp # AMT-BLC-PORT
+# Sandra Frulloni <frulloni.amtec at interbusiness.it>
+fxp 2849/udp # FXP
+fxp 2849/tcp # FXP
+# Martin Lichtin <lichtin at oanda.com>
+metaconsole 2850/udp # MetaConsole
+metaconsole 2850/tcp # MetaConsole
+# Rakesh Mahajan <rmahajan at netaphor-software.com>
+webemshttp 2851/udp # webemshttp
+webemshttp 2851/tcp # webemshttp
+# Stephen Tsun <stsun at jetstream.com>
+bears-01 2852/udp # bears-01
+bears-01 2852/tcp # bears-01
+# Bruce McKinnon <brucemck at bears.aust.com>
+ispipes 2853/udp # ISPipes
+ispipes 2853/tcp # ISPipes
+# Rajesh Nandyalam <rnandyal at emc.com>
+infomover 2854/udp # InfoMover
+infomover 2854/tcp # InfoMover
+# Carla Caputo <caputo at emc.com>
+cesdinv 2856/udp # cesdinv
+cesdinv 2856/tcp # cesdinv
+# Yoshiaki Tokumoto <toku at pfu.co.jp>
+simctlp 2857/udp # SimCtIP
+simctlp 2857/tcp # SimCtIP
+# Christian Zietz <czietz at gmx.net>
+ecnp 2858/udp # ECNP
+ecnp 2858/tcp # ECNP
+# Robert Reimiller <bob at certsoft.com>
+activememory 2859/udp # Active Memory
+activememory 2859/tcp # Active Memory
+# Joe Graham <joe at edaconsulting.com>
+dialpad-voice1 2860/udp # Dialpad Voice 1
+dialpad-voice1 2860/tcp # Dialpad Voice 1
+dialpad-voice2 2861/udp # Dialpad Voice 2
+dialpad-voice2 2861/tcp # Dialpad Voice 2
+# Wongyu Cho <wgcho at dialpad.com>
+ttg-protocol 2862/udp # TTG Protocol
+ttg-protocol 2862/tcp # TTG Protocol
+# Mark Boler <markb at ttgsoftware.com>
+sonardata 2863/udp # Sonar Data
+sonardata 2863/tcp # Sonar Data
+# Ian Higginbottom <sonardata at sonardata.com>
+astromed-main 2864/udp # main 5001 cmd
+astromed-main 2864/tcp # main 5001 cmd
+# Chris Tate <ctate at astromed.com>
+pit-vpn 2865/udp # pit-vpn
+pit-vpn 2865/tcp # pit-vpn
+# Norbert Sendetzky <norbert at linuxnetworks.de>
+iwlistener 2866/udp # iwlistener
+iwlistener 2866/tcp # iwlistener
+# Fred Surr <quest_iana at oz.quest.com>
+esps-portal 2867/udp # esps-portal
+esps-portal 2867/tcp # esps-portal
+# Nicholas Stowfis <nstowfis at esps.com>
+npep-messaging 2868/udp # NPEP Messaging
+npep-messaging 2868/tcp # NPEP Messaging
+# Kristian A. Bognaes <kbo at norman.no>
+icslap 2869/udp # ICSLAP
+icslap 2869/tcp # ICSLAP
+# Richard Lamb <rlamb at microsoft.com>
+daishi 2870/udp # daishi
+daishi 2870/tcp # daishi
+# Patrick Chipman <pchipman at memphis.edu>
+msi-selectplay 2871/udp # MSI Select Play
+msi-selectplay 2871/tcp # MSI Select Play
+# Paul Fonte <paul_fonte at mediastation.com>
+radix 2872/udp # RADIX
+radix 2872/tcp # RADIX
+# Stein Roger Skaflotten
+# <sskaflot at online.no>
+paspar2-zoomin 2873/udp # PASPAR2 ZoomIn
+paspar2-zoomin 2873/tcp # PASPAR2 ZoomIn
+# Amonn David <amnon at paspar2.com>
+dxmessagebase1 2874/udp # dxmessagebase1
+dxmessagebase1 2874/tcp # dxmessagebase1
+dxmessagebase2 2875/udp # dxmessagebase2
+dxmessagebase2 2875/tcp # dxmessagebase2
+# Ozz Nixon <root at delphix.com>
+sps-tunnel 2876/udp # SPS Tunnel
+sps-tunnel 2876/tcp # SPS Tunnel
+# Bill McIntosh <bmcintosh at fortresstech.com>
+bluelance 2877/udp # BLUELANCE
+bluelance 2877/tcp # BLUELANCE
+# Michael Padrezas <mpaderzas at bluelance.com>
+aap 2878/udp # AAP
+aap 2878/tcp # AAP
+# Stephen Hanna <steve.hanna at sun.com>
+ucentric-ds 2879/udp # ucentric-ds
+ucentric-ds 2879/tcp # ucentric-ds
+# Alex Vasilevsky <alexv at 204.165.216.115>
+synapse 2880/udp # Synapse Transport
+synapse 2880/tcp # Synapse Transport
+# Ali Fracyon <sxdev at modulardreams.com>
+ndsp 2881/udp # NDSP
+ndsp 2881/tcp # NDSP
+ndtp 2882/udp # NDTP
+ndtp 2882/tcp # NDTP
+ndnp 2883/udp # NDNP
+ndnp 2883/tcp # NDNP
+# Khelben Blackstaff <khelben at gmx.at>
+flashmsg 2884/udp # Flash Msg
+flashmsg 2884/tcp # Flash Msg
+# Jeffrey Zinkerman <jeff at zinknet.com>
+topflow 2885/udp # TopFlow
+topflow 2885/tcp # TopFlow
+# Ted Ross <ross at toplayer.com>
+responselogic 2886/udp # RESPONSELOGIC
+responselogic 2886/tcp # RESPONSELOGIC
+# Bruce Casey <bcasey at responselogic.com>
+aironetddp 2887/udp # aironet
+aironetddp 2887/tcp # aironet
+# Victor Griswold <vgris at aironet.com>
+spcsdlobby 2888/udp # SPCSDLOBBY
+spcsdlobby 2888/tcp # SPCSDLOBBY
+# Matthew Williams <SPCsd_MWDD at hotmail.com>
+rsom 2889/udp # RSOM
+rsom 2889/tcp # RSOM
+# Justine Higgins <iana at corsof.com>
+cspclmulti 2890/udp # CSPCLMULTI
+cspclmulti 2890/tcp # CSPCLMULTI
+# Yoneda Terumasa <yonedat at pfu.co.jp>
+cinegrfx-elmd 2891/udp # CINEGRFX-ELMD License Manager
+cinegrfx-elmd 2891/tcp # CINEGRFX-ELMD License Manager
+# Greg Ercolano <erco at cinegrfx.com>
+snifferdata 2892/udp # SNIFFERDATA
+snifferdata 2892/tcp # SNIFFERDATA
+# Jeff Mangasarian <jeffrey_mangasarian at nai.com>
+vseconnector 2893/udp # VSECONNECTOR
+vseconnector 2893/tcp # VSECONNECTOR
+# Ingo Franzki <ifranzki at de.ibm.com>
+abacus-remote 2894/udp # ABACUS-REMOTE
+abacus-remote 2894/tcp # ABACUS-REMOTE
+# Mike Bello <mbello at zarak.com>
+natuslink 2895/udp # NATUS LINK
+natuslink 2895/tcp # NATUS LINK
+# Jonathan Mergy <mergy at natus.com>
+ecovisiong6-1 2896/udp # ECOVISIONG6-1
+ecovisiong6-1 2896/tcp # ECOVISIONG6-1
+# Henrik Holst <henrik.holst at ecovision.se>
+citrix-rtmp 2897/udp # Citrix RTMP
+citrix-rtmp 2897/tcp # Citrix RTMP
+# Myk Willis <myk.willis at citrix.com>
+appliance-cfg 2898/udp # APPLIANCE-CFG
+appliance-cfg 2898/tcp # APPLIANCE-CFG
+# Gary A. James <gary.james at criticallink.com>
+powergemplus 2899/udp # POWERGEMPLUS
+powergemplus 2899/tcp # POWERGEMPLUS
+# Koich Nakamura <naka at case.nm.fujitsu.co.jp>
+quicksuite 2900/udp # QUICKSUITE
+quicksuite 2900/tcp # QUICKSUITE
+# William Egge <begge at emagisoft.com>
+allstorcns 2901/udp # ALLSTORCNS
+allstorcns 2901/tcp # ALLSTORCNS
+# Steve Dobson <sdobson at allstor.com>
+netaspi 2902/udp # NET ASPI
+netaspi 2902/tcp # NET ASPI
+# Johnson Luo <johnson_luo at mail.sercomm.com.tw>
+suitcase 2903/udp # SUITCASE
+suitcase 2903/tcp # SUITCASE
+# Milton E. Sagen <msagen at extensis.com>
+m2ua 2904/sctp # M2UA
+m2ua 2904/udp # M2UA
+m2ua 2904/tcp # M2UA
+# Lyndon Ong <LyOng at ciena.com>
+m3ua 2905/sctp # M3UA
+m3ua 2905/udp # De-registered (2001 June 07)
+m3ua 2905/tcp # M3UA
+# Lyndon Ong <LyOng at ciena.com>
+caller9 2906/udp # CALLER9
+caller9 2906/tcp # CALLER9
+# Shams Naqi <SSNAQVI at aol.com>
+webmethods-b2b 2907/udp # WEBMETHODS B2B
+webmethods-b2b 2907/tcp # WEBMETHODS B2B
+# Joseph Hines <jhines at webmethods.com>
+mao 2908/udp # mao
+mao 2908/tcp # mao
+# Marc Baudoin <babafou at babafou.eu.org>
+funk-dialout 2909/udp # Funk Dialout
+funk-dialout 2909/tcp # Funk Dialout
+# Cimarron Boozer <cboozer at funk.com>
+tdaccess 2910/udp # TDAccess
+tdaccess 2910/tcp # TDAccess
+# Tom Haapanen <tomh at metrics.com>
+blockade 2911/udp # Blockade
+blockade 2911/tcp # Blockade
+# VP - Research & Development <development at blockade.com>
+epicon 2912/udp # Epicon
+epicon 2912/tcp # Epicon
+# Michael Khalandovsky <mlk at epicon.com>
+boosterware 2913/udp # Booster Ware
+boosterware 2913/tcp # Booster Ware
+# Ido Ben-David <dgntcom at netvision.net.il>
+gamelobby 2914/udp # Game Lobby
+gamelobby 2914/tcp # Game Lobby
+# Paul Ford-Hutchinson <paulfordh at uk.ibm.com>
+tksocket 2915/udp # TK Socket
+tksocket 2915/tcp # TK Socket
+# Alan Fahrner <alan at protix.com>
+elvin_server 2916/udp # Elvin Server
+elvin_server 2916/tcp # Elvin Server
+elvin_client 2917/udp # Elvin Client
+elvin_client 2917/tcp # Elvin Client
+# David Arnold <davida at pobox.com>
+kastenchasepad 2918/udp # Kasten Chase Pad
+kastenchasepad 2918/tcp # Kasten Chase Pad
+# Marc Gauthier <mgau at kastenchase.com>
+roboer 2919/udp # ROBOER
+roboer 2919/tcp # ROBOER
+# Paul Snook <paul.snook at heroix.co.uk>
+roboeda 2920/udp # ROBOEDA
+roboeda 2920/tcp # ROBOEDA
+# Paul Snook <paul.snook at heroix.co.uk>
+cesdcdman 2921/udp # CESD Contents Delivery Management
+cesdcdman 2921/tcp # CESD Contents Delivery Management
+# Shinya Abe <abeabe at pfu.co.jp>
+cesdcdtrn 2922/udp # CESD Contents Delivery Data Transfer
+cesdcdtrn 2922/tcp # CESD Contents Delivery Data Transfer
+# Shinya Abe <abeabe at pfu.co.jp>
+wta-wsp-wtp-s 2923/udp # WTA-WSP-WTP-S
+wta-wsp-wtp-s 2923/tcp # WTA-WSP-WTP-S
+# Sebastien Bury (WAP Forum)
+# <sebastien.bury at art.alcatel.fr>
+precise-vip 2924/udp # PRECISE-VIP
+precise-vip 2924/tcp # PRECISE-VIP
+# Michael Landwehr <mikel at precisesoft.co.il>
+# 2925 Unassigned (FRP-Released 12/7/00)
+mobile-file-dl 2926/udp # MOBILE-FILE-DL
+mobile-file-dl 2926/tcp # MOBILE-FILE-DL
+# Mitsuji Toda <toda at mmedia.mci.mei.co.jp>
+unimobilectrl 2927/udp # UNIMOBILECTRL
+unimobilectrl 2927/tcp # UNIMOBILECTRL
+# Vikas <vikas at graycell.com>
+redstone-cpss 2928/udp # REDSTONE-CPSS
+redstone-cpss 2928/tcp # REDSTONE-CPSS
+# Jeff Looman <jeff at looman.org>
+amx-webadmin 2929/udp # AMX-WEBADMIN
+amx-webadmin 2929/tcp # AMX-WEBADMIN
+# Mike Morris <mike.morris at amx.com>
+amx-weblinx 2930/udp # AMX-WEBLINX
+amx-weblinx 2930/tcp # AMX-WEBLINX
+# Mike Morris <mike.morris at amx.com>
+circle-x 2931/udp # Circle-X
+circle-x 2931/tcp # Circle-X
+# Norm Freedman <normfree at worldnet.att.net>
+incp 2932/udp # INCP
+incp 2932/tcp # INCP
+# Keith Paulsen <kpaulsen at phobos.com>
+4-tieropmgw 2933/udp # 4-TIER OPM GW
+4-tieropmgw 2933/tcp # 4-TIER OPM GW
+# Francois Peloffy <fpeloffy at 4tier.com>
+4-tieropmcli 2934/udp # 4-TIER OPM CLI
+4-tieropmcli 2934/tcp # 4-TIER OPM CLI
+# Francois Peloffy <fpeloffy at 4tier.com>
+qtp 2935/udp # QTP
+qtp 2935/tcp # QTP
+# Cameron Young <Cameron_Young at inetco.com>
+otpatch 2936/udp # OTPatch
+otpatch 2936/tcp # OTPatch
+# Thomas J. Theobald <ttheobald at opentable.com>
+pnaconsult-lm 2937/udp # PNACONSULT-LM
+pnaconsult-lm 2937/tcp # PNACONSULT-LM
+# Theo Nijssen <theon at nijssen.nl>
+sm-pas-1 2938/udp # SM-PAS-1
+sm-pas-1 2938/tcp # SM-PAS-1
+sm-pas-2 2939/udp # SM-PAS-2
+sm-pas-2 2939/tcp # SM-PAS-2
+sm-pas-3 2940/udp # SM-PAS-3
+sm-pas-3 2940/tcp # SM-PAS-3
+sm-pas-4 2941/udp # SM-PAS-4
+sm-pas-4 2941/tcp # SM-PAS-4
+sm-pas-5 2942/udp # SM-PAS-5
+sm-pas-5 2942/tcp # SM-PAS-5
+# Tom Haapanen <tomh at metrics.com>
+ttnrepository 2943/udp # TTNRepository
+ttnrepository 2943/tcp # TTNRepository
+# Robert Orr <rorr at teltone.com>
+megaco-h248 2944/udp # Megaco H-248
+megaco-h248 2944/tcp # Megaco H-248
+h248-binary 2945/udp # H248 Binary
+h248-binary 2945/tcp # H248 Binary
+# Tom Taylor <taylor at nortelnetworks.com>
+fjsvmpor 2946/udp # FJSVmpor
+fjsvmpor 2946/tcp # FJSVmpor
+# Naoki Hayashi <ha at fjh.se.fujitsu.co.jp>
+gpsd 2947/udp # GPSD
+gpsd 2947/tcp # GPSD
+# Derrick J. Brashear <shadow at dementia.org>
+wap-push 2948/udp # WAP PUSH
+wap-push 2948/tcp # WAP PUSH
+wap-pushsecure 2949/udp # WAP PUSH SECURE
+wap-pushsecure 2949/tcp # WAP PUSH SECURE
+# WAP FORUM <wap-feedback at mail.wapforum.org>
+esip 2950/udp # ESIP
+esip 2950/tcp # ESIP
+# David Stephenson <david_stephenson at hp.com>
+ottp 2951/udp # OTTP
+ottp 2951/tcp # OTTP
+# Brent Foster <brent.foster at onstreamsystems.com>
+mpfwsas 2952/udp # MPFWSAS
+mpfwsas 2952/tcp # MPFWSAS
+# Toru Murai <murai at saint.nm.fujitsu.co.jp>
+ovalarmsrv 2953/udp # OVALARMSRV
+ovalarmsrv 2953/tcp # OVALARMSRV
+ovalarmsrv-cmd 2954/udp # OVALARMSRV-CMD
+ovalarmsrv-cmd 2954/tcp # OVALARMSRV-CMD
+# Eric Pulsipher <eric_pulsipher at hp.com>
+csnotify 2955/udp # CSNOTIFY
+csnotify 2955/tcp # CSNOTIFY
+# Israel Beniaminy <israel.beniaminy at clickservice.com>
+ovrimosdbman 2956/udp # OVRIMOSDBMAN
+ovrimosdbman 2956/tcp # OVRIMOSDBMAN
+# Dimitrios Souflis <dsouflis at altera.gr>
+jmact5 2957/udp # JAMCT5
+jmact5 2957/tcp # JAMCT5
+jmact6 2958/udp # JAMCT6
+jmact6 2958/tcp # JAMCT6
+rmopagt 2959/udp # RMOPAGT
+rmopagt 2959/tcp # RMOPAGT
+# Shuji Okubo <okubo at yk.fujitsu.co.jp>
+dfoxserver 2960/udp # DFOXSERVER
+dfoxserver 2960/tcp # DFOXSERVER
+# David Holden <mdh at rentek.net>
+boldsoft-lm 2961/udp # BOLDSOFT-LM
+boldsoft-lm 2961/tcp # BOLDSOFT-LM
+# Fredrik Haglund <fredik.haglund at boldsoft.com>
+iph-policy-cli 2962/udp # IPH-POLICY-CLI
+iph-policy-cli 2962/tcp # IPH-POLICY-CLI
+iph-policy-adm 2963/udp # IPH-POLICY-ADM
+iph-policy-adm 2963/tcp # IPH-POLICY-ADM
+# Shai Herzog <herzog at iphighway.com>
+bullant-srap 2964/udp # BULLANT SRAP
+bullant-srap 2964/tcp # BULLANT SRAP
+bullant-rap 2965/udp # BULLANT RAP
+bullant-rap 2965/tcp # BULLANT RAP
+# Michael Cahill <Michael.Cahill at bullant.net>
+idp-infotrieve 2966/udp # IDP-INFOTRIEVE
+idp-infotrieve 2966/tcp # IDP-INFOTRIEVE
+# Kevin Bruckert <kbruckert at idpco.com>
+ssc-agent 2967/udp # SSC-AGENT
+ssc-agent 2967/tcp # SSC-AGENT
+# George Dzieciol <gdzieciol at symantec.com>
+enpp 2968/udp # ENPP
+enpp 2968/tcp # ENPP
+# Kazuhito Gassho <Gassho.Kasuhito at exc.epson.co.jp>
+essp 2969/udp # ESSP
+essp 2969/tcp # ESSP
+# Hitoshi Ishida <ishida.hitoshi at exc.epson.co.jp>
+index-net 2970/udp # INDEX-NET
+index-net 2970/tcp # INDEX-NET
+# Chris J. Wren <C.Wren at lucent.com>
+netclip 2971/udp # NetClip clipboard daemon
+netclip 2971/tcp # NetClip clipboard daemon
+# Rudi Chiarito <nutello at sweetness.com>
+pmsm-webrctl 2972/udp # PMSM Webrctl
+pmsm-webrctl 2972/tcp # PMSM Webrctl
+# Markus Michels <mmi at pmsmicado.com>
+svnetworks 2973/udp # SV Networks
+svnetworks 2973/tcp # SV Networks
+# Sylvia Siu <ssiu at svnetworks.com>
+signal 2974/udp # Signal
+signal 2974/tcp # Signal
+# Wyatt Williams <wyattw at icall.com>
+fjmpcm 2975/udp # Fujitsu Configuration Management Service
+fjmpcm 2975/tcp # Fujitsu Configuration Management Service
+# Hiroki Kawano <kawano at saint.nm.fujitsu.co.jp>
+cns-srv-port 2976/udp # CNS Server Port
+cns-srv-port 2976/tcp # CNS Server Port
+# Ram Golla <rgolla at cisco.com>
+ttc-etap-ns 2977/udp # TTCs Enterprise Test Access Protocol - NS
+ttc-etap-ns 2977/tcp # TTCs Enterprise Test Access Protocol - NS
+ttc-etap-ds 2978/udp # TTCs Enterprise Test Access Protocol - DS
+ttc-etap-ds 2978/tcp # TTCs Enterprise Test Access Protocol - DS
+# Daniel Becker <beckerd at ttc.com>
+h263-video 2979/udp # H.263 Video Streaming
+h263-video 2979/tcp # H.263 Video Streaming
+# Jauvane C. de Oliveira <jauvane at acm.org>
+wimd 2980/udp # Instant Messaging Service
+wimd 2980/tcp # Instant Messaging Service
+# Kevin Birch <kbirch at pobox.com>
+mylxamport 2981/udp # MYLXAMPORT
+mylxamport 2981/tcp # MYLXAMPORT
+# Wei Gao <wei at mylex.com>
+iwb-whiteboard 2982/udp # IWB-WHITEBOARD
+iwb-whiteboard 2982/tcp # IWB-WHITEBOARD
+# David W. Radcliffe <davidr at adicarte.co.uk>
+netplan 2983/udp # NETPLAN
+netplan 2983/tcp # NETPLAN
+# Thomas Driemeyer <thomas at bitrot.de>
+hpidsadmin 2984/udp # HPIDSADMIN
+hpidsadmin 2984/tcp # HPIDSADMIN
+hpidsagent 2985/udp # HPIDSAGENT
+hpidsagent 2985/tcp # HPIDSAGENT
+# John Trudeau <jtrudeau at cup.hp.com>
+stonefalls 2986/udp # STONEFALLS
+stonefalls 2986/tcp # STONEFALLS
+# Scott Grau <sgrau at stonefalls.com>
+identify 2987/udp # identify
+identify 2987/tcp # identify
+hippad 2988/udp # HIPPA Reporting Protocol
+hippad 2988/tcp # HIPPA Reporting Protocol
+# William Randolph Royere III
+# <william at royere.net>
+zarkov 2989/udp # ZARKOV Intelligent Agent Communication
+zarkov 2989/tcp # ZARKOV Intelligent Agent Communication
+# Robin Felix <zarkov-port at zarkov.com>
+boscap 2990/udp # BOSCAP
+boscap 2990/tcp # BOSCAP
+# Dirk Hillbrecht <dirk at hillbrecht.de>
+wkstn-mon 2991/udp # WKSTN-MON
+wkstn-mon 2991/tcp # WKSTN-MON
+# William David <william.david at lmco.com>
+itb301 2992/udp # ITB301
+itb301 2992/tcp # ITB301
+# Bodo Rueskamp <br at itchigo.com>
+veritas-vis1 2993/udp # VERITAS VIS1
+veritas-vis1 2993/tcp # VERITAS VIS1
+veritas-vis2 2994/udp # VERITAS VIS2
+veritas-vis2 2994/tcp # VERITAS VIS2
+# Dinkar Chivaluri <dinkar at veritas.com>
+idrs 2995/udp # IDRS
+idrs 2995/tcp # IDRS
+# Jeff Eaton <jeaton at intermec.com>
+vsixml 2996/udp # vsixml
+vsixml 2996/tcp # vsixml
+# Rob Juergens <robj at vsi.com>
+rebol 2997/udp # REBOL
+rebol 2997/tcp # REBOL
+# Holger Kruse <holger at rebol.net>
+realsecure 2998/udp # Real Secure
+realsecure 2998/tcp # Real Secure
+# Tim Farley <TFarley at iss.net>
+remoteware-un 2999/udp # RemoteWare Unassigned
+remoteware-un 2999/tcp # RemoteWare Unassigned
+# Tim Farley <Tim.Farley at xcellenet.com>
+hbci 3000/udp # HBCI
+hbci 3000/tcp # HBCI
+# Kurt Haubner <haubner at ibm.net>
+# The following entry records an unassigned but widespread use
+remoteware-cl 3000/udp # RemoteWare Client
+remoteware-cl 3000/tcp # RemoteWare Client
+# Tim Farley <Tim.Farley at xcellenet.com>
+redwood-broker 3001/udp # Redwood Broker
+redwood-broker 3001/tcp # Redwood Broker
+# Joseph Morrison <joe at powerframe.com>
+exlm-agent 3002/udp # EXLM Agent
+exlm-agent 3002/tcp # EXLM Agent
+# Randy Martin <exlmoc at clemson.edu>
+# The following entry records an unassigned but widespread use
+remoteware-srv 3002/udp # RemoteWare Server
+remoteware-srv 3002/tcp # RemoteWare Server
+# Tim Farley <Tim.Farley at xcellenet.com>
+cgms 3003/udp # CGMS
+cgms 3003/tcp # CGMS
+# Jim Mazzonna <jmazzonna at tiscom.uscg.mil>
+csoftragent 3004/udp # Csoft Agent
+csoftragent 3004/tcp # Csoft Agent
+# Nedelcho Stanev <decho at csoft.bg>
+geniuslm 3005/udp # Genius License Manager
+geniuslm 3005/tcp # Genius License Manager
+# Jakob Spies <Jakob.Spies at genius.de>
+ii-admin 3006/udp # Instant Internet Admin
+ii-admin 3006/tcp # Instant Internet Admin
+# Lewis Donzis <ldonzis at nortelnetworks.com>
+lotusmtap 3007/udp # Lotus Mail Tracking Agent Protocol
+lotusmtap 3007/tcp # Lotus Mail Tracking Agent Protocol
+# Ken Lin <ken_lin at lotus.com>
+midnight-tech 3008/udp # Midnight Technologies
+midnight-tech 3008/tcp # Midnight Technologies
+# Kyle Unice <kyle at midnighttech.com>
+pxc-ntfy 3009/udp # PXC-NTFY
+pxc-ntfy 3009/tcp # PXC-NTFY
+# Takeshi Nishizawa <takeshi at cp10.es.xerox.com>
+ping-pong 3010/udp # Telerate Workstation
+gw 3010/tcp # Telerate Workstation
+# Timo Sivonen <timo.sivonen at ccmail.dowjones.com>
+trusted-web 3011/udp # Trusted Web
+trusted-web 3011/tcp # Trusted Web
+twsdss 3012/udp # Trusted Web Client
+twsdss 3012/tcp # Trusted Web Client
+# Alex Duncan <alex.duncan at sse.ie>
+gilatskysurfer 3013/udp # Gilat Sky Surfer
+gilatskysurfer 3013/tcp # Gilat Sky Surfer
+# Yossi Gal <yossi at gilat.com>
+broker_service 3014/udp # Broker Service
+broker_service 3014/tcp # Broker Service
+# Dale Bethers <dbethers at novell.com>
+nati-dstp 3015/udp # NATI DSTP
+nati-dstp 3015/tcp # NATI DSTP
+# Paul Austin <paul.austin at natinst.com>
+notify_srvr 3016/udp # Notify Server
+notify_srvr 3016/tcp # Notify Server
+# Hugo Parra <hparra at novell.com>
+event_listener 3017/udp # Event Listener
+event_listener 3017/tcp # Event Listener
+# Ted Tronson <ttronson at novell.com>
+srvc_registry 3018/udp # Service Registry
+srvc_registry 3018/tcp # Service Registry
+# Mark Killgore <MKillgore at novell.com>
+resource_mgr 3019/udp # Resource Manager
+resource_mgr 3019/tcp # Resource Manager
+# Gary Glover <gglover at novell.com>
+cifs 3020/udp # CIFS
+cifs 3020/tcp # CIFS
+# Paul Leach <paulle at microsoft.com>
+agriserver 3021/udp # AGRI Server
+agriserver 3021/tcp # AGRI Server
+# Frank Neulichedl <frank at websmile.com>
+csregagent 3022/udp # CSREGAGENT
+csregagent 3022/tcp # CSREGAGENT
+# Nedelcho Stanev <nstanev at csoft.bg>
+magicnotes 3023/udp # magicnotes
+magicnotes 3023/tcp # magicnotes
+# Karl Edwall <karl at magicnotes.com>
+nds_sso 3024/udp # NDS_SSO
+nds_sso 3024/tcp # NDS_SSO
+# Mel Oyler <mel at novell.com>
+arepa-raft 3025/udp # Arepa Raft
+arepa-raft 3025/tcp # Arepa Raft
+# Mark Ellison <ellison at ieee.org>
+agri-gateway 3026/udp # AGRI Gateway
+agri-gateway 3026/tcp # AGRI Gateway
+# Agri Datalog <contact at agri-datalog.com>
+LiebDevMgmt_C 3027/udp # LiebDevMgmt_C
+LiebDevMgmt_C 3027/tcp # LiebDevMgmt_C
+LiebDevMgmt_DM 3028/udp # LiebDevMgmt_DM
+LiebDevMgmt_DM 3028/tcp # LiebDevMgmt_DM
+LiebDevMgmt_A 3029/udp # LiebDevMgmt_A
+LiebDevMgmt_A 3029/tcp # LiebDevMgmt_A
+# Mike Velten <Mike_Velten at Liebert.com>
+arepa-cas 3030/udp # Arepa Cas
+arepa-cas 3030/tcp # Arepa Cas
+# Seth Silverman <seth at arepa.com>
+eppc 3031/udp # Remote AppleEvents/PPC Toolbox
+eppc 3031/tcp # Remote AppleEvents/PPC Toolbox
+# Steve Zellers <zellers at apple.com>
+redwood-chat 3032/udp # Redwood Chat
+redwood-chat 3032/tcp # Redwood Chat
+# Songwon Chi <swchi at daou.co.kr>
+pdb 3033/udp # PDB
+pdb 3033/tcp # PDB
+# Don Bowman <don at pixstream.com>
+osmosis-aeea 3034/udp # Osmosis / Helix (R) AEEA Port
+osmosis-aeea 3034/tcp # Osmosis / Helix (R) AEEA Port
+# Larry Atkin <latkin at commongrnd.com>
+fjsv-gssagt 3035/udp # FJSV gssagt
+fjsv-gssagt 3035/tcp # FJSV gssagt
+# Tomoji Koike <koike at ael.fujitsu.co.jp>
+hagel-dump 3036/udp # Hagel DUMP
+hagel-dump 3036/tcp # Hagel DUMP
+# Haim Gelfenbeyn <haim at hageltech.com>
+hp-san-mgmt 3037/udp # HP SAN Mgmt
+hp-san-mgmt 3037/tcp # HP SAN Mgmt
+# Steve Britt <steve_britt at hp.com>
+santak-ups 3038/udp # Santak UPS
+santak-ups 3038/tcp # Santak UPS
+# Tom Liu <ssc at sc.stk.com.cn>
+cogitate 3039/udp # Cogitate, Inc.
+cogitate 3039/tcp # Cogitate, Inc.
+# Jim Harlan <jimh at infowest.com>
+tomato-springs 3040/udp # Tomato Springs
+tomato-springs 3040/tcp # Tomato Springs
+# Jack Waller III <jack at tomatosprings.com>
+di-traceware 3041/udp # di-traceware
+di-traceware 3041/tcp # di-traceware
+# Carlos Hung <chung at digisle.net>
+journee 3042/udp # journee
+journee 3042/tcp # journee
+# Kevin Calman <postmaster at journee.com>
+brp 3043/udp # BRP
+brp 3043/tcp # BRP
+# Greg Gee <ggee at hns.com>
+epp 3044/udp # EndPoint Protocol
+epp 3044/tcp # EndPoint Protocol
+# Stephen Cipolli <scipolli at radvision.com>
+responsenet 3045/udp # ResponseNet
+responsenet 3045/tcp # ResponseNet
+# Chul Yoon <cyoon at responsenetworks.com>
+di-ase 3046/udp # di-ase
+di-ase 3046/tcp # di-ase
+# Carlos Hung <chung at digisle.net>
+hlserver 3047/udp # Fast Security HL Server
+hlserver 3047/tcp # Fast Security HL Server
+# Michael Zunke <mzunke at fast-ag.de>
+pctrader 3048/udp # Sierra Net PC Trader
+pctrader 3048/tcp # Sierra Net PC Trader
+# Chris Hahn <chrish at sierra.net>
+nsws 3049/udp # NSWS
+nsws 3049/tcp # NSWS
+# Ray Gwinn <p00321 at psilink.com>
+gds_db 3050/udp # gds_db
+gds_db 3050/tcp # gds_db
+# Madhukar N. Thakur <mthakur at interbase.com>
+galaxy-server 3051/udp # Galaxy Server
+galaxy-server 3051/tcp # Galaxy Server
+# Michael Andre <mandre at gts-tkts.com>
+apc-3052 3052/udp # APC 3052
+apc-3052 3052/tcp # APC 3052
+# American Power Conversion <ports at apcc.com>
+dsom-server 3053/udp # dsom-server
+dsom-server 3053/tcp # dsom-server
+# Daniel Sisk <danielr.sisk at pnl.gov>
+amt-cnf-prot 3054/udp # AMT CNF PROT
+amt-cnf-prot 3054/tcp # AMT CNF PROT
+# Marco Marcucci <mmarcucci.amtec at interbusiness.it>
+policyserver 3055/udp # Policy Server
+policyserver 3055/tcp # Policy Server
+# Mark Garti <mgarti at sonusnet.com>
+cdl-server 3056/udp # CDL Server
+cdl-server 3056/tcp # CDL Server
+# Paul Roberts <PaulRoberts at engineer.com>
+goahead-fldup 3057/udp # GoAhead FldUp
+goahead-fldup 3057/tcp # GoAhead FldUp
+# Alan Pickrell <alanp at goahead.com>
+videobeans 3058/udp # videobeans
+videobeans 3058/tcp # videobeans
+# Hiroyuki Takahashi <hiro.takahashi at eng.Sun.COM>
+qsoft 3059/udp # qsoft
+qsoft 3059/tcp # qsoft
+# James Kunz <jkunz at earlhaig.com>
+interserver 3060/udp # interserver
+interserver 3060/tcp # interserver
+# Madhukar N. Thakur <mthakur at interbase.com>
+cautcpd 3061/udp # cautcpd
+cautcpd 3061/tcp # cautcpd
+ncacn-ip-tcp 3062/udp # ncacn-ip-tcp
+ncacn-ip-tcp 3062/tcp # ncacn-ip-tcp
+ncadg-ip-udp 3063/udp # ncadg-ip-udp
+ncadg-ip-udp 3063/tcp # ncadg-ip-udp
+# Gabi Kalmar <kalga01 at cai.com>
+rprt 3064/udp # Remote Port Redirector
+rprt 3064/tcp # Remote Port Redirector
+# Robin Johnston <robinj at learningtree.com>
+slinterbase 3065/udp # slinterbase
+slinterbase 3065/tcp # slinterbase
+# Bie Tie <stie at interbase.com>
+netattachsdmp 3066/udp # NETATTACHSDMP
+netattachsdmp 3066/tcp # NETATTACHSDMP
+# Mike Young <myong at netattach.com>
+fjhpjp 3067/udp # FJHPJP
+fjhpjp 3067/tcp # FJHPJP
+# Ryozo Furutani <furutani at np.lps.cs.fujitsu.co.jp>
+ls3bcast 3068/udp # ls3 Broadcast
+ls3bcast 3068/tcp # ls3 Broadcast
+ls3 3069/udp # ls3
+ls3 3069/tcp # ls3
+# Andrei Tsyganenko <atsyganenko at powerware.com>
+mgxswitch 3070/udp # MGXSWITCH
+mgxswitch 3070/tcp # MGXSWITCH
+# George Walter <george.walter at ascentialsoftware.com>
+csd-mgmt-port 3071/udp # ContinuStor Manager Port
+csd-mgmt-port 3071/tcp # ContinuStor Manager Port
+csd-monitor 3072/udp # ContinuStor Monitor Port
+csd-monitor 3072/tcp # ContinuStor Monitor Port
+# Ray Jantz <ray.jantz at lsil.com>
+vcrp 3073/udp # Very simple chatroom prot
+vcrp 3073/tcp # Very simple chatroom prot
+# Andreas Wurf <a.wurf at mediaTools.de>
+xbox 3074/udp # Xbox game port
+xbox 3074/tcp # Xbox game port
+# Damon Danieli <damond at microsoft.com>
+orbix-locator 3075/udp # Orbix 2000 Locator
+orbix-locator 3075/tcp # Orbix 2000 Locator
+orbix-config 3076/udp # Orbix 2000 Config
+orbix-config 3076/tcp # Orbix 2000 Config
+orbix-loc-ssl 3077/udp # Orbix 2000 Locator SSL
+orbix-loc-ssl 3077/tcp # Orbix 2000 Locator SSL
+orbix-cfg-ssl 3078/udp # Orbix 2000 Locator SSL
+orbix-cfg-ssl 3078/tcp # Orbix 2000 Locator SSL
+# Eric Newcomer <eric.newcomer at iona.com>
+lv-frontpanel 3079/udp # LV Front Panel
+lv-frontpanel 3079/tcp # LV Front Panel
+# Darshan Shah <darshan.shah at ni.com>
+stm_pproc 3080/udp # stm_pproc
+stm_pproc 3080/tcp # stm_pproc
+# Paul McGinnis <pmcginnis at server.stmi.com>
+tl1-lv 3081/udp # TL1-LV
+tl1-lv 3081/tcp # TL1-LV
+tl1-raw 3082/udp # TL1-RAW
+tl1-raw 3082/tcp # TL1-RAW
+tl1-telnet 3083/udp # TL1-TELNET
+tl1-telnet 3083/tcp # TL1-TELNET
+# SONET Internetworking Forum (SIF)
+# <bwarijsman at lucent.com> - SONET Contact
+itm-mccs 3084/udp # ITM-MCCS
+itm-mccs 3084/tcp # ITM-MCCS
+# Alain Callebaut <ac at itmasters.com>
+pcihreq 3085/udp # PCIHReq
+pcihreq 3085/tcp # PCIHReq
+# Paul Sanders <p.sanders at dial.pipex.com>
+jdl-dbkitchen 3086/udp # JDL-DBKitchen
+jdl-dbkitchen 3086/tcp # JDL-DBKitchen
+# Hideo Wakabayashi <hiwaka at alles.or.jp>
+asoki-sma 3087/udp # Asoki SMA
+asoki-sma 3087/tcp # Asoki SMA
+# Andrew Mossberg <amossberg at asoki.net>
+xdtp 3088/udp # eXtensible Data Transfer Protocol
+xdtp 3088/tcp # eXtensible Data Transfer Protocol
+# Michael Shearson <mshearson at peerglobal.com>
+ptk-alink 3089/udp # ParaTek Agent Linking
+ptk-alink 3089/tcp # ParaTek Agent Linking
+# Robert Hodgson <robert at paratek.co.uk>
+rtss 3090/udp # Rappore Session Services
+rtss 3090/tcp # Rappore Session Services
+# Peter Boucher <pboucher at rappore.com>
+1ci-smcs 3091/udp # 1Ci Server Management
+1ci-smcs 3091/tcp # 1Ci Server Management
+# Ralf Bensmann <iana at 1ci.de>
+njfss 3092/udp # Netware sync services
+njfss 3092/tcp # Netware sync services
+# Gordon Ross <G.Ross at ccw.gov.uk>
+rapidmq-center 3093/udp # Jiiva RapidMQ Center
+rapidmq-center 3093/tcp # Jiiva RapidMQ Center
+rapidmq-reg 3094/udp # Jiiva RapidMQ Registry
+rapidmq-reg 3094/tcp # Jiiva RapidMQ Registry
+# Mark Ericksen <mark at jiiva.com>
+panasas 3095/udp # Panasas rendevous port
+panasas 3095/tcp # Panasas rendevous port
+# Peter Berger <peterb at panasas.com>
+ndl-aps 3096/udp # Active Print Server Port
+ndl-aps 3096/tcp # Active Print Server Port
+# Martin Norman <martin at ndl.co.uk>
+# 3097/tcp Reserved
+# 3097/udp Reserved
+itu-bicc-stc 3097/sctp # ITU-T Q.1902.1/Q.2150.3
+# Greg Sidebottom <gregside at home.com>
+umm-port 3098/udp # Universal Message Manager
+umm-port 3098/tcp # Universal Message Manager
+# Phil Braham <phil at braham.net>
+chmd 3099/udp # CHIPSY Machine Daemon
+chmd 3099/tcp # CHIPSY Machine Daemon
+# Trond Borsting <Trond.Borsting at telelogic.com>
+opcon-xps 3100/udp # OpCon/xps
+opcon-xps 3100/tcp # OpCon/xps
+# David Bourland <DBourland at smausa.com>
+hp-pxpib 3101/udp # HP PolicyXpert PIB Server
+hp-pxpib 3101/tcp # HP PolicyXpert PIB Server
+# Brian O'Keefe <bokeefe at cnd.hp.com>
+slslavemon 3102/udp # SoftlinK Slave Mon Port
+slslavemon 3102/tcp # SoftlinK Slave Mon Port
+# Moshe Livne <moshe at softlinkusa.com>
+autocuesmi 3103/udp # Autocue SMI Protocol
+autocuesmi 3103/tcp # Autocue SMI Protocol
+autocuetime 3104/udp # Autocue Time Service
+autocuelog 3104/tcp # Autocue Logger Protocol
+# Geoff Back <geoff at autocue.co.uk>
+cardbox 3105/udp # Cardbox
+cardbox 3105/tcp # Cardbox
+cardbox-http 3106/udp # Cardbox HTTP
+cardbox-http 3106/tcp # Cardbox HTTP
+# Martin Kochanski <martin at cardbox.co.uk>
+business 3107/udp # Business protocol
+business 3107/tcp # Business protocol
+geolocate 3108/udp # Geolocate protocol
+geolocate 3108/tcp # Geolocate protocol
+personnel 3109/udp # Personnel protocol
+personnel 3109/tcp # Personnel protocol
+# William Randolph Royere III
+# <william at royere.net>
+sim-control 3110/udp # simulator control port
+sim-control 3110/tcp # simulator control port
+# Ian Bell <ianb at arca-technologies.com>
+wsynch 3111/udp # Web Synchronous Services
+wsynch 3111/tcp # Web Synchronous Services
+# Valery Fremaux <vf at eisti.fr>
+ksysguard 3112/udp # KDE System Guard
+ksysguard 3112/tcp # KDE System Guard
+# Chris Schlaeger <cs at kde.org>
+cs-auth-svr 3113/udp # CS-Authenticate Svr Port
+cs-auth-svr 3113/tcp # CS-Authenticate Svr Port
+# Cliff Diamond <cdiamond at crypto-solutions.co.uk>
+# Andy Georgiou <ageorgiou at crypto-solutions.co.uk>
+ccmad 3114/udp # CCM AutoDiscover
+ccmad 3114/tcp # CCM AutoDiscover
+# Ram Sudama <rsudama at on.com>
+mctet-master 3115/udp # MCTET Master
+mctet-master 3115/tcp # MCTET Master
+mctet-gateway 3116/udp # MCTET Gateway
+mctet-gateway 3116/tcp # MCTET Gateway
+mctet-jserv 3117/udp # MCTET Jserv
+mctet-jserv 3117/tcp # MCTET Jserv
+# Manuel Veloso <veloso at us.itmasters.com>
+pkagent 3118/udp # PKAgent
+pkagent 3118/tcp # PKAgent
+# Michael Douglass <mikedoug at datafoundry.net>
+d2000kernel 3119/udp # D2000 Kernel Port
+d2000kernel 3119/tcp # D2000 Kernel Port
+d2000webserver 3120/udp # D2000 Webserver Port
+d2000webserver 3120/tcp # D2000 Webserver Port
+# Tomas Rajcan <trajcan at ipesoft.sk>
+epp-temp 3121/udp # Extensible Provisioning Protocol
+epp-temp 3121/tcp # Extensible Provisioning Protocol
+# Scott Hollenbeck <shollenbeck at verisign.com>
+vtr-emulator 3122/udp # MTI VTR Emulator port
+vtr-emulator 3122/tcp # MTI VTR Emulator port
+# John Mertus <mertus at mathtech.com>
+edix 3123/udp # EDI Translation Protocol
+edix 3123/tcp # EDI Translation Protocol
+# William Randolph Royere III <william at royere.net>
+beacon-port 3124/udp # Beacon Port
+beacon-port 3124/tcp # Beacon Port
+# James Paul Duncan <pduncan at beaconcrm.com>
+a13-an 3125/udp # A13-AN Interface
+a13-an 3125/tcp # A13-AN Interface
+# Douglas Knisely <dnk at lucent.com>
+ms-dotnetster 3126/udp # Microsoft .NETster Port
+ms-dotnetster 3126/tcp # Microsoft .NETster Port
+# Dave Mendlen <davemen at microsoft.com>
+ctx-bridge 3127/udp # CTX Bridge Port
+ctx-bridge 3127/tcp # CTX Bridge Port
+# Alexander Dubrovsky <dubrovsky_alex at emc.com>
+ndl-aas 3128/udp # Active API Server Port
+ndl-aas 3128/tcp # Active API Server Port
+# Martin Norman <martin at ndl.co.uk>
+netport-id 3129/udp # NetPort Discovery Port
+netport-id 3129/tcp # NetPort Discovery Port
+# P.T.K. Farrar <farrarp at teccon.co.uk>
+icpv2 3130/udp # ICPv2
+icpv2 3130/tcp # ICPv2
+# Duane Wessels <wessels at nlanr.net>
+netbookmark 3131/udp # Net Book Mark
+netbookmark 3131/tcp # Net Book Mark
+# Yiftach Ravid <yiftach at haifa.vnet.ibm.com>
+ms-rule-engine 3132/udp # Microsoft Business Rule Engine Update Service
+ms-rule-engine 3132/tcp # Microsoft Business Rule Engine Update Service
+# Anush Kumar <anushk at microsoft.com>
+prism-deploy 3133/udp # Prism Deploy User Port
+prism-deploy 3133/tcp # Prism Deploy User Port
+# Joan Linck <jlinck at lanovation.com>
+ecp 3134/udp # Extensible Code Protocol
+ecp 3134/tcp # Extensible Code Protocol
+# Jim Trek <jtrek at rochester.rr.com>
+# Mark Bocko <bocko at ece.rochester.edu>
+peerbook-port 3135/udp # PeerBook Port
+peerbook-port 3135/tcp # PeerBook Port
+# John Flowers <jf at gigamediaaccess.com>
+grubd 3136/udp # Grub Server Port
+grubd 3136/tcp # Grub Server Port
+# Kord Campbell <kord at grub.org>
+rtnt-1 3137/udp # rtnt-1 data packets
+rtnt-1 3137/tcp # rtnt-1 data packets
+rtnt-2 3138/udp # rtnt-2 data packets
+rtnt-2 3138/tcp # rtnt-2 data packets
+# Ron Muellerschoen <rjm at cobra.jpl.nasa.gov>
+incognitorv 3139/udp # Incognito Rendez-Vous
+incognitorv 3139/tcp # Incognito Rendez-Vous
+# Stephane Bourque <stephb at incognito.com>
+ariliamulti 3140/udp # Arilia Multiplexor
+ariliamulti 3140/tcp # Arilia Multiplexor
+# Stephane Bourque <sbourque at arilia.com>
+vmodem 3141/udp # VMODEM
+vmodem 3141/tcp # VMODEM
+# Ray Gwinn <p00321 at psilink.com>
+rdc-wh-eos 3142/udp # RDC WH EOS
+rdc-wh-eos 3142/tcp # RDC WH EOS
+# Udi Nir <udi_nir at ncc.co.il>
+seaview 3143/udp # Sea View
+seaview 3143/tcp # Sea View
+# Jim Flaherty <jim_e_flaherty at notes.seagate.com>
+tarantella 3144/udp # Tarantella
+tarantella 3144/tcp # Tarantella
+# Roger Binns <rogerb at sco.com>
+csi-lfap 3145/udp # CSI-LFAP
+csi-lfap 3145/tcp # CSI-LFAP
+# Paul Amsden <amsden at .ctron.com>
+bears-02 3146/udp # bears-02
+bears-02 3146/tcp # bears-02
+# Bruce McKinnon <brucemck at bearsolutions.com.au>
+rfio 3147/udp # RFIO
+rfio 3147/tcp # RFIO
+# Frederic Hemmer <Frederic.Hemmer at cern.ch>
+nm-game-admin 3148/udp # NetMike Game Administrator
+nm-game-admin 3148/tcp # NetMike Game Administrator
+nm-game-server 3149/udp # NetMike Game Server
+nm-game-server 3149/tcp # NetMike Game Server
+nm-asses-admin 3150/udp # NetMike Assessor Administrator
+nm-asses-admin 3150/tcp # NetMike Assessor Administrator
+nm-assessor 3151/udp # NetMike Assessor
+nm-assessor 3151/tcp # NetMike Assessor
+# Andrew Sharpe <help at smartsims.com>
+feitianrockey 3152/udp # FeiTian Port
+feitianrockey 3152/tcp # FeiTian Port
+# Huang Yu <llw at ftsafe.com>
+s8-client-port 3153/udp # S8Cargo Client Port
+s8-client-port 3153/tcp # S8Cargo Client Port
+# Jon S. Kyle <JKyle at SpeedwaySoftware.com>
+ccmrmi 3154/udp # ON RMI Registry
+ccmrmi 3154/tcp # ON RMI Registry
+# Ram Sudama <rsudama at on.com>
+jpegmpeg 3155/udp # JpegMpeg Port
+jpegmpeg 3155/tcp # JpegMpeg Port
+# Richard Bassous <rbassous at yahoo.com>
+indura 3156/udp # Indura Collector
+indura 3156/tcp # Indura Collector
+# Bruce Kosbab <bruce.kosbab at indurasoft.com>
+e3consultants 3157/udp # CCC Listener Port
+e3consultants 3157/tcp # CCC Listener Port
+# Brian Carnell <brian at e3consultants.com>
+stvp 3158/udp # SmashTV Protocol
+stvp 3158/tcp # SmashTV Protocol
+# Christian Wolff <stvp at smash.tv>
+navegaweb-port 3159/udp # NavegaWeb Tarification
+navegaweb-port 3159/tcp # NavegaWeb Tarification
+# Miguel Angel Fernandez <mafg at tid.es>
+tip-app-server 3160/udp # TIP Application Server
+tip-app-server 3160/tcp # TIP Application Server
+# Olivier Mascia <om at tipgroup.com>
+doc1lm 3161/udp # DOC1 License Manager
+doc1lm 3161/tcp # DOC1 License Manager
+# Greg Goodson <ggoodson at group1software.co.uk>
+sflm 3162/udp # SFLM
+sflm 3162/tcp # SFLM
+# Keith Turner <support at silvaco.com>
+res-sap 3163/udp # RES-SAP
+res-sap 3163/tcp # RES-SAP
+# Bob Janssen <bob at res.nl>
+imprs 3164/udp # IMPRS
+imprs 3164/tcp # IMPRS
+# Lars Bohn <Lars.Bohn at nokia.com>
+newgenpay 3165/udp # Newgenpay Engine Service
+newgenpay 3165/tcp # Newgenpay Engine Service
+# Ilan Zisser <ilan at newgenpay.com>
+qrepos 3166/udp # Quest Repository
+qrepos 3166/tcp # Quest Repository
+# Fred Surr <quest_iana at oz.quest.com>
+poweroncontact 3167/udp # poweroncontact
+poweroncontact 3167/tcp # poweroncontact
+poweronnud 3168/udp # poweronnud
+poweronnud 3168/tcp # poweronnud
+# Paul Cone <paul at poweronsoftware.com>
+serverview-as 3169/udp # SERVERVIEW-AS
+serverview-as 3169/tcp # SERVERVIEW-AS
+serverview-asn 3170/udp # SERVERVIEW-ASN
+serverview-asn 3170/tcp # SERVERVIEW-ASN
+serverview-gf 3171/udp # SERVERVIEW-GF
+serverview-gf 3171/tcp # SERVERVIEW-GF
+serverview-rm 3172/udp # SERVERVIEW-RM
+serverview-rm 3172/tcp # SERVERVIEW-RM
+serverview-icc 3173/udp # SERVERVIEW-ICC
+serverview-icc 3173/tcp # SERVERVIEW-ICC
+# Guenther Kroenert
+# <Guenther.Kroenert at fujitsu-siemens.com>
+armi-server 3174/udp # ARMI Server
+armi-server 3174/tcp # ARMI Server
+# Bobby Martin <bobbymartin at hotmail.com>
+t1-e1-over-ip 3175/udp # T1_E1_Over_IP
+t1-e1-over-ip 3175/tcp # T1_E1_Over_IP
+# Mark Doyle <mark at engagecom.com>
+ars-master 3176/udp # ARS Master
+ars-master 3176/tcp # ARS Master
+# Ade Adebayo <ade at us.itmasters.com>
+phonex-port 3177/udp # Phonex Protocol
+phonex-port 3177/tcp # Phonex Protocol
+# Doug Grover <dgrover at phonex.com>
+radclientport 3178/udp # Radiance UltraEdge Port
+radclientport 3178/tcp # Radiance UltraEdge Port
+# Sri Subramaniam <sri at radiance.com>
+h2gf-w-2m 3179/udp # H2GF W.2m Handover prot.
+h2gf-w-2m 3179/tcp # H2GF W.2m Handover prot.
+# Arne Norefors <Arne.Norefors at ericsson.com>
+mc-brk-srv 3180/udp # Millicent Broker Server
+mc-brk-srv 3180/tcp # Millicent Broker Server
+# Steve Glassman <steveg at pa.dec.com>
+bmcpatrolagent 3181/udp # BMC Patrol Agent
+bmcpatrolagent 3181/tcp # BMC Patrol Agent
+bmcpatrolrnvu 3182/udp # BMC Patrol Rendezvous
+bmcpatrolrnvu 3182/tcp # BMC Patrol Rendezvous
+# Eric Anderson <eric_anderson at bmc.com>
+cops-tls 3183/udp # COPS/TLS
+cops-tls 3183/tcp # COPS/TLS
+# Mark Stevens <mstevens at ellacoya.com>
+apogeex-port 3184/udp # ApogeeX Port
+apogeex-port 3184/tcp # ApogeeX Port
+# Tom Nys <tom.nys.tn at belgium.agfa.com>
+smpppd 3185/udp # SuSE Meta PPPD
+smpppd 3185/tcp # SuSE Meta PPPD
+# Arvin Schnell <arvin at suse.de>
+iiw-port 3186/udp # IIW Monitor User Port
+iiw-port 3186/tcp # IIW Monitor User Port
+# Corey Burnett <corey.burnett at biopop.com>
+odi-port 3187/udp # Open Design Listen Port
+odi-port 3187/tcp # Open Design Listen Port
+# Phivos Aristides <phivos at opendesign.com>
+brcm-comm-port 3188/udp # Broadcom Port
+brcm-comm-port 3188/tcp # Broadcom Port
+# Thomas L. Johnson <tjohnson at broadcom.com>
+pcle-infex 3189/udp # Pinnacle Sys InfEx Port
+pcle-infex 3189/tcp # Pinnacle Sys InfEx Port
+# Anthon van der Neut <anthon at mnt.org>
+csvr-proxy 3190/udp # ConServR Proxy
+csvr-proxy 3190/tcp # ConServR Proxy
+csvr-sslproxy 3191/udp # ConServR SSL Proxy
+csvr-sslproxy 3191/tcp # ConServR SSL Proxy
+# Mikhail Kruk <mkruk at biscom.com>
+firemonrcc 3192/udp # FireMon Revision Control
+firemonrcc 3192/tcp # FireMon Revision Control
+# Michael Bishop <mbishop at fishnetsecurity.com>
+cordataport 3193/udp # Cordaxis Data Port
+cordataport 3193/tcp # Cordaxis Data Port
+# Jay Fesco <jay at cordaxis.com>
+magbind 3194/udp # Rockstorm MAG protocol
+magbind 3194/tcp # Rockstorm MAG protocol
+# Jens Nilsson <jens at rockstorm.se>
+ncu-1 3195/udp # Network Control Unit
+ncu-1 3195/tcp # Network Control Unit
+ncu-2 3196/udp # Network Control Unit
+ncu-2 3196/tcp # Network Control Unit
+# Charlie Hundre <charlie at rdsrv.reco.com.tw>
+embrace-dp-s 3197/udp # Embrace Device Protocol Server
+embrace-dp-s 3197/tcp # Embrace Device Protocol Server
+embrace-dp-c 3198/udp # Embrace Device Protocol Client
+embrace-dp-c 3198/tcp # Embrace Device Protocol Client
+# Elliot Schwartz <elliot at embracenetworks.com>
+dmod-workspace 3199/udp # DMOD WorkSpace
+dmod-workspace 3199/tcp # DMOD WorkSpace
+# Nick Plante <nplante at dmod.com>
+tick-port 3200/udp # Press-sense Tick Port
+tick-port 3200/tcp # Press-sense Tick Port
+# Boris Svetlitsky <boris at press-sense.com>
+cpq-tasksmart 3201/udp # CPQ-TaskSmart
+cpq-tasksmart 3201/tcp # CPQ-TaskSmart
+# Jackie Lau <jackie.lau at compaq.com>
+intraintra 3202/udp # IntraIntra
+intraintra 3202/tcp # IntraIntra
+# Matthew Asham <matthewa at bcwireless.net>
+netwatcher-mon 3203/udp # Network Watcher Monitor
+netwatcher-mon 3203/tcp # Network Watcher Monitor
+netwatcher-db 3204/udp # Network Watcher DB Access
+netwatcher-db 3204/tcp # Network Watcher DB Access
+# Hirokazu Fujisawa <fujisawa at pfu.fujitsu.com>
+isns 3205/udp # iSNS Server Port
+isns 3205/tcp # iSNS Server Port
+# Josh Tseng <jtseng at nishansystems.com>
+ironmail 3206/udp # IronMail POP Proxy
+ironmail 3206/tcp # IronMail POP Proxy
+# Mike Hudack <mike at mhudack.com>
+vx-auth-port 3207/udp # Veritas Authentication Port
+vx-auth-port 3207/tcp # Veritas Authentication Port
+# Senthil Ponnuswamy <senthil at veritas.com>
+pfu-prcallback 3208/udp # PFU PR Callback
+pfu-prcallback 3208/tcp # PFU PR Callback
+# Tetsuharu Hanada <hanada at pfu.fujitsu.com>
+netwkpathengine 3209/udp # HP OpenView Network Path Engine Server
+netwkpathengine 3209/tcp # HP OpenView Network Path Engine Server
+# Anthony Walker <anthony_walker at hp.com>
+flamenco-proxy 3210/udp # Flamenco Networks Proxy
+flamenco-proxy 3210/tcp # Flamenco Networks Proxy
+# Corey Corrick <corey.corrick at flamenconetworks.com>
+avsecuremgmt 3211/udp # Avocent Secure Management
+avsecuremgmt 3211/tcp # Avocent Secure Management
+# Brian S. Stewart <Brian.Stewart at Avocent.com>
+surveyinst 3212/udp # Survey Instrument
+surveyinst 3212/tcp # Survey Instrument
+# Al Amet <aamet at point-inc.com>
+neon24x7 3213/udp # NEON 24X7 Mission Control
+neon24x7 3213/tcp # NEON 24X7 Mission Control
+# Tony Lubrano <tlubrano at neonsys.com>
+jmq-daemon-1 3214/udp # JMQ Daemon Port 1
+jmq-daemon-1 3214/tcp # JMQ Daemon Port 1
+jmq-daemon-2 3215/udp # JMQ Daemon Port 2
+jmq-daemon-2 3215/tcp # JMQ Daemon Port 2
+# Martin West <Martin.West at spirit-soft.com>
+ferrari-foam 3216/udp # Ferrari electronic FOAM
+ferrari-foam 3216/tcp # Ferrari electronic FOAM
+# Johann Deutinger <deutinger at ferrari-electronic.de>
+unite 3217/udp # Unified IP & Telecomm Env
+unite 3217/tcp # Unified IP & Telecomm Env
+# Christer Gunnarsson
+# <christer.gunnarsson at ascomtateco.se>
+smartpackets 3218/udp # EMC SmartPackets
+smartpackets 3218/tcp # EMC SmartPackets
+# Steve Spataro <spataro_steve at emc.com>
+wms-messenger 3219/udp # WMS Messenger
+wms-messenger 3219/tcp # WMS Messenger
+# Michael Monasterio <michael at wmsoftware.com>
+xnm-ssl 3220/udp # XML NM over SSL
+xnm-ssl 3220/tcp # XML NM over SSL
+xnm-clear-text 3221/udp # XML NM over TCP
+xnm-clear-text 3221/tcp # XML NM over TCP
+# Mark Trostler <trostler at juniper.net>
+glbp 3222/udp # Gateway Load Balancing Pr
+glbp 3222/tcp # Gateway Load Balancing Pr
+# Douglas McLaggan <glbp-info at cisco.com>
+digivote 3223/udp # DIGIVOTE (R) Vote-Server
+digivote 3223/tcp # DIGIVOTE (R) Vote-Server
+# Christian Treczoks <ct at braehler.com>
+aes-discovery 3224/udp # AES Discovery Port
+aes-discovery 3224/tcp # AES Discovery Port
+# Ken Richard <kenr at aeseducation.com>
+fcip-port 3225/udp # FCIP
+fcip-port 3225/tcp # FCIP
+# RFC-ietf-ips-fcovertcpip-12.txt
+isi-irp 3226/udp # ISI Industry Software IRP
+isi-irp 3226/tcp # ISI Industry Software IRP
+# Peter Sandstrom <peter.sandstrom at tassen.fi>
+dwnmshttp 3227/udp # DiamondWave NMS Server
+dwnmshttp 3227/tcp # DiamondWave NMS Server
+dwmsgserver 3228/udp # DiamondWave MSG Server
+dwmsgserver 3228/tcp # DiamondWave MSG Server
+# Varma Bhupatiraju <varma at calient.net>
+global-cd-port 3229/udp # Global CD Port
+global-cd-port 3229/tcp # Global CD Port
+# Vitaly Revsin <vitaly at netapp.com>
+sftdst-port 3230/udp # Software Distributor Port
+sftdst-port 3230/tcp # Software Distributor Port
+# Andrea Lanza <andrea.lanza at frameweb.it>
+dsnl 3231/udp # Delta Solutions Direct
+dsnl 3231/tcp # Delta Solutions Direct
+# Peter Ijkhout <peter at deltasolutions.nl>
+mdtp 3232/udp # MDT port
+mdtp 3232/tcp # MDT port
+# IJsbrand Wijnands <ice at cisco.com>
+whisker 3233/udp # WhiskerControl main port
+whisker 3233/tcp # WhiskerControl main port
+# Rudolf Cardinal <rudolf at pobox.com> February 2002
+alchemy 3234/udp # Alchemy Server
+alchemy 3234/tcp # Alchemy Server
+# Mikhail Belov <mikhail at imrgold.com> February 2002
+mdap-port 3235/udp # MDAP Port
+mdap-port 3235/tcp # MDAP port
+# Johan Deleu <johan.deleu at alcatel.be> February 2002
+apparenet-ts 3236/udp # appareNet Test Server
+apparenet-ts 3236/tcp # appareNet Test Server
+apparenet-tps 3237/udp # appareNet Test Packet Sequencer
+apparenet-tps 3237/tcp # appareNet Test Packet Sequencer
+apparenet-as 3238/udp # appareNet Analysis Server
+apparenet-as 3238/tcp # appareNet Analysis Server
+apparenet-ui 3239/udp # appareNet User Interface
+apparenet-ui 3239/tcp # appareNet User Interface
+# Fred Klassen <fklassen at jaalam.com> February 2002
+triomotion 3240/udp # Trio Motion Control Port
+triomotion 3240/tcp # Trio Motion Control Port
+# Tony Matthews <tmatthews at triomotion.com> February 2002
+sysorb 3241/udp # SysOrb Monitoring Server
+sysorb 3241/tcp # SysOrb Monitoring Server
+# Jakob Oestergaard <joe at sysorb.com> February 2002
+sdp-id-port 3242/udp # Session Description ID
+sdp-id-port 3242/tcp # Session Description ID
+# Greg Rose <ggr at qualcomm.com> February 2002
+timelot 3243/udp # Timelot Port
+timelot 3243/tcp # Timelot Port
+# David Ferguson <dferguson at xtralot.com> February 2002
+onesaf 3244/udp # OneSAF
+onesaf 3244/tcp # OneSAF
+# Gene McCulley <mcculley at cuspy.com> February 2002
+vieo-fe 3245/udp # VIEO Fabric Executive
+vieo-fe 3245/tcp # VIEO Fabric Executive
+# James Cox <jocox at view.com> February 2002
+dvt-system 3246/udp # DVT SYSTEM PORT
+dvt-system 3246/tcp # DVT SYSTEM PORT
+dvt-data 3247/udp # DVT DATA LINK
+dvt-data 3247/tcp # DVT DATA LINK
+# Phillip Heil <phil.heil at dvtsensors.com> February 2002
+procos-lm 3248/udp # PROCOS LM
+procos-lm 3248/tcp # PROCOS LM
+# Torsten Rendelmann
+# <torsten.rendelmann at procos.com> February 2002
+ssp 3249/udp # State Sync Protocol
+ssp 3249/tcp # State Sync Protocol
+# Stephane Beaulieu <stephane at cisco.com> February 2002
+hicp 3250/udp # HMS hicp port
+hicp 3250/tcp # HMS hicp port
+# Joel Palsson, HMS Industrial Networks AB
+# <ianacontact at hms.se> February 2002
+sysscanner 3251/udp # Sys Scanner
+sysscanner 3251/tcp # Sys Scanner
+# Dick Georges <georges at monaco.net> February 2002
+dhe 3252/udp # DHE port
+dhe 3252/tcp # DHE port
+# Fabrizio Massimo Ferrara <fmf at gesi.it> February 2002
+pda-data 3253/udp # PDA Data
+pda-data 3253/tcp # PDA Data
+pda-sys 3254/udp # PDA System
+pda-sys 3254/tcp # PDA System
+# Jian Fan <fjian at dmfsys.com> February 2002
+semaphore 3255/udp # Semaphore Connection Port
+semaphore 3255/tcp # Semaphore Connection Port
+# Jay Eckles <ecklesweb at yahoo.com> February 2002
+cpqrpm-agent 3256/udp # Compaq RPM Agent Port
+cpqrpm-agent 3256/tcp # Compaq RPM Agent Port
+cpqrpm-server 3257/udp # Compaq RPM Server Port
+cpqrpm-server 3257/tcp # Compaq RPM Server Port
+# Royal King <royal.king at compaq.com> February 2002
+ivecon-port 3258/udp # Ivecon Server Port
+ivecon-port 3258/tcp # Ivecon Server Port
+# Serguei Tevs <STevs at ivecon.com> February 2002
+epncdp2 3259/udp # Epson Network Common Devi
+epncdp2 3259/tcp # Epson Network Common Devi
+# SEIKO EPSON Corporation - Oishi Toshiaki
+# <Oishi.Toshiaki at exc.epson.co.jp> February 2002
+iscsi-target 3260/udp # iSCSI port
+iscsi-target 3260/tcp # iSCSI port
+# Julian Satran <Julian_Satran at il.ibm.com>
+winshadow 3261/udp # winShadow
+winshadow 3261/tcp # winShadow
+# Colin Barry <cbarry at gbahn.com>
+necp 3262/udp # NECP
+necp 3262/tcp # NECP
+# Alberto Cerpa <cerpa at isi.edu>
+ecolor-imager 3263/udp # E-Color Enterprise Imager
+ecolor-imager 3263/tcp # E-Color Enterprise Imager
+# Tamara Baker <tbaker at ecolor.com>
+ccmail 3264/udp # cc:mail/lotus
+ccmail 3264/tcp # cc:mail/lotus
+# <brockman at ccmail.com>
+altav-tunnel 3265/udp # Altav Tunnel
+altav-tunnel 3265/tcp # Altav Tunnel
+# Gary M. Allen <gallen at symantec.com>
+ns-cfg-server 3266/udp # NS CFG Server
+ns-cfg-server 3266/tcp # NS CFG Server
+# Aivi Lie <LIEA at netsoft.com>
+ibm-dial-out 3267/udp # IBM Dial Out
+ibm-dial-out 3267/tcp # IBM Dial Out
+# Skip Booth <sbooth at VNET.IBM.COM>
+msft-gc 3268/udp # Microsoft Global Catalog
+msft-gc 3268/tcp # Microsoft Global Catalog
+msft-gc-ssl 3269/udp # Microsoft Global Catalog with LDAP/SSL
+msft-gc-ssl 3269/tcp # Microsoft Global Catalog with LDAP/SSL
+# Asaf Kashi <asafk at microsoft.com>
+verismart 3270/udp # Verismart
+verismart 3270/tcp # Verismart
+# Jay Weber <weber at vfi.com>
+csoft-prev 3271/udp # CSoft Prev Port
+csoft-prev 3271/tcp # CSoft Prev Port
+# Nedelcho Stanev <decho at iname.com>
+user-manager 3272/udp # Fujitsu User Manager
+user-manager 3272/tcp # Fujitsu User Manager
+# Yukihiko Sakurai <y-sakurai at ael.fujitsu.co.jp>
+sxmp 3273/udp # Simple Extensible Multiplexed Protocol
+sxmp 3273/tcp # Simple Extensible Multiplexed Protocol
+# Stuart Newman <stuart.newman at fortel.com>
+ordinox-server 3274/udp # Ordinox Server
+ordinox-server 3274/tcp # Ordinox Server
+# Guy Letourneau <gletourneau at ordinox.com>
+samd 3275/udp # SAMD
+samd 3275/tcp # SAMD
+# Edgar Circenis <ec at fc.hp.com>
+maxim-asics 3276/udp # Maxim ASICs
+maxim-asics 3276/tcp # Maxim ASICs
+# Dave Inman <davei at mxim.com>
+awg-proxy 3277/udp # AWG Proxy
+awg-proxy 3277/tcp # AWG Proxy
+# Alex McDonald <alexm at an.hp.com>
+lkcmserver 3278/udp # LKCM Server
+lkcmserver 3278/tcp # LKCM Server
+# Javier Jimenez
+admind 3279/udp # admind
+admind 3279/tcp # admind
+# Jeff Haynes <haynes at chistech.com>
+vs-server 3280/udp # VS Server
+vs-server 3280/tcp # VS Server
+# Scott Godlew <Scott at godlew.com>
+sysopt 3281/udp # SYSOPT
+sysopt 3281/tcp # SYSOPT
+# Tony Hoffman <ajh at unx.dec.com>
+datusorb 3282/udp # Datusorb
+datusorb 3282/tcp # Datusorb
+# Thomas Martin <thomas at datus-usa.com>
+net-assistant 3283/udp # Net Assistant
+net-assistant 3283/tcp # Net Assistant
+# Michael Stein <mvs at apple.com>
+4talk 3284/udp # 4Talk
+4talk 3284/tcp # 4Talk
+# Tony Bushnell <tony_bushnell at four-sight.co.uk>
+plato 3285/udp # Plato
+plato 3285/tcp # Plato
+# Jim Battin <battin at tro.com>
+e-net 3286/udp # E-Net
+e-net 3286/tcp # E-Net
+# Steven Grigsby <sgrigsby at austin.eent.com>
+directvdata 3287/udp # DIRECTVDATA
+directvdata 3287/tcp # DIRECTVDATA
+# Michael Friedman <mfr1 at worldnet.att.net>
+cops 3288/udp # COPS
+cops 3288/tcp # COPS
+# Shai Herzog <herzog at iphighway.com>
+enpc 3289/udp # ENPC
+enpc 3289/tcp # ENPC
+# SEIKO EPSON <Ishida.Hitoshi at exc.epson.co.jp>
+caps-lm 3290/udp # CAPS LOGISTICS TOOLKIT - LM
+caps-lm 3290/tcp # CAPS LOGISTICS TOOLKIT - LM
+# Joseph Krebs <joek at caps.com>
+sah-lm 3291/udp # S A Holditch & Associates - LM
+sah-lm 3291/tcp # S A Holditch & Associates - LM
+# Randy Hudgens <rhh at nmail.holditch.com>
+cart-o-rama 3292/udp # Cart O Rama
+cart-o-rama 3292/tcp # Cart O Rama
+# Phillip Dillinger <Phillip.Dillinger at sealabs.com>
+fg-fps 3293/udp # fg-fps
+fg-fps 3293/tcp # fg-fps
+fg-gip 3294/udp # fg-gip
+fg-gip 3294/tcp # fg-gip
+# Jean-Marc Frailong <jmf at freegate.net>
+dyniplookup 3295/udp # Dynamic IP Lookup
+dyniplookup 3295/tcp # Dynamic IP Lookup
+# Eugene Osovetsky <eugeneo at geocities.com>
+rib-slm 3296/udp # Rib License Manager
+rib-slm 3296/tcp # Rib License Manager
+# Kristean Heisler <kh at rib.de>
+cytel-lm 3297/udp # Cytel License Manager
+cytel-lm 3297/tcp # Cytel License Manager
+# Yogesh P. Gajjar <yogesh at cytel.com>
+deskview 3298/udp # DeskView
+deskview 3298/tcp # DeskView
+# Manfred Randelzofer
+# <manfred.randelzofer at fujitsu-siemens.com>
+pdrncs 3299/udp # pdrncs
+pdrncs 3299/tcp # pdrncs
+# Paul Wissenbach <paulwi at vnd.tek.com>
+########### 3300-3301 Unauthorized Use by SAP R/3 ######
+mcs-fastmail 3302/udp # MCS Fastmail
+mcs-fastmail 3302/tcp # MCS Fastmail
+# Patti Jo Newsom <pjn at mcsdallas.com>
+opsession-clnt 3303/udp # OP Session Client
+opsession-clnt 3303/tcp # OP Session Client
+opsession-srvr 3304/udp # OP Session Server
+opsession-srvr 3304/tcp # OP Session Server
+# Amir Blich <amir at netmanage.co.il>
+odette-ftp 3305/udp # ODETTE-FTP
+odette-ftp 3305/tcp # ODETTE-FTP
+# David Nash <dnash at ford.com>
+mysql 3306/udp # MySQL
+mysql 3306/tcp # MySQL
+# Monty <monty at analytikerna.se>
+opsession-prxy 3307/udp # OP Session Proxy
+opsession-prxy 3307/tcp # OP Session Proxy
+# Amir Blich <amir at netmanage.co.il>
+tns-server 3308/udp # TNS Server
+tns-server 3308/tcp # TNS Server
+tns-adv 3309/udp # TNS ADV
+tns-adv 3309/tcp # TNS ADV
+# Jerome Albin <albin at taec.enet.dec.com>
+dyna-access 3310/udp # Dyna Access
+dyna-access 3310/tcp # Dyna Access
+# Dave Belliveau
+# <DaveBelliveau at cornerstonesoftware.com>
+mcns-tel-ret 3311/udp # MCNS Tel Ret
+mcns-tel-ret 3311/tcp # MCNS Tel Ret
+# Randall Atkinson <rja at home.net>
+appman-server 3312/udp # Application Management Server
+appman-server 3312/tcp # Application Management Server
+uorb 3313/udp # Unify Object Broker
+uorb 3313/tcp # Unify Object Broker
+uohost 3314/udp # Unify Object Host
+uohost 3314/tcp # Unify Object Host
+# Duane Gibson <ianaportmaster at unify.com>
+cdid 3315/udp # CDID
+cdid 3315/tcp # CDID
+# Andrew Borisov <hdr at chat.ru>
+aicc-cmi 3316/udp # AICC/CMI
+aicc-cmi 3316/tcp # AICC/CMI
+# William McDonald <billmc at atc.boeing.com>
+vsaiport 3317/udp # VSAI PORT
+vsaiport 3317/tcp # VSAI PORT
+# Rieko Asai <asai at isl.mei.co.jp>
+ssrip 3318/udp # Swith to Swith Routing Information Protocol
+ssrip 3318/tcp # Swith to Swith Routing Information Protocol
+# Baba Hidekazu <baba at flare.nd.net.fujitsu.co.jp>
+sdt-lmd 3319/udp # SDT License Manager
+sdt-lmd 3319/tcp # SDT License Manager
+# Salvo Nassisi <sdtech at tin.it>
+officelink2000 3320/udp # Office Link 2000
+officelink2000 3320/tcp # Office Link 2000
+# Mike Balch <mbalch at teltone.com>
+vnsstr 3321/udp # VNSSTR
+vnsstr 3321/tcp # VNSSTR
+# Takeshi Ohmura <ohmura at isl.mei.co.jp>
+# Bob Braden <braden at isi.edu>
+sftu 3326/udp # SFTU
+sftu 3326/tcp # SFTU
+# Eduardo Rosenberg de Moura <eduardor at spacenet.com.br>
+bbars 3327/udp # BBARS
+bbars 3327/tcp # BBARS
+# Lou Harris <lharris at outlx.bandl.com>
+egptlm 3328/udp # Eaglepoint License Manager
+egptlm 3328/tcp # Eaglepoint License Manager
+# Dave Benton <dave.benton at eaglepoint.com>
+hp-device-disc 3329/udp # HP Device Disc
+hp-device-disc 3329/tcp # HP Device Disc
+# Shivaun Albright <shivaun_albright at hp.com>
+mcs-calypsoicf 3330/udp # MCS Calypso ICF
+mcs-calypsoicf 3330/tcp # MCS Calypso ICF
+mcs-messaging 3331/udp # MCS Messaging
+mcs-messaging 3331/tcp # MCS Messaging
+mcs-mailsvr 3332/udp # MCS Mail Server
+mcs-mailsvr 3332/tcp # MCS Mail Server
+# Patti Jo Newsom <pjn at mcsdallas.com>
+dec-notes 3333/udp # DEC Notes
+dec-notes 3333/tcp # DEC Notes
+# Kim Moraros <moraros at via.enet.dec.com>
+directv-web 3334/udp # Direct TV Webcasting
+directv-web 3334/tcp # Direct TV Webcasting
+directv-soft 3335/udp # Direct TV Software Updates
+directv-soft 3335/tcp # Direct TV Software Updates
+directv-tick 3336/udp # Direct TV Tickers
+directv-tick 3336/tcp # Direct TV Tickers
+directv-catlg 3337/udp # Direct TV Data Catalog
+directv-catlg 3337/tcp # Direct TV Data Catalog
+# Michael Friedman <mfr1 at worldnet.att.net>
+anet-b 3338/udp # OMF data b
+anet-b 3338/tcp # OMF data b
+anet-l 3339/udp # OMF data l
+anet-l 3339/tcp # OMF data l
+anet-m 3340/udp # OMF data m
+anet-m 3340/tcp # OMF data m
+anet-h 3341/udp # OMF data h
+anet-h 3341/tcp # OMF data h
+# Per Sahlqvist <psahlqvi at sw.seisy.abb.se>
+webtie 3342/udp # WebTIE
+webtie 3342/tcp # WebTIE
+# Kevin Frender <kbf at ngdc.noaa.gov>
+ms-cluster-net 3343/udp # MS Cluster Net
+ms-cluster-net 3343/tcp # MS Cluster Net
+# Mike Massa <mikemas at microsoft.com>
+bnt-manager 3344/udp # BNT Manager
+bnt-manager 3344/tcp # BNT Manager
+# Brian J. Ives <Brian.Ives at BadgerNT.com>
+influence 3345/udp # Influence
+influence 3345/tcp # Influence
+# Russ Ferriday <russf at topia.com>
+trnsprntproxy 3346/udp # Trnsprnt Proxy
+trnsprntproxy 3346/tcp # Trnsprnt Proxy
+# Grant Kirby <grant_kirby at ccm.al.intel.com>
+phoenix-rpc 3347/udp # Phoenix RPC
+phoenix-rpc 3347/tcp # Phoenix RPC
+# Ian Anderson <ian_anderson at phoenix.com>
+pangolin-laser 3348/udp # Pangolin Laser
+pangolin-laser 3348/tcp # Pangolin Laser
+# William Benner <William_Benner at msn.com>
+chevinservices 3349/udp # Chevin Services
+chevinservices 3349/tcp # Chevin Services
+# Gus McNaughton <gus at chevin.com>
+findviatv 3350/udp # FINDVIATV
+findviatv 3350/tcp # FINDVIATV
+# Oran Davis <oran at 8x8.com>
+btrieve 3351/udp # Btrieve port
+btrieve 3351/tcp # Btrieve port
+ssql 3352/udp # Scalable SQL
+ssql 3352/tcp # Scalable SQL
+# Chuck Talk <ctalk at pervasive.com>
+fatpipe 3353/udp # FATPIPE
+fatpipe 3353/tcp # FATPIPE
+# Sanchaita Datta <sdatta at ragula.com>
+suitjd 3354/udp # SUITJD
+suitjd 3354/tcp # SUITJD
+# Todd Moyer <tsm at unx.dec.com>
+ordinox-dbase 3355/udp # Ordinox Dbase
+ordinox-dbase 3355/tcp # Ordinox Dbase
+# Guy Litourneau <gletourneau at ordinox.com>
+upnotifyps 3356/udp # UPNOTIFYPS
+upnotifyps 3356/tcp # UPNOTIFYPS
+# Mark Fox <markf at uplanet.com>
+adtech-test 3357/udp # Adtech Test IP
+adtech-test 3357/tcp # Adtech Test IP
+# Robin Uyeshiro <robin_u at adtech-inc.com>
+mpsysrmsvr 3358/udp # Mp Sys Rmsvr
+mpsysrmsvr 3358/tcp # Mp Sys Rmsvr
+# Hiroyuki Kawabuchi <buchi at ael.fujitsu.co.jp>
+wg-netforce 3359/udp # WG NetForce
+wg-netforce 3359/tcp # WG NetForce
+# Lee Wheat <wheat at wg.com>
+kv-server 3360/udp # KV Server
+kv-server 3360/tcp # KV Server
+kv-agent 3361/udp # KV Agent
+kv-agent 3361/tcp # KV Agent
+# Thomas Soranno <tom_soranno at cipartners.com>
+dj-ilm 3362/udp # DJ ILM
+dj-ilm 3362/tcp # DJ ILM
+# Don Tyson
+nati-vi-server 3363/udp # NATI Vi Server
+nati-vi-server 3363/tcp # NATI Vi Server
+# Robert Dye <rob at natinst.com>
+creativeserver 3364/udp # Creative Server
+creativeserver 3364/tcp # Creative Server
+contentserver 3365/udp # Content Server
+contentserver 3365/tcp # Content Server
+creativepartnr 3366/udp # Creative Partner
+creativepartnr 3366/tcp # Creative Partner
+# Jesus Ortiz <Jesus_A._Ortiz at notes.emotion.com>
+# Scott Engel <ScottX_Engel at ccm.jf.intel.com>
+tip2 3372/udp # TIP 2
+tip2 3372/tcp # TIP 2
+# Keith Evans <keith at loc252.tandem.com>
+lavenir-lm 3373/udp # Lavenir License Manager
+lavenir-lm 3373/tcp # Lavenir License Manager
+# Marius Matioc <marius at lavenir.com>
+cluster-disc 3374/udp # Cluster Disc
+cluster-disc 3374/tcp # Cluster Disc
+# Jeff Hughes <Jeff.Hughes at columbiasc.ncr.com>
+vsnm-agent 3375/udp # VSNM Agent
+vsnm-agent 3375/tcp # VSNM Agent
+# Venkat Rangan <venkatr at vitalsigns.com>
+cdbroker 3376/udp # CD Broker
+cdbroker 3376/tcp # CD Broker
+# Moon Ho Chung <mchung at esps.com>
+cogsys-lm 3377/udp # Cogsys Network License Manager
+cogsys-lm 3377/tcp # Cogsys Network License Manager
+# Simon Chinnick <support at cogsys.co.uk>
+wsicopy 3378/udp # WSICOPY
+wsicopy 3378/tcp # WSICOPY
+# James Overby
+socorfs 3379/udp # SOCORFS
+socorfs 3379/tcp # SOCORFS
+# Hugo Charbonneau
+sns-channels 3380/udp # SNS Channels
+sns-channels 3380/tcp # SNS Channels
+# Shekar Pasumarthi <shekarp at firstfloor.com>
+geneous 3381/udp # Geneous
+geneous 3381/tcp # Geneous
+# Nick de Smith <nick.desmith at histech.com>
+fujitsu-neat 3382/udp # Fujitsu Network Enhanced Antitheft function
+fujitsu-neat 3382/tcp # Fujitsu Network Enhanced Antitheft function
+# Markku Viima <markku.viima at team.icl.se>
+esp-lm 3383/udp # Enterprise Software Products License Manager
+esp-lm 3383/tcp # Enterprise Software Products License Manager
+# George Rudy <george at entsoft.com>
+hp-clic 3384/udp # Hardware Management
+hp-clic 3384/tcp # Cluster Management Services
+# Rajesh Srinivasaraghavan <srajesh at cup.hp.com>
+qnxnetman 3385/udp # qnxnetman
+qnxnetman 3385/tcp # qnxnetman
+# Michael Hunter <mphunter at qnx.com>
+gprs-sig 3386/udp # GPRS SIG
+gprs-data 3386/tcp # GPRS Data
+# Ansgar Bergmann <Ansgar.Bergmann at etsi.fr>
+backroomnet 3387/udp # Back Room Net
+backroomnet 3387/tcp # Back Room Net
+# Clayton Wilkinson <cwilkinson at carreker.com>
+cbserver 3388/udp # CB Server
+cbserver 3388/tcp # CB Server
+# Allen Wei <Allen_Wei at arborsoft.com>
+ms-wbt-server 3389/udp # MS WBT Server
+ms-wbt-server 3389/tcp # MS WBT Server
+# Ritu Bahl <ritub at microsoft.com>
+dsc 3390/udp # Distributed Service Coordinator
+dsc 3390/tcp # Distributed Service Coordinator
+# Chas Honton <chas at secant.com>
+savant 3391/udp # SAVANT
+savant 3391/tcp # SAVANT
+# Andy Bruce <franklin_yah at yahoo.com>
+efi-lm 3392/udp # EFI License Management
+efi-lm 3392/tcp # EFI License Management
+# Ross E. Greinke <greinker at execpc.com>
+d2k-tapestry1 3393/udp # D2K Tapestry Client to Server
+d2k-tapestry1 3393/tcp # D2K Tapestry Client to Server
+d2k-tapestry2 3394/udp # D2K Tapestry Server to Server
+d2k-tapestry2 3394/tcp # D2K Tapestry Server to Server
+# Eric Lan <elan at d2k.com>
+dyna-lm 3395/udp # Dyna License Manager (Elam)
+dyna-lm 3395/tcp # Dyna License Manager (Elam)
+# Anjana Iyer <anjana at dyna.com>
+printer_agent 3396/udp # Printer Agent
+printer_agent 3396/tcp # Printer Agent
+# Devon Taylor <dtaylor at novell.com>
+cloanto-lm 3397/udp # Cloanto License Manager
+cloanto-lm 3397/tcp # Cloanto License Manager
+# Takeo Sato <takeo_sato-iana at cloanto.com>
+mercantile 3398/udp # Mercantile
+mercantile 3398/tcp # Mercantile
+# Erik Kragh Jensen <kragh at inet.uni2.dk>
+csms 3399/udp # CSMS
+csms 3399/tcp # CSMS
+csms2 3400/udp # CSMS2
+csms2 3400/tcp # CSMS2
+# Markus Michels <mmi at cedros.com>
+filecast 3401/udp # filecast
+filecast 3401/tcp # filecast
+# Eden Sherry <eden at pair.com>
+fxaengine-net 3402/udp # FXa Engine Network Port
+fxaengine-net 3402/tcp # FXa Engine Network Port
+# Lucas Alonso <luke at demiurgestudios.com> February 2002
+copysnap 3403/udp # CopySnap Server Port
+copysnap 3403/tcp # CopySnap Server Port
+# Steve Zellers <zellers at basilsoft.com> February 2002
+# 3404 Removed (2002-05-01)
+nokia-ann-ch1 3405/udp # Nokia Announcement ch 1
+nokia-ann-ch1 3405/tcp # Nokia Announcement ch 1
+nokia-ann-ch2 3406/udp # Nokia Announcement ch 2
+nokia-ann-ch2 3406/tcp # Nokia Announcement ch 2
+# Morteza Kalhour <Morteza.Kalhour at Nokia.com> February 2002
+ldap-admin 3407/udp # LDAP admin server port
+ldap-admin 3407/tcp # LDAP admin server port
+# Stephen Tsun <stsun at calient.net> February 2002
+issapi 3408/udp # POWERpack API Port
+issapi 3408/tcp # POWERpack API Port
+# Colin Griffiths <colin.griffiths at int-link.com> February 2002
+networklens 3409/udp # NetworkLens Event Port
+networklens 3409/tcp # NetworkLens Event Port
+networklenss 3410/udp # NetworkLens SSL Event
+networklenss 3410/tcp # NetworkLens SSL Event
+# Greg Bailey <gbailey at lxpro.com> February 2002
+biolink-auth 3411/udp # BioLink Authenteon server
+biolink-auth 3411/tcp # BioLink Authenteon server
+# BioLink Support <reginfo at biolinkusa.com> February 2002
+xmlblaster 3412/udp # xmlBlaster
+xmlblaster 3412/tcp # xmlBlaster
+# Marcel Ruff <ruff at swand.lake.de> February 2002
+svnet 3413/udp # SpecView Networking
+svnet 3413/tcp # SpecView Networking
+# Richard Dickins <rad at specview.com> February 2002
+wip-port 3414/udp # BroadCloud WIP Port
+wip-port 3414/tcp # BroadCloud WIP Port
+bcinameservice 3415/udp # BCI Name Service
+bcinameservice 3415/tcp # BCI Name Service
+# Dennis Parker <dparker at broadcloud.com> February 2002
+commandport 3416/udp # AirMobile IS Command Port
+commandport 3416/tcp # AirMobile IS Command Port
+# Mike Klein <m.klein at motorla.com> February 2002
+csvr 3417/udp # ConServR file translation
+csvr 3417/tcp # ConServR file translation
+# Albert Leung <aleung at biscom.com> February 2002
+rnmap 3418/udp # Remote nmap
+rnmap 3418/tcp # Remote nmap
+# Tuomo Makinen <tmakinen at pp.htv.fi> February 2002
+softaudit 3419/udp # ISogon SoftAudit
+softaudit 3419/tcp # Isogon SoftAudit
+# Per Hellberg <phellberg at isogon.com> February 2002
+ifcp-port 3420/udp # iFCP User Port
+ifcp-port 3420/tcp # iFCP User Port
+# Charles Monia <cmonia at nishansystems.com>
+bmap 3421/udp # Bull Apprise portmapper
+bmap 3421/tcp # Bull Apprise portmapper
+# Jeremy Gilbert <J.Gilbert at ma30.bull.com>
+rusb-sys-port 3422/udp # Remote USB System Port
+rusb-sys-port 3422/tcp # Remote USB System Port
+# Steven Klein <stevek at ionetworks.com> February 2002
+xtrm 3423/udp # xTrade Reliable Messaging
+xtrm 3423/tcp # xTrade Reliable Messaging
+xtrms 3424/udp # xTrade over TLS/SSL
+xtrms 3424/tcp # xTrade over TLS/SSL
+# Mats Nilsson <mats.nilsson at xware.se> February 2002
+agps-port 3425/udp # AGPS Access Port
+agps-port 3425/tcp # AGPS Access Port
+# Kristoffer Nilsson
+# <kristoffer.nilsson at hutchison3g.com> February 2002
+arkivio 3426/udp # Arkivio Storage Protocol
+arkivio 3426/tcp # Arkivio Storage Protocol
+# Bruce Greenblatt <bruce at arkivio.com> February 2002
+websphere-snmp 3427/udp # WebSphere SNMP
+websphere-snmp 3427/tcp # WebSphere SNMP
+# Richard Mills <ramills at us.ibm.com> February 2002
+twcss 3428/udp # 2Wire CSS
+twcss 3428/tcp # 2Wire CSS
+# 2Wire IANA Contact <iana at 2wire.com> February 2002
+gcsp 3429/udp # GCSP user port
+gcsp 3429/tcp # GCSP user port
+# Anirban Majumder <majumderanirban at lycos.com> March 2002
+ssdispatch 3430/udp # Scott Studios Dispatch
+ssdispatch 3430/tcp # Scott Studios Dispatch
+# Michael Settles <michael.settles at verizon.net> March 2002
+ndl-als 3431/udp # Active License Server Port
+ndl-als 3431/tcp # Active License Server Port
+# Quentin Brown <ndldev at ndl.co.uk> March 2002
+osdcp 3432/udp # Secure Device Protocol
+osdcp 3432/tcp # Secure Device Protocol
+# Peter Fernandez <fernandez at omnisec.ch> March 2002
+alta-smp 3433/udp # Altaworks Service Management Platform
+alta-smp 3433/tcp # Altaworks Service Management Platform
+# Ted Macomber <TedM at Altaworks.com> March 2002
+opencm 3434/udp # OpenCM Server
+opencm 3434/tcp # OpenCM Server
+# Jonathan S. Shapiro <registrar at eros-os.org> March 2002
+pacom 3435/udp # Pacom Security User Port
+pacom 3435/tcp # Pacom Security User Port
+# Steve Barton <steveb at pacomsystems.com> March 2002
+gc-config 3436/udp # GuardControl Exchange Protocol
+gc-config 3436/tcp # GuardControl Exchange Protocol
+# Andreas Schwarz <andi at trancefield.de> March 2002
+autocueds 3437/udp # Autocue Directory Service
+autocueds 3437/tcp # Autocue Directory Service
+# Geoff Back <geoff at autocue.co.uk> March 2002
+spiral-admin 3438/udp # Spiralcraft Admin
+spiral-admin 3438/tcp # Spiralcraft Admin
+# Michael Toth <mike at spiralcraft.com> March 2002
+hri-port 3439/udp # HRI Interface Port
+hri-port 3439/tcp # HRI Interface Port
+# John Fayos <john.fayos at criticallink.com> March 2002
+ans-console 3440/udp # Net Steward Mgmt Console
+ans-console 3440/tcp # Net Steward Mgmt Console
+# John Richmond <developers at securitydesigners.com> March 2002
+connect-client 3441/udp # OC Connect Client
+connect-client 3441/tcp # OC Connect Client
+connect-server 3442/udp # OC Connect Server
+connect-server 3442/tcp # OC Connect Server
+# Mike Velten <mike.Velten at liebert.com> March 2002
+ov-nnm-websrv 3443/udp # OpenView Network Node Manager WEB Server
+ov-nnm-websrv 3443/tcp # OpenView Network Node Manager WEB Server
+# Anthony Walker <anthony_walker at hp.com> March 2002
+denali-server 3444/udp # Denali Server
+denali-server 3444/tcp # Denali Server
+# Joe Devlin <Joe.Devlin at rocketsoftware.com> March 2002
+monp 3445/udp # Media Object Network
+monp 3445/tcp # Media Object Network
+# Ron Herardian <ron at zoogaloo.com> March 2002
+3comfaxrpc 3446/udp # 3Com FAX RPC port
+3comfaxrpc 3446/tcp # 3Com FAX RPC port
+# Christopher Wells <christopher_wells at 3com.com> April 2002
+cddn 3447/udp # CompuDuo DirectNet
+cddn 3447/tcp # CompuDuo DirectNet
+# Gregory Richards <GregorR at compuduo.com> April 2002
+dnc-port 3448/udp # Discovery and Net Config
+dnc-port 3448/tcp # Discovery and Net Config
+# Chi Chen <chichen at us.ibm.com> April 2002
+hotu-chat 3449/udp # HotU Chat
+hotu-chat 3449/tcp # HotU Chat
+# Tim Burgess <tim at hotu.com> April 2002
+castorproxy 3450/udp # CAStorProxy
+castorproxy 3450/tcp # CAStorProxy
+# Raymond J. Young <Raymond.Young at ca.com> April 2002
+asam 3451/udp # ASAM Services
+asam 3451/tcp # ASAM Services
+# Mike Gossett <mike at omnibond.com> April 2002
+sabp-signal 3452/udp # SABP-Signalling Protocol
+sabp-signal 3452/tcp # SABP-Signalling Protocol
+# Brendan McWilliams <brendan.mcwilliams at vf.vodafone.co.uk> April 2002
+pscupd 3453/udp # PSC Update Port
+pscupd 3453/tcp # PSC Update Port
+# Reid B. Ligon <reid.ligon at pscnet.com>
+mira 3454/tcp # Apple Remote Access Protocol
+# Mike Alexander <mta at um.cc.umich.edu>
+prsvp 3455/udp # RSVP Port
+prsvp 3455/tcp # RSVP Port
+# Bob Braden <Braden at isi.edu>
+vat 3456/udp # VAT default data
+vat 3456/tcp # VAT default data
+# Van Jacobson <van at ee.lbl.gov>
+vat-control 3457/udp # VAT default control
+vat-control 3457/tcp # VAT default control
+# Van Jacobson <van at ee.lbl.gov>
+d3winosfi 3458/udp # D3WinOSFI
+d3winosfi 3458/tcp # D3WinOSFI
+# Brad Hamilton <bh at picksys.com>
+integral 3459/udp # TIP Integral
+integral 3459/tcp # TIP Integral
+# Olivier Mascia <om at tipgroup.com>
+edm-manager 3460/udp # EDM Manger
+edm-manager 3460/tcp # EDM Manger
+edm-stager 3461/udp # EDM Stager
+edm-stager 3461/tcp # EDM Stager
+edm-std-notify 3462/udp # EDM STD Notify
+edm-std-notify 3462/tcp # EDM STD Notify
+edm-adm-notify 3463/udp # EDM ADM Notify
+edm-adm-notify 3463/tcp # EDM ADM Notify
+edm-mgr-sync 3464/udp # EDM MGR Sync
+edm-mgr-sync 3464/tcp # EDM MGR Sync
+edm-mgr-cntrl 3465/udp # EDM MGR Cntrl
+edm-mgr-cntrl 3465/tcp # EDM MGR Cntrl
+# Tom Hennessy <thenn at novadigm.com>
+workflow 3466/udp # WORKFLOW
+workflow 3466/tcp # WORKFLOW
+# Robert Hufsky <rhufsky at csesys.co.at>
+rcst 3467/udp # RCST
+rcst 3467/tcp # RCST
+# Kit Sturgeon <Kit at remotecontrolsextoys.com>
+ttcmremotectrl 3468/udp # TTCM Remote Controll
+ttcmremotectrl 3468/tcp # TTCM Remote Controll
+# Yossi Cohen-Shahar <yossi at proxy.co.il>
+pluribus 3469/udp # Pluribus
+pluribus 3469/tcp # Pluribus
+# Mark Miller <markm at caplet.com>
+jt400 3470/udp # jt400
+jt400 3470/tcp # jt400
+jt400-ssl 3471/udp # jt400-ssl
+jt400-ssl 3471/tcp # jt400-ssl
+# Clifton Nock <cnock at us.ibm.com>
+jaugsremotec-1 3472/udp # JAUGS N-G Remotec 1
+jaugsremotec-1 3472/tcp # JAUGS N-G Remotec 1
+jaugsremotec-2 3473/udp # JAUGS N-G Remotec 2
+jaugsremotec-2 3473/tcp # JAUGS N-G Remotec 2
+# Steven B. Cliff <scliff at remotec-andros.com> April 2002
+ttntspauto 3474/udp # TSP Automation
+ttntspauto 3474/tcp # TSP Automation
+# Arnie Koster <akoster at teltone.com> April 2002
+genisar-port 3475/udp # Genisar Comm Port
+genisar-port 3475/tcp # Genisar Comm Port
+# Candace Niccolson <cniccolson at genisar.com> April 2002
+nppmp 3476/udp # NVIDIA Mgmt Protocol
+nppmp 3476/tcp # NVIDIA Mgmt Protocol
+# Gilbert Yeung <gyeung at nvidia.com> April 2002
+ecomm 3477/udp # eComm link port
+ecomm 3477/tcp # eComm link port
+# Thomas Soerensen <thomassoerensen at stofanet.dk> April 2002
+nat-stun-port 3478/udp # Simple Traversal of UDP Through NAT (STUN) port
+nat-stun-port 3478/tcp # Simple Traversal of UDP Through NAT (STUN) port
+# Jonathan Rosenberg <jdrosen at dynamicsoft.com> April 2002
+twrpc 3479/udp # 2Wire RPC
+twrpc 3479/tcp # 2Wire RPC
+# 2Wire IANA Contact <iana at 2wire.com> April 2002
+plethora 3480/udp # Secure Virtual Workspace
+plethora 3480/tcp # Secure Virtual Workspace
+# Tim Simms <tsimms at plethoratech.com> April 2002
+cleanerliverc 3481/udp # CleanerLive remote ctrl
+cleanerliverc 3481/tcp # CleanerLive remote ctrl
+# David Mojdehi <david.mojdehi at autodesk.com> April 2002
+vulture 3482/udp # Vulture Monitoring System
+vulture 3482/tcp # Vulture Monitoring System
+# Jason Santos <jason.santos at megaslow.net> April 2002
+slim-devices 3483/udp # Slim Devices Protocol
+slim-devices 3483/tcp # Slim Devices Protocol
+# Sean Adams <sean at slimdevices.com> May 2002
+gbs-stp 3484/udp # GBS SnapTalk Protocol
+gbs-stp 3484/tcp # GBS SnapTalk Protocol
+# Eric Harris-Braun <eric at glassbead.com> May 2002
+celatalk 3485/udp # CelaTalk
+celatalk 3485/tcp # CelaTalk
+# Carl Blundell <cblundell at celador.co.uk> May 2002
+ifsf-hb-port 3486/udp # IFSF Heartbeat Port
+ifsf-hb-port 3486/tcp # IFSF Heartbeat Port
+# IFSF Secretary <secretary at ifsf.org> May 2002
+ltcudp 3487/udp # LISA UDP Transfer Channel
+ltctcp 3487/tcp # LISA TCP Transfer Channel
+# Pit Vetterick <pit at 3dgo.com> May 2002
+fs-rh-srv 3488/udp # FS Remote Host Server
+fs-rh-srv 3488/tcp # FS Remote Host Server
+# Brian Nickles <RogueSpear91 at hotmail.com> May 2002
+dtp-dia 3489/udp # DTP/DIA
+dtp-dia 3489/tcp # DTP/DIA
+# Alexei V. Soloviev <avsolov at lab127.karelia.ru> May 2002
+colubris 3490/udp # Colubris Management Port
+colubris 3490/tcp # Colubris Management Port
+# Gilbert Moineau <gilbert.moineau at colubris.com> May 2002
+swr-port 3491/udp # SWR Port
+swr-port 3491/tcp # SWR Port
+# Ian Manning <imanning at dtsuk.com> May 2002
+tvdumtray-port 3492/udp # TVDUM Tray Port
+tvdumtray-port 3492/tcp # TVDUM Tray Port
+# Peter Boers <boers at isisglobal.nl> May 2002
+nut 3493/udp # Network UPS Tools
+nut 3493/tcp # Network UPS Tools
+# Russell Kroll <nut-iana at exploits.org> May 2002
+ibm3494 3494/udp # IBM 3494
+ibm3494 3494/tcp # IBM 3494
+# Jeffrey Pilch <jpilch at us.ibm.com>
+seclayer-tcp 3495/udp # securitylayer over tcp
+seclayer-tcp 3495/tcp # securitylayer over tcp
+seclayer-tls 3496/udp # securitylayer over tls
+seclayer-tls 3496/tcp # securitylayer over tls
+# Arno Hollosi <arno.hollosi at cio.gv.at> March 2002
+ipether232port 3497/udp # ipEther232Port
+ipether232port 3497/tcp # ipEther232Port
+# Marcus Leufgen <leufgen at ipcas.de> May 2002
+dashpas-port 3498/udp # DASHPAS user port
+dashpas-port 3498/tcp # DASHPAS user port
+# Albrecht Mayer <albrecht.mayer at infineon.com> May 2002
+sccip-media 3499/udp # SccIP Media
+sccip-media 3499/tcp # SccIP Media
+# David Yon <dyon at dialout.net> May 2002
+rtmp-port 3500/udp # RTMP Port
+rtmp-port 3500/tcp # RTMP Port
+# Miriam Wohlgelernter <miriamw at adirtech.com>
+isoft-p2p 3501/udp # iSoft-P2P
+isoft-p2p 3501/tcp # iSoft-P2P
+# David Walling <dwalling at isoft.com>
+avinstalldisc 3502/udp # Avocent Install Discovery
+avinstalldisc 3502/tcp # Avocent Install Discovery
+# Brian S. Stewart <Brian.Stewart at Avovent.com>
+lsp-ping 3503/udp # MPLS LSP-echo Port
+lsp-ping 3503/tcp # MPLS LSP-echo Port
+# Ping Pan <pingpan at juniper.net>
+ironstorm 3504/udp # IronStorm game server
+ironstorm 3504/tcp # IronStorm game server
+# Arnaud Clermonte <clermonte at 4xtechnologies.com>
+ccmcomm 3505/udp # CCM communications port
+ccmcomm 3505/tcp # CCM communications port
+# Tom Bougan <tomb at apptechsys.com>
+apc-3506 3506/udp # APC 3506
+apc-3506 3506/tcp # APC 3506
+# American Power Conversion <ports at apcc.com>
+nesh-broker 3507/udp # Nesh Broker Port
+nesh-broker 3507/tcp # Nesh Broker Port
+# Jeremy Maiden <jeremy at komarr.demon.co.uk>
+interactionweb 3508/udp # Interaction Web
+interactionweb 3508/tcp # Interaction Web
+# Andy Niksch <andyn at inin.com>
+vt-ssl 3509/udp # Virtual Token SSL Port
+vt-ssl 3509/tcp # Virtual Token SSL Port
+# Libor Sykora <libor.sykora at st.com> May 2002
+xss-port 3510/udp # XSS Port
+xss-port 3510/tcp # XSS Port
+# Joe Purcell <jpurcell at ensuretech.com> May 2002
+webmail-2 3511/udp # WebMail/2
+webmail-2 3511/tcp # WebMail/2
+# Dimitris Michelinakis <dimitris at michelinakis.gr> May 2002
+aztec 3512/udp # Aztec Distribution Port
+aztec 3512/tcp # Aztec Distribution Port
+# Alan Francis <AlanF at zonal.co.uk> May 2002
+arcpd 3513/udp # Adaptec Remote Protocol
+arcpd 3513/tcp # Adaptec Remote Protocol
+# Hardy Doelfel <hardy_doelfel at adaptec.com> May 2002
+must-p2p 3514/udp # MUST Peer to Peer
+must-p2p 3514/tcp # MUST Peer to Peer
+must-backplane 3515/udp # MUST Backplane
+must-backplane 3515/tcp # MUST Backplane
+# Rick Stefanik <r.stefanik at gatelinx.com> May 2002
+smartcard-port 3516/udp # Smartcard Port
+smartcard-port 3516/tcp # Smartcard Port
+# Scott Guthery <sguthery at mobile-mind.com> May 2002
+802-11-iapp 3517/udp # IEEE 802.11 WLANs WG IAPP
+802-11-iapp 3517/tcp # IEEE 802.11 WLANs WG IAPP
+# Stuart J. Kerry (Chair IEEE 802.11 WG)
+# <stuart at ok-brit.com> May 2002
+artifact-msg 3518/udp # Artifact Message Server
+artifact-msg 3518/tcp # Artifact Message Server
+# Ron Capwell <ron at artifactsoftware.com> June 2002
+galileo 3519/udp # Netvion Galileo Port
+nvmsgd 3519/tcp # Netvion Messenger Port
+galileolog 3520/udp # Netvion Galileo Log Port
+galileolog 3520/tcp # Netvion Galileo Log Port
+# Ray Caruso <ray.caruso at netvion.com> June 2002
+mc3ss 3521/udp # Telequip Labs MC3SS
+mc3ss 3521/tcp # Telequip Labs MC3SS
+# Michael Sparks <msparks at telequiplabs.com> June 2002
+nssocketport 3522/udp # DO over NSSocketPort
+nssocketport 3522/tcp # DO over NSSocketPort
+# Douglas Davidson <drd at apple.com> June 2002
+odeumservlink 3523/udp # Odeum Serverlink
+odeumservlink 3523/tcp # Odeum Serverlink
+# Mads Peter Back <iana-contact at webhouse.dk> June 2002
+ecmport 3524/udp # ECM Server port
+ecmport 3524/tcp # ECM Server port
+eisport 3525/udp # EIS Server port
+eisport 3525/tcp # EIS Server port
+# Paul Kraus <paul.kraus at veritas.com> June 2002
+starquiz-port 3526/udp # starQuiz Port
+starquiz-port 3526/tcp # starQuiz Port
+# Adam Ernst <contact at cosmicsoft.net> June 2002
+beserver-msg-q 3527/udp # VERITAS Backup Exec Server
+beserver-msg-q 3527/tcp # VERITAS Backup Exec Server
+# Katherine Wattwood <katherine.wattwood at veritas.com> June 2002
+jboss-iiop 3528/udp # JBoss IIOP
+jboss-iiop 3528/tcp # JBoss IIOP
+jboss-iiop-ssl 3529/udp # JBoss IIOP/SSL
+jboss-iiop-ssl 3529/tcp # JBoss IIOP/SSL
+# Francisco Reverbel <reverbel at ime.usp.br> June 2002
+gf 3530/udp # Grid Friendly
+gf 3530/tcp # Grid Friendly
+# Daivd P. Chassin <david.chassin at pnl.gov> June 2002
+joltid 3531/udp # Joltid
+joltid 3531/tcp # Joltid
+# Ahti Heinla <ahti at ahti.bluemoon.ee> June 2002
+raven-rmp 3532/udp # Raven Remote Management Control
+raven-rmp 3532/tcp # Raven Remote Management Control
+raven-rdp 3533/udp # Raven Remote Management Data
+raven-rdp 3533/tcp # Raven Remote Management Data
+# Daniel Sorlov <daniel at sorlov.com> June 2002
+urld-port 3534/udp # URL Daemon Port
+urld-port 3534/tcp # URL Daemon Port
+# Jim Binkley <jrb at cs.pdx.edu> June 2002
+ms-la 3535/udp # MS-LA
+ms-la 3535/tcp # MS-LA
+# Eric Ledoux <ericle at microsoft.com>
+snac 3536/udp # SNAC
+snac 3536/tcp # SNAC
+# Tatsuya Igarashi <Tatsuya.Igarashi at jp.sony.com> July 2002
+ni-visa-remote 3537/udp # Remote NI-VISA port
+ni-visa-remote 3537/tcp # Remote NI-VISA port
+# Sinnadurai Dharshan <sinnadurai.dharshan at ni.com> July 2002
+ibm-diradm 3538/udp # IBM Directory Server
+ibm-diradm 3538/tcp # IBM Directory Server
+ibm-diradm-ssl 3539/udp # IBM Directory Server SSL
+ibm-diradm-ssl 3539/tcp # IBM Directory Server SSL
+# Mark Cavage <mcavage at us.ibm.com> July 2002
+pnrp-port 3540/udp # PNRP User Port
+pnrp-port 3540/tcp # PNRP User Port
+# Igor Kostic <igorko at microsoft.com> July 2002
+voispeed-port 3541/udp # VoiSpeed Port
+voispeed-port 3541/tcp # VoiSpeed Port
+# Virgilio Lattanzi <virgilio at harpax.com> July 2002
+hacl-monitor 3542/udp # HA cluster monitor
+hacl-monitor 3542/tcp # HA cluster monitor
+# Jason Ko <jason_ko at hp.com> July 2002
+qftest-lookup 3543/udp # qftest Lookup Port
+qftest-lookup 3543/tcp # qftest Lookup Port
+# Gregor Schmid <gs at qfs.de> July 2002
+teredo 3544/udp # Teredo Port
+teredo 3544/tcp # Teredo Port
+# Dave Thaler <dthaler at microsoft.com> July 2002
+camac 3545/udp # CAMAC equipment
+camac 3545/tcp # CAMAC equipment
+# Eugene Zhiganov <zed at dfe3300.karelia.ru> July 2002
+# 3546 Unassigned (removed September 2002)
+symantec-sim 3547/udp # Symantec SIM
+symantec-sim 3547/tcp # Symantec SIM
+# George Dzieciol <gdzieciol at symantec.com> July 2002
+interworld 3548/udp # Interworld
+interworld 3548/tcp # Interworld
+# John Stephen <iana at mundocani.com> July 2002
+tellumat-nms 3549/udp # Tellumat MDR NMS
+tellumat-nms 3549/tcp # Tellumat MDR NMS
+# Hennie van der Merwe <hvandermerwe at tellumat.com> July 2002
+ssmpp 3550/udp # Secure SMPP
+ssmpp 3550/tcp # Secure SMPP
+# Cormac Long <webmaster at smsforum.net> July 2002
+apcupsd 3551/udp # Apcupsd Information Port
+apcupsd 3551/tcp # Apcupsd Information Port
+# Riccardo Facchetti <riccardo at inetcosmos.org> July 2002
+taserver 3552/udp # TeamAgenda Server Port
+taserver 3552/tcp # TeamAgenda Server Port
+# Dany Ayotte <ayotte at teamsoft.com> July 2002
+rbr-discovery 3553/udp # Red Box Recorder ADP
+rbr-discovery 3553/tcp # Red Box Recorder ADP
+# Simon Jolly <simon.jolly at origin-data.co.uk> July 2002
+questnotify 3554/udp # Quest Notification Server
+questnotify 3554/tcp # Quest Notification Server
+# Rob Griffin <quest_iana at oz.quest.com> July 2002
+razor 3555/udp # Vipul's Razor
+razor 3555/tcp # Vipul's Razor
+# Vipul Ved Prakash <mail at vipul.net> July 2002
+sky-transport 3556/udp # Sky Transport Protocol
+sky-transport 3556/tcp # Sky Transport Protocol
+# Michael Paddon <michael.paddon at activesky.com> July 2002
+personalos-001 3557/udp # PersonalOS Comm Port
+personalos-001 3557/tcp # PersonalOS Comm Port
+# Shane Roberts <shane at shaneroberts.com> July 2002
+mcp-port 3558/udp # MCP user port
+mcp-port 3558/tcp # MCP user port
+# Professor Paul S. Wang <pwang at cs.kent.edu> July 2002
+cctv-port 3559/udp # CCTV control port
+cctv-port 3559/tcp # CCTV control port
+# Raymond Lyons <rlyons at vicon-cctv.com> July 2002
+iniserve-port 3560/udp # INIServe port
+iniserve-port 3560/tcp # INIServe port
+# Peter Moylan <peter at ee.newcastle.edu.au> August 2002
+bmc-onekey 3561/udp # BMC-OneKey
+bmc-onekey 3561/tcp # BMC-OneKey
+# Alon Tam <alon_tam at bmc.com> August 2002
+sdbproxy 3562/udp # SDBProxy
+sdbproxy 3562/tcp # SDBProxy
+# Eric Grange <egrange at creative-it.net> August 2002
+watcomdebug 3563/udp # Watcom Debug
+watcomdebug 3563/tcp # Watcom Debug
+# Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+esimport 3564/udp # Electromed SIM port
+esimport 3564/tcp # Electromed SIM port
+# Francois Marchand <francois.marchand at electromed.com> August 2002
+m2pa 3565/sctp # M2PA
+m2pa 3565/tcp # M2PA
+# Tom George <Tom.George at alcatel.com> May 2002
+quest-launcher 3566/udp # Quest Agent Manager
+quest-launcher 3566/tcp # Quest Agent Manager
+# Eyal Kalderon <eyal.kalderon at quest.com> April 2002
+emware-oft 3567/udp # emWare OFT Services
+emware-oft 3567/tcp # emWare OFT Services
+# Bryant Eastham <beastham at emware.com> August 2002
+emware-epss 3568/udp # emWare EMIT/Secure
+emware-epss 3568/tcp # emWare EMIT/Secure
+# Bryant Eastham <beastham at emware.com> January 2003
+mbg-ctrl 3569/udp # Meinberg Control Service
+mbg-ctrl 3569/tcp # Meinberg Control Service
+# Martin Burnicki <martin.burnicki at meinberg.de> August 2002
+mccwebsvr-port 3570/udp # MCC Web Server Port
+mccwebsvr-port 3570/tcp # MCC Web Server Port
+megardsvr-port 3571/udp # MegaRAID Server Port
+megardsvr-port 3571/tcp # MegaRAID Server Port
+megaregsvrport 3572/udp # Registration Server Port
+megaregsvrport 3572/tcp # Registration Server Port
+# Sreenivas Bagalkote <sreenib at lsil.com> August 2002
+tag-ups-1 3573/udp # Advantage Group UPS Suite
+tag-ups-1 3573/tcp # Advantage Group UPS Suite
+# James Goddard <jamesg at taglim.com> August 2002
+dmaf-caster 3574/udp # DMAF Caster
+dmaf-server 3574/tcp # DMAF Server
+# Ramakrishna Nadendla <rama_nadendla at agilent.com> August 2002
+ccm-port 3575/udp # Coalsere CCM Port
+ccm-port 3575/tcp # Coalsere CCM Port
+cmc-port 3576/udp # Coalsere CMC Port
+cmc-port 3576/tcp # Coalsere CMC Port
+# Chris Hawkinson <chawkinson at coalsere.com> August 2002
+config-port 3577/udp # Configuration Port
+config-port 3577/tcp # Configuration Port
+data-port 3578/udp # Data Port
+data-port 3578/tcp # Data Port
+# Anupam Bharali <abharali at peribit.com> August 2002
+ttat3lb 3579/udp # Tarantella Load Balancing
+ttat3lb 3579/tcp # Tarantella Load Balancing
+# Jim Musgrave <jimm at tarantella.com> August 2002
+nati-svrloc 3580/udp # NATI-ServiceLocator
+nati-svrloc 3580/tcp # NATI-ServiceLocator
+# Jason Case <jason.case at ni.com> August 2002
+kfxaclicensing 3581/udp # Ascent Capture Licensing
+kfxaclicensing 3581/tcp # Ascent Capture Licensing
+# Brad Hamilton <brad_hamilton at kofax.com> August 2002
+press 3582/udp # PEG PRESS Server
+press 3582/tcp # PEG PRESS Server
+# Jim DeLisle <jdelisle at swellsoftware.com> August 2002
+canex-watch 3583/udp # CANEX Watch System
+canex-watch 3583/tcp # CANEX Watch System
+# Peter Kollath <peter.kollath at canex.sk> August 2002
+u-dbap 3584/udp # U-DBase Access Protocol
+u-dbap 3584/tcp # U-DBase Access Protocol
+# Bodo Rueskamp <br at clabsms.de> August 2002
+emprise-lls 3585/udp # Emprise License Server
+emprise-lls 3585/tcp # Emprise License Server
+emprise-lsc 3586/udp # License Server Console
+emprise-lsc 3586/tcp # License Server Console
+# James J. Diaz <JDiaz at EmpriseCorporation.com> August 2002
+p2pgroup 3587/udp # Peer to Peer Grouping
+p2pgroup 3587/tcp # Peer to Peer Grouping
+# Igor Kostic <igorko at microsoft.com> August 2002
+sentinel 3588/udp # Sentinel Server
+sentinel 3588/tcp # Sentinel Server
+# Ian Gordon <ian.s.gordon at btopenworld.com> August 2002
+isomair 3589/udp # isomair
+isomair 3589/tcp # isomair
+# Richard Fleming <richard at apoapsis.com> August 2002
+wv-csp-sms 3590/udp # WV CSP SMS Binding
+wv-csp-sms 3590/tcp # WV CSP SMS Binding
+# Matti Salmi <matti.salmi at nokia.com> August 2002
+gtrack-server 3591/udp # LOCANIS G-TRACK Server
+gtrack-server 3591/tcp # LOCANIS G-TRACK Server
+gtrack-ne 3592/udp # LOCANIS G-TRACK NE Port
+gtrack-ne 3592/tcp # LOCANIS G-TRACK NE Port
+# Juergen.Edelhaeuser <Juergen.Edelhaeuser at locanis.com> August 2002
+bpmd 3593/udp # BP Model Debugger
+bpmd 3593/tcp # BP Model Debugger
+# Keith Fligg <keith at projtech.com> September 2002
+mediaspace 3594/udp # MediaSpace
+mediaspace 3594/tcp # MediaSpace
+shareapp 3595/udp # ShareApp
+shareapp 3595/tcp # ShareApp
+# Jeff King <jking at wave3software.com> September 2002
+iw-mmogame 3596/udp # Illusion Wireless MMOG
+iw-mmogame 3596/tcp # Illusion Wireless MMOG
+# Jan Vrsinsky <jan.vrsinsky at illusionsoftworks.com> September 2002
+a14 3597/udp # A14 (AN-to-SC/MM)
+a14 3597/tcp # A14 (AN-to-SC/MM)
+a15 3598/udp # A15 (AN-to-AN)
+a15 3598/tcp # A15 (AN-to-AN)
+# David Ott <dott at qualcomm.com> September 2002
+quasar-server 3599/udp # Quasar Accounting Server
+quasar-server 3599/tcp # Quasar Accounting Server
+# Brad Pepers <brad at linuxcanada.com> September 2002
+trap-daemon 3600/udp # text relay-answer
+trap-daemon 3600/tcp # text relay-answer
+# John Willis <jwillis at arielusa.com> September 2002
+visinet-gui 3601/udp # Visinet Gui
+visinet-gui 3601/tcp # Visinet Gui
+# Jeff Douglass <ist at att.net> September 2002
+infiniswitchcl 3602/udp # InfiniSwitch Mgr Client
+infiniswitchcl 3602/tcp # InfiniSwitch Mgr Client
+# Lee VanTine <lvantine at infiniswitc.com> September 2002
+int-rcv-cntrl 3603/udp # Integrated Rcvr Control
+int-rcv-cntrl 3603/tcp # Integrated Rcvr Control
+# Dave Stone <dstone01 at harris.com> September 2002
+bmc-jmx-port 3604/udp # BMC JMX Port
+bmc-jmx-port 3604/tcp # BMC JMX Port
+# Mike Behne <Mike_Behne at bmc.com> September 2002
+comcam-io 3605/udp # ComCam IO Port
+comcam-io 3605/tcp # ComCam IO Port
+# Don Gilbreath <don at comcam.net> September 2002
+splitlock 3606/udp # Splitlock Server
+splitlock 3606/tcp # Splitlock Server
+# Andrew Tune <Andrew.Tune at splitlock.com> September 2002
+precise-i3 3607/udp # Precise I3
+precise-i3 3607/tcp # Precise I3
+# Tomer Shain <tshain at precise.com> September 2002
+trendchip-dcp 3608/udp # Trendchip control protocol
+trendchip-dcp 3608/tcp # Trendchip control protocol
+# Ming-Jen Chen <mjchen at trendchip.com.tw> September 2002
+cpdi-pidas-cm 3609/udp # CPDI PIDAS Connection Mon
+cpdi-pidas-cm 3609/tcp # CPDI PIDAS Connection Mon
+# Tony Splaver <tony at cpdi.com> September 2002
+echonet 3610/udp # ECHONET
+echonet 3610/tcp # ECHONET
+# Takeshi Saito <takeshi.saito at toshiba.co.jp> September 2002
+six-degrees 3611/udp # Six Degrees Port
+six-degrees 3611/tcp # Six Degrees Port
+# Dan Hansen <dhansen at dimensional.com> September 2002
+hp-dataprotect 3612/udp # HP Data Protector
+hp-dataprotect 3612/tcp # HP Data Protector
+# Stephen Gold <stephen_gold at hp.com> September 2002
+alaris-disc 3613/udp # Alaris Device Discovery
+alaris-disc 3613/tcp # Alaris Device Discovery
+# Chris McAllen <cmcallen at alarismed.com> October 2002
+sigma-port 3614/udp # Invensys Sigma Port
+sigma-port 3614/tcp # Invensys Sigma Port
+# Dr. Sajed Husein <sajed.husein at invensys.com> October 2002
+start-network 3615/udp # Start Messaging Network
+start-network 3615/tcp # Start Messaging Network
+# Peter Rocca <rocca at multiboard.com> October 2002
+cd3o-protocol 3616/udp # cd3o Control Protocol
+cd3o-protocol 3616/tcp # cd3o Control Protocol
+# Chris Wilcox <cwilcox at cd3o.com> October 2002
+sharp-server 3617/udp # ATI SHARP Logic Engine
+sharp-server 3617/tcp # ATI SHARP Logic Engine
+# Bill Reveile <Bill at allentek.com>
+aairnet-1 3618/udp # AAIR-Network 1
+aairnet-1 3618/tcp # AAIR-Network 1
+aairnet-2 3619/udp # AAIR-Network 2
+aairnet-2 3619/tcp # AAIR-Network 2
+# James Mealey <jymealey at yahoo.com> October 2002
+ep-pcp 3620/udp # EPSON Projector Control Port
+ep-pcp 3620/tcp # EPSON Projector Control Port
+ep-nsp 3621/udp # EPSON Network Screen Port
+ep-nsp 3621/tcp # EPSON Network Screen Port
+# SEIKO EPSON <Sato.Minoru3 at exc.epson.co.jp> October 2002
+ff-lr-port 3622/udp # FF LAN Redundancy Port
+ff-lr-port 3622/tcp # FF LAN Redundancy Port
+# Fieldbus Foundation <dave.glanzer at fieldbus.org> October 2002
+haipe-discover 3623/udp # HAIPIS Dynamic Discovery
+haipe-discover 3623/tcp # HAIPIS Dynamic Discovery
+# Mike Irani <irani_mike at bah.com> October 2002
+dist-upgrade 3624/udp # Distributed Upgrade Port
+dist-upgrade 3624/tcp # Distributed Upgrade Port
+# Jason Schoon <jason.schoon at intermec.com> October 2002
+volley 3625/udp # Volley
+volley 3625/tcp # Volley
+# David Catmull <uncommon at uncommonplace.com> October 2002
+bvcdaemon-port 3626/udp # bvControl Daemon
+bvcdaemon-port 3626/tcp # bvControl Daemon
+# Ravi Gokhale <rgokhale at bindview.com> October 2002
+jamserverport 3627/udp # Jam Server Port
+jamserverport 3627/tcp # Jam Server Port
+# Art Pope <apope at sarnoff.com> October 2002
+ept-machine 3628/udp # EPT Machine Interface
+ept-machine 3628/tcp # EPT Machine Interface
+# Victor H. Farrace <vfarrace at eaglept.com> October 2002
+escvpnet 3629/udp # ESC/VP.net
+escvpnet 3629/tcp # ESC/VP.net
+# Hiroyuki Hashimoto <easymp at exc.epson.co.jp> October 2002
+cs-remote-db 3630/udp # C&S Remote Database Port
+cs-remote-db 3630/tcp # C&S Remote Database Port
+cs-services 3631/udp # C&S Web Services Port
+cs-services 3631/tcp # C&S Web Services Port
+# Computer Software GmbH <BrunoRistok at cs-ag.de> October 2002
+distcc 3632/udp # distributed complier
+distcc 3632/tcp # distributed compiler
+# Martin Pool <mbp at samba.org> November 2002
+wacp 3633/udp # Wyrnix AIS port
+wacp 3633/tcp # Wyrnix AIS port
+# Harry T. Vennik <htvennik at zonnet.nl> November 2002
+hlibmgr 3634/udp # hNTSP Library Manager
+hlibmgr 3634/tcp # hNTSP Library Manager
+# Kenji Tetsuyama <kenji at onkyo.co.jp> November 2002
+sdo 3635/udp # Simple Distributed Objects
+sdo 3635/tcp # Simple Distributed Objects
+# Alexander Philippou <alex at noemax.com> November 2002
+opscenter 3636/udp # OpsCenter
+opscenter 3636/tcp # OpsCenter
+# Ralph Campbell <ralph.campbell at xasystems.com> November 2002
+scservp 3637/udp # Customer Service Port
+scservp 3637/tcp # Customer Service Port
+# Jonathan A. Zdziarski <johathan at networkdweebs.com> November 2002
+ehp-backup 3638/udp # EHP Backup Protocol
+ehp-backup 3638/tcp # EHP Backup Protocol
+# Ed Fair <ed_fair at yahoo.com> November 2002
+xap-ha 3639/udp # Extensible Automation
+xap-ha 3639/tcp # Extensible Automation
+# Mark Harrison <Mark at xapautomation.org> November 2002
+netplay-port1 3640/udp # Netplay Port 1
+netplay-port1 3640/tcp # Netplay Port 1
+netplay-port2 3641/udp # Netplay Port 2
+netplay-port2 3641/tcp # Netplay Port 2
+# Predrag Filipovic <pfilipovic at digital5.com> November 2002
+juxml-port 3642/udp # Juxml Replication port
+juxml-port 3642/tcp # Juxml Replication port
+# Colin Reid <creid at projux.com> November 2002
+audiojuggler 3643/udp # AudioJuggler
+audiojuggler 3643/tcp # AudioJuggler
+# Morten Mertner <mm at audiojuggler.com> November 2002
+ssowatch 3644/udp # ssowatch
+ssowatch 3644/tcp # ssowatch
+# Stephane Vinsot <vinsot at enatel.com> November 2002
+cyc 3645/udp # Cyc
+cyc 3645/tcp # Cyc
+# Stephen Reed <reed at cyc.com> January 2003
+xss-srv-port 3646/udp # XSS Server Port
+xss-srv-port 3646/tcp # XSS Server Port
+# Joe Purcell <jpurcell at ensuretech.com> January 2003
+splitlock-gw 3647/udp # Splitlock Gateway
+splitlock-gw 3647/tcp # Splitlock Gateway
+# Andrew Tune <Andrew.Tune at splitlock.com> January 2003
+fjcp 3648/udp # Fujitsu Cooperation Port
+fjcp 3648/tcp # Fujitsu Cooperation Port
+# Kouji Sugisawa <sugisawa.kouji at soft.fujitsu.com> January 2003
+nmmp 3649/udp # Nishioka Miyuki Msg Protocol
+nmmp 3649/tcp # Nishioka Miyuki Msg Protocol
+# TAKEDA Hiroyuki <takeda at atashi.net> January 2003
+prismiq-plugin 3650/udp # PRISMIQ VOD plug-in
+prismiq-plugin 3650/tcp # PRISMIQ VOD plug-in
+# Richard Hodges <rhodges at prismiq.com> January 2003
+xrpc-registry 3651/udp # XRPC Registry
+xrpc-registry 3651/tcp # XRPC Registry
+# Slava Monich <Slava.Monich at nokia.com> January 2003
+vxcrnbuport 3652/udp # VxCR NBU Default Port
+vxcrnbuport 3652/tcp # VxCR NBU Default Port
+# Boris Star <boris.star at veritas.com> January 2003
+tsp 3653/udp # Tunnel Setup Protocol
+tsp 3653/tcp # Tunnel Setup Protocol
+# Marc Blanchet <Marc.Blanchet at viagenie.qc.ca> January 2003
+vaprtm 3654/udp # VAP RealTime Messenger
+vaprtm 3654/tcp # VAP RealTime Messenger
+# Boris Polevoy <vapcom at mail.ru> January 2003
+abatemgr 3655/udp # ActiveBatch Exec Agent
+abatemgr 3655/tcp # ActiveBatch Exec Agent
+abatjss 3656/udp # ActiveBatch Job Scheduler
+abatjss 3656/tcp # ActiveBatch Job Scheduler
+# Ben Rosenberg <brosenberg at advsyscon.com> January 2003
+immedianet-bcn 3657/udp # ImmediaNet Beacon
+immedianet-bcn 3657/tcp # ImmediaNet Beacon
+# Bill Homan <bhoman at spanworks.com> January 2003
+ps-ams 3658/udp # PlayStation AMS (Secure)
+ps-ams 3658/tcp # PlayStation AMS (Secure)
+# Edgar Alan Tu <Edgar_Tu at playstation.sony.com> January 2003
+apple-sasl 3659/udp # Apple SASL
+apple-sasl 3659/tcp # Apple SASL
+# David M. O'Rourke <daveo at apple.com> January 2003
+can-nds-ssl 3660/udp # Candle Directory Services using SSL
+can-nds-ssl 3660/tcp # Candle Directory Services using SSL
+can-ferret-ssl 3661/udp # Candle Directory Services using SSL
+can-ferret-ssl 3661/tcp # Candle Directory Services using SSL
+# Nic Catrambone <Nic_Catrambond at candle.com> January 2003
+pserver 3662/udp # pserver
+pserver 3662/tcp # pserver
+# Patrick Furlong <pfurlong at darkknight.ca> January 2003
+dtp 3663/udp # DIRECWAY Tunnel Protocol
+dtp 3663/tcp # DIRECWAY Tunnel Protocol
+# Greg Gee <ggee at hns.com> January 2003
+ups-engine 3664/udp # UPS Engine Port
+ups-engine 3664/tcp # UPS Engine Port
+ent-engine 3665/udp # Enterprise Engine Port
+ent-engine 3665/tcp # Enterprise Engine Port
+# Mike Delgrosso <mdelgros at tripplite.com> January 2003
+eserver-pap 3666/udp # IBM EServer PAP
+eserver-pap 3666/tcp # IBM eServer PAP
+# Dave Gimpl <gimpl at us.ibm.com> January 2003
+infoexch 3667/udp # IBM Information Exchange
+infoexch 3667/tcp # IBM Information Exchange
+# Paul Ford-Hutchinson <paulfordh at uk.ibm.com> January 2003
+dell-rm-port 3668/udp # Dell Remote Management
+dell-rm-port 3668/tcp # Dell Remote Management
+# Bradley Bransom <bradley_bransom at dell.com> January 2003
+casanswmgmt 3669/udp # CA SAN Switch Management
+casanswmgmt 3669/tcp # CA SAN Switch Management
+# Emre Tunar <emre.tunar at ca.com> January 2003
+smile 3670/udp # SMILE TCP/UDP Interface
+smile 3670/tcp # SMILE TCP/UDP Interface
+# Andre Petras <A_Petras at web.de> January 2003
+efcp 3671/udp # e Field Control (EIBnet)
+efcp 3671/tcp # e Field Control (EIBnet)
+# Marc Goossens <mgoossens at eiba.com> January 2003
+lispworks-orb 3672/udp # LispWorks ORB
+lispworks-orb 3672/tcp # LispWorks ORB
+# Lisp Support <lisp-support at xanalys.com>
+mediavault-gui 3673/udp # Openview Media Vault GUI
+mediavault-gui 3673/tcp # Openview Media Vault GUI
+# Stephen Gold <stephen_gold at hp.com> January 2003
+wininstall-ipc 3674/udp # WinINSTALL IPC Port
+wininstall-ipc 3674/tcp # WinINSTALL IPC Port
+# Bill Somerville <Bill.Somerville at OnDemandSoftware.com> January 2003
+calltrax 3675/udp # CallTrax Data Port
+calltrax 3675/tcp # CallTrax Data Port
+# Oliver Bailey <oliver at time-lines.com> January 2003
+va-pacbase 3676/udp # VisualAge Pacbase server
+va-pacbase 3676/tcp # VisualAge Pacbase server
+# Dominique Lelievre <dominique.lelievre at fr.ibm.com> January 2003
+roverlog 3677/udp # RoverLog IPC
+roverlog 3677/tcp # RoverLog IPC
+# Tom Mayo <tmayo1 at rochester.rr.com> January 2003
+ipr-dglt 3678/udp # DataGuardianLT
+ipr-dglt 3678/tcp # DataGuardianLT
+# Bruce Carlson <bruce.carlson at iprintl.com> January 2003
+newton-dock 3679/udp # Newton Dock
+newton-dock 3679/tcp # Newton Dock
+npds-tracker 3680/udp # NPDS Tracker
+npds-tracker 3680/tcp # NPDS Tracker
+# Paul Guyot <pguyot at kallisys.net> January 2003
+bts-x73 3681/udp # BTS X73 Port
+bts-x73 3681/tcp # BTS X73 Port
+# Todd Cooper <todd at DO11073.com> January 2003
+cas-mapi 3682/udp # EMC SmartPackets-MAPI
+cas-mapi 3682/tcp # EMC SmartPackets-MAPI
+# Koen Schoofs <schoofs_koen at emc.com> January 2003
+bmc-ea 3683/udp # BMC EDV/EA
+bmc-ea 3683/tcp # BMC EDV/EA
+# Jeffrey Glanz <jeffrey_glanz at bmc.com> January 2003
+faxstfx-port 3684/udp # FAXstfX
+faxstfx-port 3684/tcp # FAXstfX
+# Alec Carlson <acarlson at smithmicro.com> January 2003
+dsx-agent 3685/udp # DS Expert Agent
+dsx-agent 3685/tcp # DS Expert Agent
+# NetPro Computing <ports at netpro.com> January 2003
+tnmpv2 3686/udp # Trivial Network Management
+tnmpv2 3686/tcp # Trivial Network Management
+# Andrea Premoli <Andrea_maria.Premoli at icn.siemens.it> January 2003
+simple-push 3687/udp # simple-push
+simple-push 3687/tcp # simple-push
+simple-push-s 3688/udp # simple-push Secure
+simple-push-s 3688/tcp # simple-push Secure
+# C. Enrique Ortiz <eortiz at j2medeveloper.com> January 2003
+daap 3689/udp # Digital Audio Access Protocol
+daap 3689/tcp # Digital Audio Access Protocol
+# Amandeep Jawa <daap at apple.com> January 2003
+svn 3690/udp # Subversion
+svn 3690/tcp # Subversion
+# Greg Hudson <ghudson at mit.edu> January 2003
+magaya-network 3691/udp # Magaya Network Port
+magaya-network 3691/tcp # Magaya Network Port
+# Jesus David Rodriguez <jesusdavid at magaya.com> February 2003
+intelsync 3692/udp # Brimstone IntelSync
+intelsync 3692/tcp # Brimstone IntelSync
+# Davey Taylor <davey.taylor at brimstone.net> February 2003
+gttp 3693/udp # GTTP
+gttp 3693/tcp # GTTP
+vpncpp 3694/udp # VPN Cookie Prop Protocol
+vpncpp 3694/tcp # VPN Cookie Prop Protocol
+# Rondald P. Bonica <Ronald.P.Bonica at wcom.com> February 2003
+bmc-data-coll 3695/udp # BMC Data Collection
+bmc-data-coll 3695/tcp # BMC Data Collection
+# Randall De Weerd <rdeweerd at bmc.com> February 2003
+telnetcpcd 3696/udp # Telnet Com Port Control
+telnetcpcd 3696/tcp # Telnet Com Port Control
+# Thomas J. Pinkl <tom at hbsrx.com> February 2003
+nw-license 3697/udp # NavisWorks Licnese System
+nw-license 3697/tcp # NavisWorks License System
+# Tim Wiegand <tim.wiegand at navisworks.com> February 2003
+sagectlpanel 3698/udp # SAGECTLPANEL
+sagectlpanel 3698/tcp # SAGECTLPANEL
+# Mark Gamble <mark.gamble at sage.com> February 2003
+kpn-icw 3699/udp # Internet Call Waiting
+kpn-icw 3699/tcp # Internet Call Waiting
+# B.J. Kortekaas <b.j.kortekaas at kpn.com> February 2003
+lrs-paging 3700/udp # LRS NetPage
+lrs-paging 3700/tcp # LRS NetPage
+# Geoffrey Wossum <geoffrey at pager.net> February 2003
+netcelera 3701/udp # NetCelera
+netcelera 3701/tcp # NetCelera
+# Tarek Nabhan <standards at itworx.com> February 2003
+upnp-discovery 3702/udp # UPNP v2 Discovery
+upnp-discovery 3702/tcp # UPNP v2 Discovery
+# Christian Huitema <huitema at microsoft.com> February 2003
+adobeserver-3 3703/udp # Adobe Server 3
+adobeserver-3 3703/tcp # Adobe Server 3
+adobeserver-4 3704/udp # Adobe Server 4
+adobeserver-4 3704/tcp # Adobe Server 4
+adobeserver-5 3705/udp # Adobe Server 5
+adobeserver-5 3705/tcp # Adobe Server 5
+# Frank Soetebeer <frsoeteb at adobe.com> January 2003
+rt-event 3706/udp # Real-Time Event Port
+rt-event 3706/tcp # Real-Time Event Port
+rt-event-s 3707/udp # Real-Time Event Secure Port
+rt-event-s 3707/tcp # Real-Time Event Secure Port
+# Terry Gin <terry_gin at inter-tel.com> February 2003
+# 3708 Unassigned
+ca-idms 3709/udp # CA-IDMS Server
+ca-idms 3709/tcp # CA-IDMS Server
+# Dave Ross <david.ross at ca.com>
+portgate-auth 3710/udp # PortGate Authentication
+portgate-auth 3710/tcp # PortGate Authentication
+# Scott Harris <Scott at XRamp.com> February 2003
+edb-server2 3711/udp # EBD Server 2
+edb-server2 3711/tcp # EBD Server 2
+# Carlos Portela <cportela at simple-sw.com> February 2003
+sentinel-ent 3712/udp # Sentinel Enterprise
+sentinel-ent 3712/tcp # Sentinel Enterprise
+# Ian Gordon <ian at n-genltd.co.uk> March 2003
+tftps 3713/udp # TFTP over TLS
+tftps 3713/tcp # TFTP over TLS
+# Mark mayernick <Mark.Mayernick at thomson.net> March 2003
+delos-dms 3714/udp # DELOS Direct Messaging
+delos-dms 3714/tcp # DELOS Direct Messaging
+# Ekkehard Morgenstern <flnca at gmx.de> March 2003
+anoto-rendezv 3715/udp # Anoto Rendezvous Port
+anoto-rendezv 3715/tcp # Anoto Rendezvous Port
+# Ola Sandstrom <ola.sandstrom at anoto.com> March 2003
+wv-csp-sms-cir 3716/udp # WV CSP SMS CIR Channel
+wv-csp-sms-cir 3716/tcp # WV CSP SMS CIR Channel
+wv-csp-udp-cir 3717/udp # WV CSP UDP/IP CIR Channel
+wv-csp-udp-cir 3717/tcp # WV CSP UDP/IP CIR Channel
+# Jon Ingi Ingimundarson <jii at oz.com> March 2003
+opus-services 3718/udp # OPUS Server Port
+opus-services 3718/tcp # OPUS Server Port
+# Detlef Stoever <mail at ivotec.com> March 2003
+itelserverport 3719/udp # iTel Server Port
+itelserverport 3719/tcp # iTel Server Port
+# Mark Hendricks <markah at copper.net> March 2003
+ufastro-instr 3720/udp # UF Astro. Instr. Services
+ufastro-instr 3720/tcp # UF Astro. Instr. Services
+# David B. Hon <hon at astro.ufl.edu> March 2003
+xsync 3721/udp # Xsync
+xsync 3721/tcp # Xsync
+xserveraid 3722/udp # Xserver RAID
+xserveraid 3722/tcp # Xserver RAID
+# Bob Bradley <bradley at apple.com> March 2003
+sychrond 3723/udp # Sychron Service Daemon
+sychrond 3723/tcp # Sychron Service Daemon
+# Robert Marinelli <bob at sychron.com> March 2003
+battlenet 3724/udp # Blizzard Battlenet
+battlenet 3724/tcp # Blizzard Battlenet
+# Adrian Luff <aluff at blizzard.com> March 2003
+na-er-tip 3725/udp # Netia NA-ER Port
+na-er-tip 3725/tcp # Netia NA-ER Port
+# Jean-Pierre Garcia <jp.garcia at netia.net> April 2003
+array-manager 3726/udp # Xyartex Array Manager
+array-manager 3726/tcp # Xyratex Array Manager
+# David A. Lethe <david_lethe at us.xyratex.com> April 2003
+e-mdu 3727/udp # Ericsson Mobile Data Unit
+e-mdu 3727/tcp # Ericsson Mobile Data Unit
+e-woa 3728/udp # Ericsson Web on Air
+e-woa 3728/tcp # Ericsson Web on Air
+# Marco Casole <marco.casole at ebc.ericsson.se> April 2003
+fksp-audit 3729/udp # Fireking Audit Port
+fksp-audit 3729/tcp # Fireking Audit Port
+# Richard Thurman <richt at fireking.com> April 2003
+client-ctrl 3730/udp # Client Control
+client-ctrl 3730/tcp # Client Control
+# Lawrence W. Dunn <larrydunn at aptcomp.com> April 2003
+smap 3731/udp # Service Manager
+smap 3731/tcp # Service Manager
+m-wnn 3732/udp # Mobile Wnn
+m-wnn 3732/tcp # Mobile Wnn
+# Yasunari Yamashita <yamasita at omronsoft.co.jp> April 2003
+multip-msg 3733/udp # Multipuesto Msg Port
+multip-msg 3733/tcp # Multipuesto Msg Port
+# Felisa Ares <faa06 at tid.es> April 2003
+synel-data 3734/udp # Synel Data Collection Port
+synel-data 3734/tcp # Synel Data Collection Port
+# David Ashkenazi <david at synel.co.il> April 2003
+pwdis 3735/udp # Password Distribution
+pwdis 3735/tcp # Password Distribution
+# Robert Erl <roerl at web.de> April 2003
+rs-rmi 3736/udp # RealSpace RMI
+rs-rmi 3736/tcp # RealSpace RMI
+# Barry McDarby <realspace at starwolf.biz> April 2003
+# 3737 Unassigned (Removed 2003-02-26)
+versatalk 3738/udp # versaTalk Server Port
+versatalk 3738/tcp # versaTalk Server Port
+# Dr. Kingsley C. Nwosu <knwosu at aglowmail.com> April 2003
+launchbird-lm 3739/udp # Launchbird LicenseManager
+launchbird-lm 3739/tcp # Launchbird LicenseManager
+# Tom Hawkins <tom1 at launchbird.com> April 2003
+heartbeat 3740/udp # Heartbeat Protocol
+heartbeat 3740/tcp # Heartbeat Protocol
+# Jeroen Massar <jeroen at unfix.org> April 2003
+wysdma 3741/udp # WysDM Agent
+wysdma 3741/tcp # WysDM Agent
+# Jim McDonald <Jim.McDonald at sysdm.com> April 2003
+cst-port 3742/udp # CST - Configuration & Service Tracker
+cst-port 3742/tcp # CST - Configuration & Service Tracker
+# Hai Ou-Yang <hai.ou-yang at sun.com> April 2003
+ipcs-command 3743/udp # IP Control Systems Ltd.
+ipcs-command 3743/tcp # IP Control Systems Ltd.
+# Paul Anderson <paul.anderson at ip-cs.com> April 2003
+sasg 3744/udp # SASG
+sasg 3744/tcp # SASG
+# Cristian Petculescu <cristp at hotmail.com> April 2003
+gw-call-port 3745/udp # GWRTC Call Port
+gw-call-port 3745/tcp # GWRTC Call Port
+# Felisa Ares <faa06 at tid.es> April 2003
+linktest 3746/udp # LXPRO.COM LinkTest
+linktest 3746/tcp # LXPRO.COM LinkTest
+linktest-s 3747/udp # LXPRO.COM LinkTest SSL
+linktest-s 3747/tcp # LXPRO.COM LinkTest SSL
+# Greg Bailey <gbailey at lxpro.com> April 2003
+webdata 3748/udp # webData
+webdata 3748/tcp # webData
+# Michael Whiteley <michael at whiteley.com> April 2003
+cimtrak 3749/udp # CimTrak
+cimtrak 3749/tcp # CimTrak
+cbos-ip-port 3750/udp # CBOS/IP ncapsalatoin port
+cbos-ip-port 3750/tcp # CBOS/IP ncapsalation port
+# Thomas Dannemiller <tom.dannemiller at rolls-royce.com> April 2003
+gprs-cube 3751/udp # CommLinx GPRS Cube
+gprs-cube 3751/tcp # CommLinx GPRS Cube
+# Peter Johnson <peter at commlinx.com.au> April 2003
+vipremoteagent 3752/udp # Vigil-IP RemoteAgent
+vipremoteagent 3752/tcp # Vigil-IP RemoteAgent
+# Bryan Alvord <bryan at vaticor.com> April 2003
+nattyserver 3753/udp # NattyServer Port
+nattyserver 3753/tcp # NattyServer Port
+# Akira Saito <admin at kobu.com> April 2003
+timestenbroker 3754/udp # TimesTen Broker Port
+timestenbroker 3754/tcp # TimesTen Broker Port
+# David Aspinwall <aspinwall at TimesTen.com> April 2003
+sas-remote-hlp 3755/udp # SAS Remote Help Server
+sas-remote-hlp 3755/tcp # SAS Remote Help Server
+# Gary T. Ciampa <Gary.Ciampa at sas.com> April 2003
+canon-capt 3756/udp # Canon CAPT Port
+canon-capt 3756/tcp # Canon CAPT Port
+# Takashi Okazawa <okazawa.takashi at canon.co.jp> April 2003
+grf-port 3757/udp # GRF Server Port
+grf-port 3757/tcp # GRF Server Port
+# Robert Banfill <robert at banfill.net> April 2003
+apw-registry 3758/udp # apw RMI registry
+apw-registry 3758/tcp # apw RMI registry
+# Dan Davis <Dan.A.Davis at hp.com> April 2003
+exapt-lmgr 3759/udp # Exapt License Manager
+exapt-lmgr 3759/tcp # Exapt License Manager
+# Christoph Kukulies <info at exapt.de> April 2003
+adtempusclient 3760/udp # adTEmpus Client
+adtempusclient 3760/tcp # adTempus Client
+# Bill Wingate <bill.wingate at arcanadev.com> May 2003
+gsakmp 3761/udp # gsakmp port
+gsakmp 3761/tcp # gsakmp port
+# Uri Meth <umeth at sparta.com> June 2003
+gbs-smp 3762/udp # GBS SnapMail Protocol
+gbs-smp 3762/tcp # GBS SnapMail Protocol
+# Eric Harris-Braun <eric at glassbead.com> June 2003
+xo-wave 3763/udp # XO Wave Control Port
+xo-wave 3763/tcp # XO Wave Control Port
+# Bjorn Dittmer-Roche <bjorn at xowave.com> June 2003
+mni-prot-rout 3764/udp # MNI Protected Routing
+mni-prot-rout 3764/tcp # MNI Protected Routing
+# Tim Behne <timothyb at microwavenetworks.com> June 2003
+rtraceroute 3765/udp # Remote Traceroute
+rtraceroute 3765/tcp # Remote Traceroute
+# A. Blake Cooper <blake at cluebie.net> June 2003
+listmgr-port 3767/udp # ListMGR Port
+listmgr-port 3767/tcp # ListMGR Port
+# Takashi Kubota <kubota.takashi at pfu.fugitsu.com> June 2003
+rblcheckd 3768/udp # rblcheckd server daemon
+rblcheckd 3768/tcp # rblcheckd server daemon
+# Sabri Berisha <sabri at cluecentral.net> June 2003
+haipe-otnk 3769/udp # HAIPE Network Keying
+haipe-otnk 3769/tcp # HAIPE Network Keying
+# Mike Irani <irani at spawar.navy.mil> June 2003
+cindycollab 3770/udp # Cinderella Collaboration
+cindycollab 3770/tcp # Cinderella Collaboration
+# Ulrich Kortenkamp <kortenkamp at cinderella.de> June 2003
+paging-port 3771/udp # RTP Paging Port
+paging-port 3771/tdp # RTP Paging Port
+# Patrick Ferriter <Patrick.Ferriter at zultys.com> June 2003
+ctp 3772/udp # Chantry Tunnel Protocol
+ctp 3772/tcp # Chantry Tunnel Protocol
+# Inderpreet Singh <isingh at chantrynetworks.com> June 2003
+ctdhercules 3773/udp # ctdhercules
+ctdhercules 3773/tcp # ctdhercules
+# Carl Banzhof <cbanzhof at citadel.com> June 2003
+zicom 3774/udp # ZICOM
+zicom 3774/tcp # ZICOM
+# Sabu Das <sabud at zicomsecure.com> June 2003
+ispmmgr 3775/udp # ISPM Manager Port
+ispmmgr 3775/tcp # ISPM Manager Port
+# Eric Anderson <eanderson at netvision.com> June 2003
+# 3776 Unassigned
+jibe-eb 3777/udp # Jibe EdgeBurst
+jibe-eb 3777/tcp # Jibe EdgeBurst
+# Chap Tippin <chad.tippin at jibeinc.com> June 2003
+c-h-it-port 3778/udp # Cutler-Hammer IT Port
+c-h-it-port 3778/tcp # Cutler-Hammer IT Port
+# Thomas Ruchti <thomasmruchti at eaton.com> June 2003
+cognima 3779/udp # Cognima Replication
+cognima 3779/tcp # Cognima Replication
+# Raplh Grenwell <ralph.greenwell at cognima.com> June 2003
+nnp 3780/udp # Nuzzler Network Protocol
+nnp 3780/tcp # Nuzzler Network Protocol
+# Andreas Schwarz <andreas.schwarz at securepoint.de> June 2003
+abcvoice-port 3781/udp # ABCvoice server port
+abcvoice-port 3781/tcp # ABCvoice server port
+# Carlos Gonzalez-Roman Ferrer <iana at abcdatos.com> June 2003
+iso-tp0s 3782/udp # Secure ISO TP0 port
+iso-tp0s 3782/tcp # Secure ISO TP0 port
+# Herbert Falk <herb at sisconet.com> June 2003
+# 3783-3799 Unassigned
+pwgpsi 3800/udp # Print Services Interface
+pwgpsi 3800/tcp # Print Services Interface
+# Harry Lewis <harryl at us.ibm.com> May 2003
+# 3801 Unassigned
+vhd 3802/udp # VHD
+vhd 3802/tcp # VHD
+# Chris Duncombe <cdunc at intoo.com>
+# 3803-3844 Unassigned
+v-one-spp 3845/udp # V-ONE Single Port Proxy
+v-one-spp 3845/tcp # V-ONE Single Port Proxy
+# Daniel Becker <dbecker at v-one.com>
+# 3846-3860 Unassigned
+winshadow-hd 3861/udp # winShadow Host Discovery
+winshadow-hd 3861/tcp # winShadow Host Discovery
+# Shu-Wei Tan <stan at omnicomtech.com> March 2003
+giga-pocket 3862/udp # GIGA-POCKET
+giga-pocket 3862/tcp # GIGA-POCKET
+# Yoshikazu Watanabe <nabe at sm.sony.co.jp>
+# 3863-3874 Unassigned
+pnbscada 3875/udp # PNBSCADA
+pnbscada 3875/tcp # PNBSCADA
+# Philip N. Bergstresser <phil at bergstresser.org>
+# 3876-3884 Unassigned
+topflow-ssl 3885/udp # TopFlow SSL
+topflow-ssl 3885/tcp # TopFlow SSL
+# Ken Nelson <nelson at TopLayer.com>
+# 3886-3899 Unassigned
+udt_os 3900/udp # Unidata UDT OS
+udt_os 3900/tcp # Unidata UDT OS
+# James Powell <james at mailhost.unidata.com>
+# 3901-3938 Unassigned
+aamp 3939/udp # Anti-virus Application Management Port
+aamp 3939/tcp # Anti-virus Application Management Port
+# In-sik Choi <iscard at virusdesk.com> February 2002
+# 3940-3983 Unassigned
+mapper-nodemgr 3984/udp # MAPPER network node manager
+mapper-nodemgr 3984/tcp # MAPPER network node manager
+mapper-mapethd 3985/udp # MAPPER TCP/IP server
+mapper-mapethd 3985/tcp # MAPPER TCP/IP server
+mapper-ws_ethd 3986/udp # MAPPER workstation server
+mapper-ws_ethd 3986/tcp # MAPPER workstation server
+# John C. Horton <jch at unirsvl.rsvl.unisys.com>
+centerline 3987/udp # Centerline
+centerline 3987/tcp # Centerline
+# Mark Simpson <simpson at centerline.com>
+# 3988-3999 Unassigned
+terabase 4000/udp # Terabase
+terabase 4000/tcp # Terabase
+# Thor Olson <Thor at terabase.com>
+####### Potential Conflict of ports ################################
+####### PORT 4000 also used by ICQ <www.icq.com> ###################
+newoak 4001/udp # NewOak
+newoak 4001/tcp # NewOak
+# Jim Philippou <jphilippou at newoak.com>
+pxc-spvr-ft 4002/udp # pxc-spvr-ft
+pxc-spvr-ft 4002/tcp # pxc-spvr-ft
+pxc-splr-ft 4003/udp # pxc-splr-ft
+pxc-splr-ft 4003/tcp # pxc-splr-ft
+pxc-roid 4004/udp # pxc-roid
+pxc-roid 4004/tcp # pxc-roid
+pxc-pin 4005/udp # pxc-pin
+pxc-pin 4005/tcp # pxc-pin
+pxc-spvr 4006/udp # pxc-spvr
+pxc-spvr 4006/tcp # pxc-spvr
+pxc-splr 4007/udp # pxc-splr
+pxc-splr 4007/tcp # pxc-splr
+# Dave Nesbitt <nesbitt at cp10.es.xerox.com>
+netcheque 4008/udp # NetCheque accounting
+netcheque 4008/tcp # NetCheque accounting
+# B. Clifford Neuman <bcn at isi.edu>
+chimera-hwm 4009/udp # Chimera HWM
+chimera-hwm 4009/tcp # Chimera HWM
+# Ken Anderson <kanderso at kleber.ICS.UCI.EDU>
+samsung-unidex 4010/udp # Samsung Unidex
+samsung-unidex 4010/tcp # Samsung Unidex
+# Konstantin V. Vyaznikov <kv at ssm6000.samsung.ru>
+altserviceboot 4011/udp # Alternate Service Boot
+altserviceboot 4011/tcp # Alternate Service Boot
+# Eric Dittert <Eric_Dittert at ccm.jf.intel.com>
+pda-gate 4012/udp # PDA Gate
+pda-gate 4012/tcp # PDA Gate
+# Masakuni Okada <masakuni at jp.ibm.com>
+acl-manager 4013/udp # ACL Manager
+acl-manager 4013/tcp # ACL Manager
+# Toru Murai <murai at saint.nm.fujitsu.co.jp>
+taiclock 4014/udp # TAICLOCK
+taiclock 4014/tcp # TAICLOCK
+# Dan Bernstein <djb at koobera.math.uic.edu>
+talarian-mcast1 4015/udp # Talarian Mcast
+talarian-mcast1 4015/tcp # Talarian Mcast
+talarian-mcast2 4016/udp # Talarian Mcast
+talarian-mcast2 4016/tcp # Talarian Mcast
+talarian-mcast3 4017/udp # Talarian Mcast
+talarian-mcast3 4017/tcp # Talarian Mcast
+talarian-mcast4 4018/udp # Talarian Mcast
+talarian-mcast4 4018/tcp # Talarian Mcast
+talarian-mcast5 4019/udp # Talarian Mcast
+talarian-mcast5 4019/tcp # Talarian Mcast
+# Geoff Mendal <mendal at talarian.com>
+trap 4020/udp # TRAP Port
+trap 4020/tcp # TRAP Port
+# Jeffrey C. Byrd <admin at vspacegroup.com>
+nexus-portal 4021/udp # Nexus Portal
+nexus-portal 4021/tcp # Nexus Portal
+# Damian Tarnawsky <support at nexusconcepts.com>
+dnox 4022/udp # DNOX
+dnox 4022/tcp # DNOX
+# Leo Rathnayake <leo at perlnet.com>
+esnm-zoning 4023/udp # ESNM Zoning Port
+esnm-zoning 4023/tcp # ESNM Zoning Port
+# Yong Cai <ycai at emc.com>
+tnp1-port 4024/udp # TNP1 User Port
+tnp1-port 4024/tcp # TNP1 User Port
+# Tony Gibbs <tony.gibbs at europe.simoco.com>
+partimage 4025/udp # Partition Image Port
+partimage 4025/tcp # Partition Image Port
+# Franck Ladurelle <ladurelf at partimage.org>
+as-debug 4026/udp # Graphical Debug Server
+as-debug 4026/tcp # Graphical Debug Server
+# Steve Halverson <shalver at us.ibm.com>
+bxp 4027/udp # bitxpress
+bxp 4027/tcp # bitxpress
+# Morgan Doyle <morgan at mpt.ie>
+dtserver-port 4028/udp # DTServer Port
+dtserver-port 4028/tcp # DTServer Port
+# Stephen Aikins <stephen.aikins at embarcadero.com>
+ip-qsig 4029/udp # IP Q signaling protocol
+ip-qsig 4029/tcp # IP Q signaling protocol
+# Toru Tachibana <tatibana at exs.ts.fujitsu.co.jp>
+jdmn-port 4030/udp # Accell/JSP Daemon Port
+jdmn-port 4030/tcp # Accell/JSP Daemon Port
+# Art Grand <aig at unify.com>
+suucp 4031/udp # UUCP over SSL
+suucp 4031/tcp # UUCP over SSL
+# Harald Welte <laforge at gnumonks.org>
+vrts-auth-port 4032/udp # VERITAS Authorization Service
+vrts-auth-port 4032/tcp # VERITAS Authorization Service
+# Stefan Winkel <stefan at veritas.com>
+sanavigator 4033/udp # SANavigator Peer Port
+sanavigator 4033/tcp # SANavigator Peer Port
+# Robert J. Chansler <rchansler at SANavigator.com>
+ubxd 4034/udp # Ubiquinox Daemon
+ubxd 4034/tcp # Ubiquinox Daemon
+# Kit Smithers <ksmithers at argogroup.com>
+wap-push-http 4035/udp # WAP Push OTA-HTTP port
+wap-push-http 4035/tcp # WAP Push OTA-HTTP port
+wap-push-https 4036/udp # WAP Push OTA-HTTP secure
+wap-push-https 4036/tcp # WAP Push OTA-HTTP secure
+# Matthieu Lachance
+# <matthieu.lachance at openwave.com>
+# 4037-4039 Unassigned
+yo-main 4040/udp # Yo.net main service
+yo-main 4040/tcp # Yo.net main service
+# John Tintor <jt at yo.net>
+houston 4041/udp # Rocketeer-Houston
+houston 4041/tcp # Rocketeer-Houston
+# Johnny C. Norris II <jnorris at uiuc.edu>
+ldxp 4042/udp # LDXP
+ldxp 4042/tcp # LDXP
+# Craig Calef <craig at katmango.com>
+# 4043-4095 Unassigned
+bre 4096/udp # BRE (Bridge Relay Element)
+bre 4096/tcp # BRE (Bridge Relay Element)
+# Stephen Egbert <egbert at ra.timeplex.com>
+patrolview 4097/udp # Patrol View
+patrolview 4097/tcp # Patrol View
+# Vincent Chin <vincent_chin at bmc.com>
+drmsfsd 4098/udp # drmsfsd
+drmsfsd 4098/tcp # drmsfsd
+# Masao Iwai <iwai at kel.fujitsu.co.jp>
+dpcp 4099/udp # DPCP
+dpcp 4099/tcp # DPCP
+# John Croft <john.croft at calista.demon.co.uk>
+igo-incognito 4100/udp # IGo Incognito Data Port
+igo-incognito 4100/tcp # IGo Incognito Data Port
+# Paul Reddy <support at igo-incognito.com> February 2002
+# 4101-4110 Unassigned
+xgrid 4111/tcp # Xgrid
+xgrid 4111/udp # Xgrid
+jomamqmonitor 4114/udp # JomaMQMonitor
+jomamqmonitor 4114/tcp # JomaMQMonitor
+# Marcel Hofstetter <marcel.hofstetter at jomasoft.ch> January 2003
+# 4115-4131 Unassigned
+nuts_dem 4132/udp # NUTS Daemon
+nuts_dem 4132/tcp # NUTS Daemon
+nuts_bootp 4133/udp # NUTS Bootp Server
+nuts_bootp 4133/tcp # NUTS Bootp Server
+# Martin Freiss <freiss.pad at sni.>
+nifty-hmi 4134/udp # NIFTY-Serve HMI protocol
+nifty-hmi 4134/tcp # NIFTY-Serve HMI protocol
+# Ryuichi Suzuki <SCI00376 at niftyserve.or.jp>
+# 4135-4137 Unassigned
+nettest 4138/udp # nettest
+nettest 4138/tcp # nettest
+# David Borman <dab at windriver.com> March 2003
+# 4139-4140 Unassigned
+oirtgsvc 4141/udp # Workflow Server
+oirtgsvc 4141/tcp # Workflow Server
+oidocsvc 4142/udp # Document Server
+oidocsvc 4142/tcp # Document Server
+oidsr 4143/udp # Document Replication
+oidsr 4143/tcp # Document Replication
+# Norman Brie <norm_brie at sns.ca>
+########## Compuserve (unoffically) is using port 4144 #########
+# 4144 Unassigned
+vvr-control 4145/udp # VVR Control
+vvr-control 4145/tcp # VVR Control
+# Ming Xu <ming at veritas.com>
+# 4146-4153 Unassigned
+atlinks 4154/udp # atlinks device discovery
+atlinks 4154/tcp # atlinks device discovery
+# Scott Griepentrog <griepentrogs at atlinks.com> October 2002
+# 4155-4159 Unassigned
+jini-discovery 4160/udp # Jini Discovery
+jini-discovery 4160/tcp # Jini Discovery
+# Mark Hodapp <mark.hodapp at sun.com>
+# 4161-4198 Unassigned
+eims-admin 4199/udp # EIMS ADMIN
+eims-admin 4199/tcp # EIMS ADMIN
+# Glenn Anderson <glenn at qualcomm.co.nz>
+# Mitra <mitra at earth.path.net>
+corelccam 4300/udp # Corel CCam
+corelccam 4300/tcp # Corel CCam
+# Jason Aiken <jasona at corelcomputer.com>
+# 4301-4320 Unassigned
+rwhois 4321/udp # Remote Who Is
+rwhois 4321/tcp # Remote Who Is
+# Mark Kosters <markk at internic.net>
+unicall 4343/udp # UNICALL
+unicall 4343/tcp # UNICALL
+# James Powell <james at enghp.unidata.comp>
+vinainstall 4344/udp # VinaInstall
+vinainstall 4344/tcp # VinaInstall
+# Jay Slupesky <js at vina-tech.com>
+m4-network-as 4345/udp # Macro 4 Network AS
+m4-network-as 4345/tcp # Macro 4 Network AS
+# Paul Wren <Paul.Wren at macro4.com>
+elanlm 4346/udp # ELAN LM
+elanlm 4346/tcp # ELAN LM
+# Paul Ballew <ballew at projtech.com>
+lansurveyor 4347/udp # LAN Surveyor
+lansurveyor 4347/tcp # LAN Surveyor
+# Michael Swan <swan at neon.com>
+itose 4348/udp # ITOSE
+itose 4348/tcp # ITOSE
+# Michael Haeuptle <Michael_Haeuptle at hp.com>
+fsportmap 4349/udp # File System Port Map
+fsportmap 4349/tcp # File System Port Map
+# Ron Minnich <rminnich at sarnoff.com>
+net-device 4350/udp # Net Device
+net-device 4350/tcp # Net Device
+# Glenn Peterson <glennp at microsoft.com>
+plcy-net-svcs 4351/udp # PLCY Net Services
+plcy-net-svcs 4351/tcp # PLCY Net Services
+# J.J. Ekstrom
+# 4352 Unassigned
+f5-iquery 4353/udp # F5 iQuery
+f5-iquery 4353/tcp # F5 iQuery
+# Tom Kee <t.kee at f5.com>
+qsnet-trans 4354/udp # QSNet Transmitter
+qsnet-trans 4354/tcp # QSNet Transmitter
+qsnet-workst 4355/udp # QSNet Workstation
+qsnet-workst 4355/tcp # QSNet Workstation
+qsnet-assist 4356/udp # QSNet Assistant
+qsnet-assist 4356/tcp # QSNet Assistant
+qsnet-cond 4357/udp # QSNet Conductor
+qsnet-cond 4357/tcp # QSNet Conductor
+qsnet-nucl 4358/udp # QSNet Nucleus
+qsnet-nucl 4358/tcp # QSNet Nucleus
+# Neer Kleinman <neer at qsr.co.il>
+# 4359-4441 Unassigned
+saris 4442/udp # Saris
+saris 4442/tcp # Saris
+pharos 4443/udp # Pharos
+pharos 4443/tcp # Pharos
+# TeleConsult GmbH, 76275 Ettlingen, Germany
+# <teleconsult at t-online.de>
+krb524 4444/udp # KRB524
+krb524 4444/tcp # KRB524
+# B. Clifford Neuman <bcn at isi.edu>
+# PROBLEM krb524 assigned the port,
+# PROBLEM nv used it without an assignment
+nv-video 4444/udp # NV Video default
+nv-video 4444/tcp # NV Video default
+# Ron Frederick <frederick at parc.xerox.com>
+upnotifyp 4445/udp # UPNOTIFYP
+upnotifyp 4445/tcp # UPNOTIFYP
+# Mark Fox <markf at uplanet.com>
+n1-fwp 4446/udp # N1-FWP
+n1-fwp 4446/tcp # N1-FWP
+n1-rmgmt 4447/udp # N1-RMGMT
+n1-rmgmt 4447/tcp # N1-RMGMT
+# Lori Tassin <Ramsey at network-1.com>
+asc-slmd 4448/udp # ASC Licence Manager
+asc-slmd 4448/tcp # ASC Licence Manager
+# Casper Stoel <cbs at ascinc.com>
+privatewire 4449/udp # PrivateWire
+privatewire 4449/tcp # PrivateWire
+# Uri Resnitzky <uri at arx.com>
+camp 4450/udp # Camp
+camp 4450/tcp # Camp
+ctisystemmsg 4451/udp # CTI System Msg
+ctisystemmsg 4451/tcp # CTI System Msg
+ctiprogramload 4452/udp # CTI Program Load
+ctiprogramload 4452/tcp # CTI Program Load
+# Steven Cliff <sbcliff at controltechnology.com>
+nssalertmgr 4453/udp # NSS Alert Manager
+nssalertmgr 4453/tcp # NSS Alert Manager
+nssagentmgr 4454/udp # NSS Agent Manager
+nssagentmgr 4454/tcp # NSS Agent Manager
+# Jim Hill<jhill at symantec.com>
+prchat-user 4455/udp # PR Chat User
+prchat-user 4455/tcp # PR Chat User
+prchat-server 4456/udp # PR Chat Server
+prchat-server 4456/tcp # PR Chat Server
+prRegister 4457/udp # PR Register
+prRegister 4457/tcp # PR Register
+# Donny Gilor <dgilor at pop01.ny.us.ibm.net>
+# 4458-4499 Unassigned
+ipsec-msft 4500/udp # Microsoft IPsec NAT-T
+ipsec-msft 4500/tcp # Microsoft IPsec NAT-T
+# Christian Huitema <Huitema at microsoft.com> March 2002
+# 4501 De-registered (08 June 2001)
+# IANA <iana at iana.org>
+# 4502-4544 Unassigned
+worldscores 4545/udp # WorldScores
+worldscores 4545/tcp # WorldScores
+# Steve Davis <sdavis at optum-inc.com>
+sf-lm 4546/udp # SF License Manager (Sentinel)
+sf-lm 4546/tcp # SF License Manager (Sentinel)
+# Thomas Koell <info at sf.com>
+lanner-lm 4547/udp # Lanner License Manager
+lanner-lm 4547/tcp # Lanner License Manager
+# Les Enstone <lenstone at lanner.co.uk>
+# 4548-4554 Unassigned
+rsip 4555/udp # RSIP Port
+rsip 4555/tcp # RSIP Port
+# RFC 3103
+# 4556-4558 Unassigned
+hylafax 4559/udp # HylaFAX
+hylafax 4559/tcp # HylaFAX
+# Lee Howard <iana at hylafax.org> March 2002
+# 4560-4566 Unassigned
+tram 4567/udp # TRAM
+tram 4567/tcp # TRAM
+# Joe Wesley <joe.wesley at east.sun.com>
+bmc-reporting 4568/udp # BMC Reporting
+bmc-reporting 4568/tcp # BMC Reporting
+# Randall De Weerd <rdeweerd at bmc.com>
+# 4569-4599 Unassigned
+piranha1 4600/udp # Piranha1
+piranha1 4600/tcp # Piranha1
+piranha2 4601/udp # Piranha2
+piranha2 4601/tcp # Piranha2
+# Primark Corporation <joe.boone at primark.com>
+# 4602-4659 Unassigned
+smaclmgr 4660/udp # smaclmgr
+smaclmgr 4660/tcp # smaclmgr
+# Hiromi Taki <stg-togo at saint.nm.fujitsu.co.jp>
+kar2ouche 4661/udp # Kar2ouche Peer location service
+kar2ouche 4661/tcp # Kar2ouche Peer location service
+# Andy Krouwel <andy at kar2ouche.com>
+# 4662-4671 Unassigned
+rfa 4672/udp # remote file access server
+rfa 4672/tcp # remote file access server
+# 4673-4751 Unassigned
+snap 4752/udp # Simple Network Audio Protocol
+snap 4752/tcp # Simple Network Audio Protocol
+# Dameon Wagner <d.wagner at freemail.absa.co.za> February 2002
+# 4753-4799 Unassigned
+iims 4800/udp # Icona Instant Messenging System
+iims 4800/tcp # Icona Instant Messenging System
+iwec 4801/udp # Icona Web Embedded Chat
+iwec 4801/tcp # Icona Web Embedded Chat
+ilss 4802/udp # Icona License System Server
+ilss 4802/tcp # Icona License System Server
+# Paul Stephen Borlie <paul at icona.it>
+# 4803-4826 Unassigned
+htcp 4827/udp # HTCP
+htcp 4827/tcp # HTCP
+# Paul Vixie <paul at vix.com>
+# 4828-4836 Unassigned
+varadero-0 4837/udp # Varadero-0
+varadero-0 4837/tcp # Varadero-0
+varadero-1 4838/udp # Varadero-1
+varadero-1 4838/tcp # Varadero-1
+varadero-2 4839/udp # Varadero-2
+varadero-2 4839/tcp # Varadero-2
+# Carlos Arteaga <carteaga at abacoinc.com>
+# 4840-4847 Unassigned
+appserv-http 4848/udp # App Server - Admin HTTP
+appserv-http 4848/tcp # App Server - Admin HTTP
+appserv-https 4849/udp # App Server - Admin HTTPS
+appserv-https 4849/tcp # App Server - Admin HTTPS
+# Sreeram Duvvuru <sduv at sfbay.sun.com> April 2002
+# 4850-4867 Unassigned
+phrelay 4868/udp # Photon Relay
+phrelay 4868/tcp # Photon Relay
+phrelaydbg 4869/udp # Photon Relay Debug
+phrelaydbg 4869/tcp # Photon Relay Debug
+# Michael Hunter <mphunter at qnx.com>
+# 4870-4884 Unassigned
+abbs 4885/udp # ABBS
+abbs 4885/tcp # ABBS
+# Ryan Rubley <root at ark.dyn.ml.org>
+# 4886-4893 Unassigned
+lyskom 4894/udp # LysKOM Protocol A
+lyskom 4894/tcp # LysKOM Protocol A
+# Per Cederqvist <ceder at lysator.liu.se>
+# 4895-4898 Unassigned
+radmin-port 4899/udp # RAdmin Port
+radmin-port 4899/tcp # RAdmin Port
+# Dmitri Znosko <support at radmin.com> March 2003
+# 4900-4982 Unassigned
+att-intercom 4983/udp # AT&T Intercom
+att-intercom 4983/tcp # AT&T Intercom
+# Tony Hansen <intercom at maillennium.att.com>
+# 4984-4986 Unassigned
+smar-se-port1 4987/udp # SMAR Ethernet Port 1
+smar-se-port1 4987/tcp # SMAR Ethernet Port 1
+smar-se-port2 4988/udp # SMAR Ethernet Port 2
+smar-se-port2 4988/tcp # SMAR Ethernet Port 2
+# Delcio Prizon <dprizon at smar.com.br>
+parallel 4989/udp # Parallel for GAUSS (tm)
+parallel 4989/tcp # Parallel for GAUSS (tm)
+# Matthew Ford <Matthew.Ford at forward.com.au> March 2003
+# 4990-4999 Unassigned
+commplex-main 5000/udp #
+commplex-main 5000/tcp #
+commplex-link 5001/udp #
+commplex-link 5001/tcp #
+rfe 5002/udp # radio free ethernet
+rfe 5002/tcp # radio free ethernet
+fmpro-internal 5003/udp # FileMaker, Inc. - Proprietary name binding
+fmpro-internal 5003/tcp # FileMaker, Inc. - Proprietary transport
+# Clay Maeckel <clay_maeckel at filemaker.com>
+avt-profile-1 5004/udp # avt-profile-1
+avt-profile-1 5004/tcp # avt-profile-1
+avt-profile-2 5005/udp # avt-profile-2
+avt-profile-2 5005/tcp # avt-profile-2
+# Henning Schulzrinne <schulzrinne at fokus.gmd.de>
+wsm-server 5006/udp # wsm server
+wsm-server 5006/tcp # wsm server
+wsm-server-ssl 5007/udp # wsm server ssl
+wsm-server-ssl 5007/tcp # wsm server ssl
+# Adam Berk <aberk at empirix.com>
+synapsis-edge 5008/udp # Synapsis EDGE
+synapsis-edge 5008/tcp # Synapsis EDGE
+# Paul Schilling <PaulS at Synapsis.com>
+# 5009 Unassigned
+telelpathstart 5010/udp # TelepathStart
+telelpathstart 5010/tcp # TelepathStart
+telelpathattack 5011/udp # TelepathAttack
+telelpathattack 5011/tcp # TelepathAttack
+# Helmuth Breitenfellner <hbreitenf at vnet.imb.com>
+# 5012-5019 Unassigned
+zenginkyo-1 5020/udp # zenginkyo-1
+zenginkyo-1 5020/tcp # zenginkyo-1
+zenginkyo-2 5021/udp # zenginkyo-2
+zenginkyo-2 5021/tcp # zenginkyo-2
+# Masashi Suzaki <susakim at noa.nttdata.jp>
+mice 5022/udp # mice server
+mice 5022/tcp # mice server
+# Alan Clifford <alan at clifford.ac>
+htuilsrv 5023/udp # Htuil Server for PLD2
+htuilsrv 5023/tcp # Htuil Server for PLD2
+# Dennis Reinhardt <DennisR at dair.com>
+scpi-telnet 5024/udp # SCPI-TELNET
+scpi-telnet 5024/tcp # SCPI-TELNET
+scpi-raw 5025/udp # SCPI-RAW
+scpi-raw 5025/tcp # SCPI-RAW
+# Ryan Columbus <IANA_Contact at Agilent.com> October 2002
+# 5026-5041 Unassigned
+asnaacceler8db 5042/udp # asnaacceler8db
+asnaacceler8db 5042/tcp # asnaacceler8db
+# Walter Goodwin <wpgoodwin at asna.com>
+# 5043-5049 Unassigned
+mmcc 5050/udp # multimedia conference control tool
+mmcc 5050/tcp # multimedia conference control tool
+# Steve Casner <Casner at isi.edu>
+ita-agent 5051/udp # ITA Agent
+ita-agent 5051/tcp # ITA Agent
+ita-manager 5052/udp # ITA Manager
+ita-manager 5052/tcp # ITA Manager
+# Don Merrell <donmer at axent.com>
+# 5053-5054 Unassigned
+unot 5055/udp # UNOT
+unot 5055/tcp # UNOT
+# Gordon Mohr <gmohr at cmgisolutions.com>
+intecom-ps1 5056/udp # Intecom PS 1
+intecom-ps1 5056/tcp # Intecom PS 1
+intecom-ps2 5057/udp # Intecom PS 2
+intecom-ps2 5057/tcp # Intecom PS 2
+# David Meermans <dmeermans at intecom.com>
+# 5058-5059 Unassigned
+sip 5060/udp # SIP
+sip 5060/tcp # SIP
+sip-tls 5061/udp # SIP-TLS
+sip-tls 5061/tcp # SIP-TLS
+# Henning Schulzrinne <hgs at cs.columbia.edu>
+# 5062-5063 Unassigned
+ca-1 5064/udp # Channel Access 1
+ca-1 5064/tcp # Channel Access 1
+ca-2 5065/udp # Channel Access 2
+ca-2 5065/tcp # Channel Access 2
+# Jeffrey Hill <johill at lanl.gov> August 2002
+# 5066-5067 Unassigned
+stanag-5066 5066/udp # STANAG-5066-SUBNET-INTF
+stanag-5066 5066/tcp # STANAG-5066-SUBNET-INTF
+# Donald G. Kallgren
+# <Donald.Kallgren at nc3a.nato.int>
+# 5062-5068 Unassigned
+i-net-2000-npr 5069/udp # I/Net 2000-NPR
+i-net-2000-npr 5069/tcp # I/Net 2000-NPR
+# Kenny Garrison <Kenny_Garrison at csicontrols.com>
+# 5070 Unassigned
+powerschool 5071/udp # PowerSchool
+powerschool 5071/tcp # PowerSchool
+# Greg Porter <gporter at powerschool.com>
+# 5072-5080 Unassigned
+sdl-ets 5081/udp # SDL - Ent Trans Server
+sdl-ets 5081/tcp # SDL - Ent Trans Server
+# Marc Morin <mmorin at sdlintl.com> April 2002
+# 5082-5092 Unassigned
+sentinel-lm 5093/udp # Sentinel LM
+sentinel-lm 5093/tcp # Sentinel LM
+# Derick Snyder <dsnyder at rainbow.com>
+# 5094-5098 Unassigned
+sentlm-srv2srv 5099/udp # SentLM Srv2Srv
+sentlm-srv2srv 5099/tcp # SentLM Srv2Srv
+# Derick Snyder <dsnyder at rainbow.com>
+# 5100 Unassigned
+talarian-udp 5101/udp # Talarian_UDP
+talarian-tcp 5101/tcp # Talarian_TCP
+# Leo Martins <leo at talarian.com>
+# 5102-5136 Unassigned
+ctsd 5137/udp # MyCTS server port
+ctsd 5137/tcp # MyCTS server port
+# Jilles Oldenbeuving <ojilles at hotmail.com> June 2002
+# 5138-5144 Unassigned
+rmonitor_secure 5145/udp # RMONITOR SECURE
+rmonitor_secure 5145/tcp # RMONITOR SECURE
+# Kory Hamzeh <kory at ascend.com>
+# 5146-5149 Unassigned
+atmp 5150/udp # Ascend Tunnel Management Protocol
+atmp 5150/tcp # Ascend Tunnel Management Protocol
+# Kory Hamzeh <kory at ascend.com>
+esri_sde 5151/udp # ESRI SDE Remote Start
+esri_sde 5151/tcp # ESRI SDE Instance
+sde-discovery 5152/udp # ESRI SDE Instance Discovery
+sde-discovery 5152/tcp # ESRI SDE Instance Discovery
+# Peter Aronson <paronson at esri.com>
+# 5153-5164 Unassigned
+ife_icorp 5165/udp # ife_1corp
+ife_icorp 5165/tcp # ife_1corp
+# Paul Annala <paa at bull.se>
+# 5166-5189 Unassigned
+aol 5190/udp # America-Online
+aol 5190/tcp # America-Online
+# Marty Lyons <marty at aol.com>
+aol-1 5191/udp # AmericaOnline1
+aol-1 5191/tcp # AmericaOnline1
+aol-2 5192/udp # AmericaOnline2
+aol-2 5192/tcp # AmericaOnline2
+aol-3 5193/udp # AmericaOnline3
+aol-3 5193/tcp # AmericaOnline3
+# Bruce Mackey <BAMackey at aol.com>
+# 5194-5199 Unassigned
+targus-getdata 5200/udp # TARGUS GetData
+targus-getdata 5200/tcp # TARGUS GetData
+targus-getdata1 5201/udp # TARGUS GetData 1
+targus-getdata1 5201/tcp # TARGUS GetData 1
+targus-getdata2 5202/udp # TARGUS GetData 2
+targus-getdata2 5202/tcp # TARGUS GetData 2
+targus-getdata3 5203/udp # TARGUS GetData 3
+targus-getdata3 5203/tcp # TARGUS GetData 3
+# John Keaveney <johnkeaveney at targusinfo.com>
+# 5204-5221 Unassigned
+jabber-client 5222/udp # Jabber Client Connection
+jabber-client 5222/tcp # Jabber Client Connection
+# David Waite <mass at akuma.org> February 2002
+# 5223-5224 Unassigned
+hp-server 5225/udp # HP Server
+hp-server 5225/tcp # HP Server
+hp-status 5226/udp # HP Status
+hp-status 5226/tcp # HP Status
+# Brett Green <Brett_Green at HP.Com>
+# 5227-5235 Unassigned
+padl2sim 5236/udp #
+padl2sim 5236/tcp #
+# 5237-5249 Unassigned
+igateway 5250/udp # iGateway
+igateway 5250/tcp # iGateway
+# Greg Bodine <gregory.bodine at ca.com> February 2002
+# 5251-5263 Unassigned
+3com-njack-1 5264/udp # 3Com Network Jack Port 1
+3com-njack-1 5264/tcp # 3Com Network Jack Port 1
+3com-njack-2 5265/udp # 3Com Network Jack Port 2
+3com-njack-2 5265/tcp # 3Com Network Jack Port 2
+# Abhay Rajaram <Abhay_Rajaram at 3Com.com> March 2003
+# 5266-5268 Unassigned
+jabber-server 5269/udp # Jabber Server Connection
+jabber-server 5269/tcp # Jabber Server Connection
+# David Waite <mass at akuma.org> February 2002
+# 5270-5271 Unassigned
+pk 5272/udp # PK
+pk 5272/tcp # PK
+# Patrick Kara <Patrick at EBA.NET>
+# 5273-5281 Unassigned
+transmit-port 5282/udp # Marimba Transmitter Port
+transmit-port 5282/tcp # Marimba Transmitter Port
+# Johan Eriksson <johan at marimba.com> April 2002
+# 5283-5299 Unassigned
+hacl-hb 5300/udp # # HA cluster heartbeat
+hacl-hb 5300/tcp # # HA cluster heartbeat
+hacl-gs 5301/udp # # HA cluster general services
+hacl-gs 5301/tcp # # HA cluster general services
+hacl-cfg 5302/udp # # HA cluster configuration
+hacl-cfg 5302/tcp # # HA cluster configuration
+hacl-probe 5303/udp # # HA cluster probing
+hacl-probe 5303/tcp # # HA cluster probing
+hacl-local 5304/udp #
+hacl-local 5304/tcp # # HA Cluster Commands
+hacl-test 5305/udp #
+hacl-test 5305/tcp # # HA Cluster Test
+# Eric Soderberg <seric at hposl102.cup.hp>
+# Edward Yim <eyim at hpmfas4.cup.hp.com>
+sun-mc-grp 5306/udp # Sun MC Group
+sun-mc-grp 5306/tcp # Sun MC Group
+# Michael DeMoney <demoney at eng.sun.com>
+sco-aip 5307/udp # SCO AIP
+sco-aip 5307/tcp # SCO AIP
+# Barrie Cooper <barrie at sco.com>
+cfengine 5308/udp # CFengine
+cfengine 5308/tcp # CFengine
+# Mark Burgess <mark.burgess at iu.hioslo.no>
+jprinter 5309/udp # J Printer
+jprinter 5309/tcp # J Printer
+# Ken Blackwell <kenb at bristol.com>
+outlaws 5310/udp # Outlaws
+outlaws 5310/tcp # Outlaws
+# Richard Fife <richardf at lucasarts.com>
+tmlogin 5311/udp # TM Login
+tmlogin 5311/tcp # TM Login
+# Eric Sharakan <eric.sharakan at east.sun.com>
+# 5312-5313 Unassigned
+opalis-rbt-ipc 5314/udp # opalis-rbt-ipc
+opalis-rbt-ipc 5314/tcp # opalis-rbt-ipc
+# Laurent Domenech <ldomenech at opalis.com>
+hacl-poll 5315/udp # HA Cluster UDP Polling
+hacl-poll 5315/tcp # HA Cluster UDP Polling
+# Hoa Nguyen <hoan at cup.hp.com>
+# 5316-5352 Unassigned
+mdns 5353/udp # Multicast DNS
+mdns 5353/tcp # Multicast DNS
+# Stuart Cheshire <cheshire at multicastdns.org>
+# 5354-5399 Unassigned
+excerpt 5400/udp # Excerpt Search
+excerpt 5400/tcp # Excerpt Search
+excerpts 5401/udp # Excerpt Search Secure
+excerpts 5401/tcp # Excerpt Search Secure
+# John Hinsdale <hin at alma.com>
+mftp 5402/udp # MFTP
+mftp 5402/tcp # MFTP
+# Alan Rosenberg <arosen at starburstcom.com>
+hpoms-ci-lstn 5403/udp # HPOMS-CI-LSTN
+hpoms-ci-lstn 5403/tcp # HPOMS-CI-LSTN
+hpoms-dps-lstn 5404/udp # HPOMS-DPS-LSTN
+hpoms-dps-lstn 5404/tcp # HPOMS-DPS-LSTN
+# Harold Froehling <hrf at cup.hp.com>
+netsupport 5405/udp # NetSupport
+netsupport 5405/tcp # NetSupport
+# Paul Sanders <pe77 at dial.pipex.com>
+systemics-sox 5406/udp # Systemics Sox
+systemics-sox 5406/tcp # Systemics Sox
+# Gary Howland <gary at systemics.com>
+foresyte-clear 5407/udp # Foresyte-Clear
+foresyte-clear 5407/tcp # Foresyte-Clear
+foresyte-sec 5408/udp # Foresyte-Sec
+foresyte-sec 5408/tcp # Foresyte-Sec
+# Jorge Aldana <operator at foresyte.com>
+salient-dtasrv 5409/udp # Salient Data Server
+salient-dtasrv 5409/tcp # Salient Data Server
+salient-usrmgr 5410/udp # Salient User Manager
+salient-usrmgr 5410/tcp # Salient User Manager
+# Richard Farnham <rfarnham at salient.com>
+actnet 5411/udp # ActNet
+actnet 5411/tcp # ActNet
+# Simon Robillard <RobillardS at actresearch.com>
+continuus 5412/udp # Continuus
+continuus 5412/tcp # Continuus
+# Steven Holtsberg <steveh at continuus.com>
+wwiotalk 5413/udp # WWIOTALK
+wwiotalk 5413/tcp # WWIOTALK
+# Roger Knobbe <RogerK at Wonderware.COM>
+statusd 5414/udp # StatusD
+statusd 5414/tcp # StatusD
+# Stephen Misel <steve at satelnet.org>
+ns-server 5415/udp # NS Server
+ns-server 5415/tcp # NS Server
+# Jeffrey Chiao <chiaoj at netsoft.com>
+sns-gateway 5416/udp # SNS Gateway
+sns-gateway 5416/tcp # SNS Gateway
+sns-agent 5417/udp # SNS Agent
+sns-agent 5417/tcp # SNS Agent
+# Mary Holstage <holstege at firstfloor.com>
+mcntp 5418/udp # MCNTP
+mcntp 5418/tcp # MCNTP
+# Heiko Rupp <hwr at pilhuhn.de>
+dj-ice 5419/udp # DJ-ICE
+dj-ice 5419/tcp # DJ-ICE
+# Don Tyson <don.tyson at cor.dowjones.com>
+cylink-c 5420/udp # Cylink-C
+cylink-c 5420/tcp # Cylink-C
+# John Jobe <jjobe at cylink.com>
+netsupport2 5421/udp # Net Support 2
+netsupport2 5421/tcp # Net Support 2
+# Paul Sanders <p.sanders at dial.pipex.com>
+salient-mux 5422/udp # Salient MUX
+salient-mux 5422/tcp # Salient MUX
+# Richard Farnham <rfarnham at salient.com>
+virtualuser 5423/udp # VIRTUALUSER
+virtualuser 5423/tcp # VIRTUALUSER
+# Chad Williams <chad at apple.com>
+# 5424-5425 Unassigned
+devbasic 5426/udp # DEVBASIC
+devbasic 5426/tcp # DEVBASIC
+# Curtis Smith <curtis.smith at vsin.com>
+sco-peer-tta 5427/udp # SCO-PEER-TTA
+sco-peer-tta 5427/tcp # SCO-PEER-TTA
+# Andrew Shire <sndrewsh at sco.com>
+telaconsole 5428/udp # TELACONSOLE
+telaconsole 5428/tcp # TELACONSOLE
+# Joseph M. Newcomer <newcomer at flounder.com>
+base 5429/udp # Billing and Accounting System Exchange
+base 5429/tcp # Billing and Accounting System Exchange
+# Odo Maletzki <Odo.Maletzki at ioag.de>
+radec-corp 5430/udp # RADEC CORP
+radec-corp 5430/tcp # RADEC CORP
+# David Chell <david at softlife.co.nz>
+park-agent 5431/udp # PARK AGENT
+park-agent 5431/tcp # PARK AGENT
+# John Clifford <John.Clifford at veritas.com>
+postgresql 5432/udp # PostgreSQL Database
+postgresql 5432/tcp # PostgreSQL Database
+# Tom Lane <tgl at sss.pgh.pa.us>
+# 5433-5434 Unassigned
+dttl 5435/udp # Data Tunneling Transceiver Linking (DTTL)
+dttl 5435/tcp # Data Tunneling Transceiver Linking (DTTL)
+# Richard Olsen <Olsen7 at liquefaction.com>
+# 5436-5453 Unassigned
+apc-5454 5454/udp # APC 5454
+apc-5454 5454/tcp # APC 5454
+apc-5455 5455/udp # APC 5455
+apc-5455 5455/tcp # APC 5455
+apc-5456 5456/udp # APC 5456
+apc-5456 5456/tcp # APC 5456
+# American Power Conversion <ports at apcc.com>
+# 5457-5460 Unassigned
+silkmeter 5461/udp # SILKMETER
+silkmeter 5461/tcp # SILKMETER
+# Alexander Kotopoulis <alexk at segue.com>
+ttl-publisher 5462/udp # TTL Publisher
+ttl-publisher 5462/tcp # TTL Publisher
+# Peter Jacobs <pjacobs at tullib.com>
+ttlpriceproxy 5463/udp # TTL Price Proxy
+ttlpriceproxy 5463/tcp # TTL Price Proxy
+# Peter Jacobs <pjacobs at tullib.com>
+# 5464 Unassigned
+netops-broker 5465/udp # NETOPS-BROKER
+netops-broker 5465/tcp # NETOPS-BROKER
+# John R. Deuel <kink at netops.com>
+# 5466-5499 Unassigned
+fcp-addr-srvr1 5500/udp # fcp-addr-srvr1
+fcp-addr-srvr1 5500/tcp # fcp-addr-srvr1
+fcp-addr-srvr2 5501/udp # fcp-addr-srvr2
+fcp-addr-srvr2 5501/tcp # fcp-addr-srvr2
+fcp-srvr-inst1 5502/udp # fcp-srvr-inst1
+fcp-srvr-inst1 5502/tcp # fcp-srvr-inst1
+fcp-srvr-inst2 5503/udp # fcp-srvr-inst2
+fcp-srvr-inst2 5503/tcp # fcp-srvr-inst2
+fcp-cics-gw1 5504/udp # fcp-cics-gw1
+fcp-cics-gw1 5504/tcp # fcp-cics-gw1
+# Mark Zeiss <mark.r.zeiss at ac.com>
+# 5505-5552 Unassigned
+sgi-eventmond 5553/udp # SGI Eventmond Port
+sgi-eventmond 5553/tcp # SGI Eventmond Port
+# Andrei Vilkotski <andreiv at sgi.com> June 2003
+sgi-esphttp 5554/udp # SGI ESP HTTP
+sgi-esphttp 5554/tcp # SGI ESP HTTP
+# Vladimir Legalov <legalov at sgi.com>
+############Port 5555 also used by HP Omniback#####################
+personal-agent 5555/udp # Personal Agent
+personal-agent 5555/tcp # Personal Agent
+# Jackie Wu <jackiew at infoseek.com>
+###################################################################
+# 5556-5565 Unassigned
+udpplus 5566/udp # UDPPlus
+udpplus 5566/tcp # UDPPlus
+# Cody Gibson <cody.gibson at intermec.com>
+# 5567-5598 Unassigned
+esinstall 5599/udp # Enterprise Security Remote Install
+esinstall 5599/tcp # Enterprise Security Remote Install
+esmmanager 5600/udp # Enterprise Security Manager
+esmmanager 5600/tcp # Enterprise Security Manager
+esmagent 5601/udp # Enterprise Security Agent
+esmagent 5601/tcp # Enterprise Security Agent
+# Kimberly Gibbs <kimgib at CCGATE-UT.AXENT.COM>
+a1-msc 5602/udp # A1-MSC
+a1-msc 5602/tcp # A1-MSC
+a1-bs 5603/udp # A1-BS
+a1-bs 5603/tcp # A1-BS
+a3-sdunode 5604/udp # A3-SDUNode
+a3-sdunode 5604/tcp # A3-SDUNode
+a4-sdunode 5605/udp # A4-SDUNode
+a4-sdunode 5605/tcp # A4-SDUNode
+# Mike Dolan <MDolan at ihcmail.ih.lucent.com>
+# 5606-5630 Unassigned
+pcanywheredata 5631/udp # pcANYWHEREdata
+pcanywheredata 5631/tcp # pcANYWHEREdata
+pcanywherestat 5632/udp # pcANYWHEREstat
+pcanywherestat 5632/tcp # pcANYWHEREstat
+# Jon Rosarky <JRosarky at symantec.com>
+# 5633-5672 Unassigned
+jms 5673/udp # JACL Message Server
+jms 5673/tcp # JACL Message Server
+# Stuart Allen <stuart at jacl.animats.net> February 2002
+hyperscsi-port 5674/udp # HyperSCSI Port
+hyperscsi-port 5674/tcp # HyperSCSI Port
+# Data Storage Institute, Singapore
+# <Patrick at dsi.nus.edu.sg> February 2002
+v5ua 5675/udp # V5UA application port
+v5ua 5675/tcp # V5UA application port
+# Sanjay Rao <rsanjay at nortelnetworks.com> February 2002
+raadmin 5676/udp # RA Administration
+raadmin 5676/tcp # RA Administration
+# Sergei Zjaikin <serge at previo.ee> February 2002
+questdb2-lnchr 5677/udp # Quest Central DB2 Launchr
+questdb2-lnchr 5677/tcp # Quest Central DB2 Launchr
+# Robert M. Mackowiak <rmackowiak at quest.com> February 2002
+rrac 5678/udp # Remote Replication Agent Connection
+rrac 5678/tcp # Remote Replication Agent Connection
+dccm 5679/udp # Direct Cable Connect Manager
+dccm 5679/tcp # Direct Cable Connect Manager
+# Mark Miller <mmiller at MICROSOFT.com>
+# 5680-5687 Unassigned
+ggz 5688/udp # GGZ Gaming Zone
+ggz 5688/tcp # GGZ Gaming Zone
+# Josef Spillner <js177634 at inf.tu-dresden.de> January 2003
+# 5689-5712 Unassigned
+proshareaudio 5713/udp # proshare conf audio
+proshareaudio 5713/tcp # proshare conf audio
+prosharevideo 5714/udp # proshare conf video
+prosharevideo 5714/tcp # proshare conf video
+prosharedata 5715/udp # proshare conf data
+prosharedata 5715/tcp # proshare conf data
+prosharerequest 5716/udp # proshare conf request
+prosharerequest 5716/tcp # proshare conf request
+prosharenotify 5717/udp # proshare conf notify
+prosharenotify 5717/tcp # proshare conf notify
+# <gunner at ibeam.intel.com>
+# 5718-5719 Unassigned
+ms-licensing 5720/udp # MS-Licensing
+ms-licensing 5720/tcp # MS-Licensing
+# Thomas Lindeman <tlinde at microsoft.com> November 2002
+# 5721-5728 Unassigned
+openmail 5729/udp # Openmail User Agent Layer
+openmail 5729/tcp # Openmail User Agent Layer
+# OpenMail Encyclopedia <opencyc at hpopd.pwd.hp.com>
+# Don Loughry <DON_LOUGHRY at hp-cupertino-om4.om.hp.com>
+unieng 5730/udp # Steltor's calendar access
+unieng 5730/tcp # Steltor's calendar access
+# Bernard Desruisseaux <bernard at steltor.com>
+# 5731-5740 Unassigned
+ida-discover1 5741/udp # IDA Discover Port 1
+ida-discover1 5741/tcp # IDA Discover Port 1
+ida-discover2 5742/udp # IDA Discover Port 2
+ida-discover2 5742/tcp # IDA Discover Port 2
+# MPITech Support <morten.christensen at I-DATA.COM>
+# 5743-5744 Unassigned
+fcopy-server 5745/udp # fcopy-server
+fcopy-server 5745/tcp # fcopy-server
+fcopys-server 5746/udp # fcopys-server
+fcopys-server 5746/tcp # fcopys-server
+# Moshe Leibovitch <moshe at softlinkusa.com
+# 5747-5754 Unassigned
+openmailg 5755/udp # OpenMail Desk Gateway server
+openmailg 5755/tcp # OpenMail Desk Gateway server
+x500ms 5757/udp # OpenMail X.500 Directory Server
+x500ms 5757/tcp # OpenMail X.500 Directory Server
+openmailns 5766/udp # OpenMail NewMail Server
+openmailns 5766/tcp # OpenMail NewMail Server
+s-openmail 5767/udp # OpenMail Suer Agent Layer (Secure)
+s-openmail 5767/tcp # OpenMail Suer Agent Layer (Secure)
+openmailpxy 5768/udp # OpenMail CMTS Server
+openmailpxy 5768/tcp # OpenMail CMTS Server
+# OpenMail Encyclopedia >opencyc at hpopd.pwd.hp.com>
+# Don Loughry <DON_LOUGHRY at hp-cupertino-om4.om.hp.com>
+# 5769-5770 Unassigned
+netagent 5771/udp # NetAgent
+netagent 5771/tcp # NetAgent
+# Bradley Birnbaum <bradley.birnbaum at eshare.com>
+# 5772-5812 Unassigned
+icmpd 5813/udp # ICMPD
+icmpd 5813/tcp # ICMPD
+# Shane O'Donnell <shane at opennms.org>
+# 5814-5858 Unassigned
+wherehoo 5859/udp # WHEREHOO
+wherehoo 5859/tcp # WHEREHOO
+# Jim Youll <jim at media.mit.edu>
+# 5860-5967 Unassigned
+mppolicy-v5 5968/udp # mppolicy-v5
+mppolicy-v5 5968/tcp # mppolicy-v5
+mppolicy-mgr 5969/udp # mppolicy-mgr
+mppolicy-mgr 5969/tcp # mppolicy-mgr
+# Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+# 5970-5986 Unassigned
+wbem-rmi 5987/udp # WBEM RMI
+wbem-rmi 5987/tcp # WBEM RMI
+wbem-http 5988/udp # WBEM HTTP
+wbem-http 5988/tcp # WBEM HTTP
+# Jim Davis <james.d.davis at sun.com>
+wbem-https 5989/udp # WBEM HTTPS
+wbem-https 5989/tcp # WBEM HTTPS
+# Jim Davis <james.d.davis at east.sun.com>
+# 5990 Unassigned (Removed 2003-02-26)
+nuxsl 5991/udp # NUXSL
+nuxsl 5991/tcp # NUXSL
+# Kai Kretschmann <K.Kretschmann at security-gui.de> March 2002
+# 5992-5998 Unassigned
+cvsup 5999/udp # CVSup
+cvsup 5999/tcp # CVSup
+# Randall Atkinson <rja at inet.org>
+# Stephen Gildea <gildea at lcs.mit.edu>
+ndl-ahp-svc 6064/udp # NDL-AHP-SVC
+ndl-ahp-svc 6064/tcp # NDL-AHP-SVC
+# John Richmond <john at ndl.co.uk>
+winpharaoh 6065/udp # WinPharaoh
+winpharaoh 6065/tcp # WinPharaoh
+# Basil Lee <basil.lee at gnnettest.com>
+ewctsp 6066/udp # EWCTSP
+ewctsp 6066/tcp # EWCTSP
+# Mark Bailon <mark.bailon at ericsson.com>
+srb 6067/udp # SRB
+srb 6067/tcp # SRB
+# Heinz Naef <heinz.naef at nexos.com>
+gsmp 6068/udp # GSMP
+gsmp 6068/tcp # GSMP
+# Avri Doria <avri.doria at nokia.com>
+trip 6069/udp # TRIP
+trip 6069/tcp # TRIP
+# Hussein F. Salama <hsalama at cisco.com>
+messageasap 6070/udp # Messageasap
+messageasap 6070/tcp # Messageasap
+# Murray Freeman <murray at officedomain.com>
+ssdtp 6071/udp # SSDTP
+ssdtp 6071/tcp # SSDTP
+# Michael Shearson <mikes at softsys-inc.com>
+diagnose-proc 6072/udp # DIAGNOSE-PROC
+diagnose-proc 6072/tcp # DIAGNOSE-PROC
+# Allan Miller <amiller at handsfreenetworks.com>
+directplay8 6073/udp # DirectPlay8
+directplay8 6073/tcp # DirectPlay8
+# John Kane <johnkan at microsoft.com>
+# 6074-6084 Unassigned
+konspire2b 6085/udp # konspire2b p2p network
+konspire2b 6085/tcp # konspire2b p2p network
+# Jason Rohrer <rohrer at cse.ucsc.edu> October 2002
+# 6086-6099 Unassigned
+synchronet-db 6100/udp # SynchroNet-db
+synchronet-db 6100/tcp # SynchroNet-db
+synchronet-rtc 6101/udp # SynchroNet-rtc
+synchronet-rtc 6101/tcp # SynchroNet-rtc
+synchronet-upd 6102/udp # SynchroNet-upd
+synchronet-upd 6102/tcp # SynchroNet-upd
+# Arne Haugland <Arne.Haugland at parasoldev.com>
+rets 6103/udp # RETS
+rets 6103/tcp # RETS
+# Bruce Toback <btoback at optc.com>
+dbdb 6104/udp # DBDB
+dbdb 6104/tcp # DBDB
+# Aaron Brick <aa at lithic.org>
+primaserver 6105/udp # Prima Server
+primaserver 6105/tcp # Prima Server
+mpsserver 6106/udp # MPS Server
+mpsserver 6106/tcp # MPS Server
+# Prima Designs Systems Ltd. <info at prima.com.hk>
+etc-control 6107/udp # ETC Control
+etc-control 6107/tcp # ETC Control
+# Steve Polishinski <spolishinski at etcconnect.com>
+sercomm-scadmin 6108/udp # Sercomm-SCAdmin
+sercomm-scadmin 6108/tcp # Sercomm-SCAdmin
+# Melinda Tsao <melinda_tsao at mail.sercomm.com.tw>
+globecast-id 6109/udp # GLOBECAST-ID
+globecast-id 6109/tcp # GLOBECAST-ID
+# Piers Scannell <piers at globecastne.com>
+softcm 6110/udp # HP SoftBench CM
+softcm 6110/tcp # HP SoftBench CM
+spc 6111/udp # HP SoftBench Sub-Process Control
+spc 6111/tcp # HP SoftBench Sub-Process Control
+# Scott A. Kramer <sk at tleilaxu.sde.hp.com>
+dtspcd 6112/udp # dtspcd
+dtspcd 6112/tcp # dtspcd
+# Doug Royer <Doug at Royer.com>
+# 6113-6122 Unassigned
+backup-express 6123/udp # Backup Express
+backup-express 6123/tcp # Backup Express
+# Chi Shih Chang <cchang at syncsort.com>
+# 6124-6140 Unassigned
+meta-corp 6141/udp # Meta Corporation License Manager
+meta-corp 6141/tcp # Meta Corporation License Manager
+# Osamu Masuda <--none--->
+aspentec-lm 6142/udp # Aspen Technology License Manager
+aspentec-lm 6142/tcp # Aspen Technology License Manager
+# Kevin Massey <massey at aspentec.com>
+watershed-lm 6143/udp # Watershed License Manager
+watershed-lm 6143/tcp # Watershed License Manager
+# David Ferrero <david at zion.com>
+statsci1-lm 6144/udp # StatSci License Manager - 1
+statsci1-lm 6144/tcp # StatSci License Manager - 1
+statsci2-lm 6145/udp # StatSci License Manager - 2
+statsci2-lm 6145/tcp # StatSci License Manager - 2
+# Scott Blachowicz <scott at statsci.com>
+lonewolf-lm 6146/udp # Lone Wolf Systems License Manager
+lonewolf-lm 6146/tcp # Lone Wolf Systems License Manager
+# Dan Klein <dvk at lonewolf.com>
+montage-lm 6147/udp # Montage License Manager
+montage-lm 6147/tcp # Montage License Manager
+# Michael Ubell <michael at montage.com>
+ricardo-lm 6148/udp # Ricardo North America License Manager
+ricardo-lm 6148/tcp # Ricardo North America License Manager
+# M Flemming <mflemming at aol.com>
+tal-pod 6149/udp # tal-pod
+tal-pod 6149/tcp # tal-pod
+# Steven Loomis <srl at taligent.com>
+# 6150-6252 Unassigned
+crip 6253/udp # CRIP
+crip 6253/tcp # CRIP
+# Mike Rodbell <mrodbell at ciena.com>
+# 6254-6299 Unassigned
+bmc-grx 6300/udp # BMC GRX
+bmc-grx 6300/tcp # BMC GRX
+# Ed Penak <ed_penak at bmc.com>
+# 6301-6320 Unassigned
+emp-server1 6321/udp # Empress Software Connectivity Server 1
+emp-server1 6321/tcp # Empress Software Connectivity Server 1
+emp-server2 6322/udp # Empress Software Connectivity Server 2
+emp-server2 6322/tcp # Empress Software Connectivity Server 2
+# Srdjan Holovac <srdjan at empress.com>
+# 6323-6342 Unassigned
+sflow 6343/udp # sFlow traffic monitoring
+sflow 6343/tcp # sFlow traffic monitoring
+# Peter Phaal <peter.phaal at inmon.com> June 2003
+# 6344-6345 Unassigned
+gnutella-svc 6346/udp # gnutella-svc
+gnutella-svc 6346/tcp # gnutella-svc
+gnutella-rtr 6347/udp # gnutella-rtr
+gnutella-rtr 6347/tcp # gnutella-rtr
+# Serguei Osokine <osokin at paragraph.com>
+# 6348-6381 Unassigned
+metatude-mds 6382/udp # Metatude Dialogue Server
+metatude-mds 6382/tcp # Metatude Dialogue Server
+# Menno Zweistra <m.zweistra at metatude.com>
+# 6383-6388 Unassigned
+clariion-evr01 6389/udp # clariion-evr01
+clariion-evr01 6389/tcp # clariion-evr01
+# Dave DesRoches <ddesroches at clariion.com>
+# 6390-6399 Unassigned
+# The following blocks are in use by Seagate Software 6400-6410 #
+# The previous ports are in use by Seagate Software 6400-6410 #
+# Contact for these ports is Wade Richards <Wade.Richards at Seagatesoftware.com>
+# 6411-6454 Unassigned
+skip-cert-recv 6455/tcp # SKIP Certificate Receive
+skip-cert-send 6456/tcp # SKIP Certificate Send
+# Tom Markson <markson at osmosys.incog.com>
+# 6457-6470 Unassigned
+lvision-lm 6471/udp # LVision License Manager
+lvision-lm 6471/tcp # LVision License Manager
+# Brian McKinnon <bmk at lvision.com>
+# 6472-6499 Unassigned
+boks 6500/udp # BoKS Master
+boks 6500/tcp # BoKS Master
+boks_servc 6501/udp # BoKS Servc
+boks_servc 6501/tcp # BoKS Servc
+boks_servm 6502/udp # BoKS Servm
+boks_servm 6502/tcp # BoKS Servm
+boks_clntd 6503/udp # BoKS Clntd
+boks_clntd 6503/tcp # BoKS Clntd
+# Magnus Nystrom <magnus at dynas.se>
+# 6504 Unassigned
+badm_priv 6505/udp # BoKS Admin Private Port
+badm_priv 6505/tcp # BoKS Admin Private Port
+badm_pub 6506/udp # BoKS Admin Public Port
+badm_pub 6506/tcp # BoKS Admin Public Port
+bdir_priv 6507/udp # BoKS Dir Server, Private Port
+bdir_priv 6507/tcp # BoKS Dir Server, Private Port
+bdir_pub 6508/udp # BoKS Dir Server, Public Port
+bdir_pub 6508/tcp # BoKS Dir Server, Public Port
+# Magnus Nystrom <magnus at dynas.se>
+mgcs-mfp-port 6509/udp # MGCS-MFP Port
+mgcs-mfp-port 6509/tcp # MGCS-MFP Port
+# Minoru Ozaki <Minoru.Ozaki at rdmg.mgcs.mei.co.jp>
+mcer-port 6510/udp # MCER Port
+mcer-port 6510/tcp # MCER Port
+# Ade Adebayo <ade at us.itmasters.com>
+# 6511-6542 Unassigned
+lds-distrib 6543/udp # lds_distrib
+lds-distrib 6543/tcp # lds_distrib
+# Jack Baker <Jack.Baker at L-3Com.com> June 2003
+# 6544-6546 Unassigned
+apc-6547 6547/udp # APC 6547
+apc-6547 6547/tcp # APC 6547
+apc-6548 6548/udp # APC 6548
+apc-6548 6548/tcp # APC 6548
+apc-6549 6549/udp # APC 6549
+apc-6549 6549/tcp # APC 6549
+# American Power Conversion <ports at apcc.com>
+fg-sysupdate 6550/udp # fg-sysupdate
+fg-sysupdate 6550/tcp # fg-sysupdate
+# Mark Beyer <mbeyer at freegate.com>
+# 6551-6557 Unassigned
+xdsxdm 6558/udp #
+xdsxdm 6558/tcp #
+# Brian Tackett <cym at acrux.net> possible contact
+# 6559-6565 Unassigned
+sane-port 6566/udp # SANE Control Port
+sane-port 6566/tcp # SANE Control Port
+# Henning Meier-Geinitz <henning at meier-geinitz.de> October 2002
+# 6567-6579 Unassigned
+parsec-master 6580/udp # Parsec Masterserver
+parsec-master 6580/tcp # Parsec Masterserver
+parsec-peer 6581/udp # Parsec Peer-to-Peer
+parsec-peer 6581/tcp # Parsec Peer-to-Peer
+parsec-game 6582/udp # Parsec Gameserver
+parsec-game 6582/tcp # Parsec Gameserver
+# Andreas Varga <sid at parsec.org>
+# 6583-6587 Unassigned
+# 6588 Unassigned
+####Unofficial use of port 6588 by AnalogX and Microsoft####
+# 6589-6627 Unassigned
+afesc-mc 6628/udp # AFE Stock Channel M/C
+afesc-mc 6628/tcp # AFE Stock Channel M/C
+# Timothy Tam <ttam at hkcix.com> March 2003
+# 6629-6630 Unassigned
+mach 6631/udp # Mitchell telecom host
+mach 6631/tcp # Mitchell telecom host
+# Mark Derail <mderail at dmib.com> March 2003
+# 6632-6664 Unassigned
+# Brian Tackett <cym at acrux.net>
+vocaltec-gold 6670/udp # Vocaltec Global Online Directory
+vocaltec-gold 6670/tcp # Vocaltec Global Online Directory
+# Scott Petrack <Scott_Petrack at vocaltec.com>
+# 6671 Unassigned
+vision_server 6672/udp # vision_server
+vision_server 6672/tcp # vision_server
+vision_elmd 6673/udp # vision_elmd
+vision_elmd 6673/tcp # vision_elmd
+# Chris Kramer <CKramer at gis.shl.com>
+# 6674-6700 Unassigned
+kti-icad-srvr 6701/udp # KTI/ICAD Nameserver
+kti-icad-srvr 6701/tcp # KTI/ICAD Nameserver
+# Stanley Knutson <Stanley.Knutson at KTIworld.com>
+# 6702-6713 Unassigned
+ibprotocol 6714/udp # Internet Backplane Protocol
+ibprotocol 6714/tcp # Internet Backplane Protocol
+# Alessandro Bassi <abassi at cs.utk.edu>
+# 6715-6766 Unassigned
+bmc-perf-agent 6767/udp # BMC PERFORM AGENT
+bmc-perf-agent 6767/tcp # BMC PERFORM AGENT
+bmc-perf-mgrd 6768/udp # BMC PERFORM MGRD
+bmc-perf-mgrd 6768/tcp # BMC PERFORM MGRD
+# Dima Seliverstov <Dima_Seliverstov at bmc.com>
+# 6769-6787 Unassigned
+smc-http 6788/udp # SMC-HTTP
+smc-http 6788/tcp # SMC-HTTP
+# Ratnadeep Bhattacharjee <ratnadeep.bhattacharjee at sun.com> November 2002
+smc-https 6789/udp # SMC-HTTPS
+smc-https 6789/tcp # SMC-HTTPS
+# Ratnadeep Bhattacharjee <ratnadeep.bhattacharjee at sun.com> August 2002
+hnmp 6790/udp # HNMP
+hnmp 6790/tcp # HNMP
+# Jude George <jude at nas.nasa.gov>
+# 6791-6830 Unassigned
+ambit-lm 6831/udp # ambit-lm
+ambit-lm 6831/tcp # ambit-lm
+# Don Hejna <djhejna at ambit.com>
+# 6832-6840 Unassigned
+netmo-default 6841/udp # Netmo Default
+netmo-default 6841/tcp # Netmo Default
+netmo-http 6842/udp # Netmo HTTP
+netmo-http 6842/tcp # Netmo HTTP
+# Urs Bertschinger <urs at netmosphere.com>
+# 6843-6849 Unassigned
+iccrushmore 6850/udp # ICCRUSHMORE
+iccrushmore 6850/tcp # ICCRUSHMORE
+# Dave Hubbard <dave at icc.net>
+# 6851-6887 Unassigned
+muse 6888/udp # MUSE
+muse 6888/tcp # MUSE
+# Muse Communications Corporation
+# <howard at muse3d.com>
+# 6889-6960 Unassigned
+jmact3 6961/udp # JMACT3
+jmact3 6961/tcp # JMACT3
+jmevt2 6962/udp # jmevt2
+jmevt2 6962/tcp # jmevt2
+swismgr1 6963/udp # swismgr1
+swismgr1 6963/tcp # swismgr1
+swismgr2 6964/udp # swismgr2
+swismgr2 6964/tcp # swismgr2
+swistrap 6965/udp # swistrap
+swistrap 6965/tcp # swistrap
+swispol 6966/udp # swispol
+swispol 6966/tcp # swispol
+# Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+# 6967-6968 Unassigned
+acmsoda 6969/udp # acmsoda
+acmsoda 6969/tcp # acmsoda
+# Daniel Simms <dsimms at acm.uiuc.edu>
+# 6970-6997 Unassigned
+iatp-highpri 6998/udp # IATP-highPri
+iatp-highpri 6998/tcp # IATP-highPri
+iatp-normalpri 6999/udp # IATP-normalPri
+iatp-normalpri 6999/tcp # IATP-normalPri
+# John Murphy <john.m.murphy at mci.com>
+afs3-fileserver 7000/udp # file server itself
+afs3-fileserver 7000/tcp # file server itself
+afs3-callback 7001/udp # callbacks to cache managers
+afs3-callback 7001/tcp # callbacks to cache managers
+afs3-prserver 7002/udp # users & groups database
+afs3-prserver 7002/tcp # users & groups database
+afs3-vlserver 7003/udp # volume location database
+afs3-vlserver 7003/tcp # volume location database
+afs3-kaserver 7004/udp # AFS/Kerberos authentication service
+afs3-kaserver 7004/tcp # AFS/Kerberos authentication service
+afs3-volser 7005/udp # volume managment server
+afs3-volser 7005/tcp # volume managment server
+afs3-errors 7006/udp # error interpretation service
+afs3-errors 7006/tcp # error interpretation service
+afs3-bos 7007/udp # basic overseer process
+afs3-bos 7007/tcp # basic overseer process
+afs3-update 7008/udp # server-to-server updater
+afs3-update 7008/tcp # server-to-server updater
+afs3-rmtsys 7009/udp # remote cache manager service
+afs3-rmtsys 7009/tcp # remote cache manager service
+#
+ups-onlinet 7010/udp # onlinet uninterruptable power supplies
+ups-onlinet 7010/tcp # onlinet uninterruptable power supplies
+# Brian Hammill <brianh at exide.com>
+talon-disc 7011/udp # Talon Discovery Port
+talon-disc 7011/tcp # Talon Discovery Port
+talon-engine 7012/udp # Talon Engine
+talon-engine 7012/tcp # Talon Engine
+microtalon-dis 7013/udp # Microtalon Discovery
+microtalon-dis 7013/tcp # Microtalon Discovery
+microtalon-com 7014/udp # Microtalon Communications
+microtalon-com 7014/tcp # Microtalon Communications
+talon-webserver 7015/udp # Talon Webserver
+talon-webserver 7015/tcp # Talon Webserver
+# Jack Curtin <curtinj at powerware.com>
+# 7016-7019 Unassigned
+dpserve 7020/udp # DP Serve
+dpserve 7020/tcp # DP Serve
+dpserveadmin 7021/udp # DP Serve Admin
+dpserveadmin 7021/tcp # DP Serve Admin
+# Allan Stanley <allan at hummingbird.com>
+# 7022-7029 Unassigned
+op-probe 7030/udp # ObjectPlanet probe
+op-probe 7030/tcp # ObjectPlanet probe
+# Bjorn Jarle Kvande <bjorn at objectplanet.com> April 2002
+# 7031-7069 Unassigned
+arcp 7070/udp # ARCP
+arcp 7070/tcp # ARCP
+# Jude George <jude at nas.nasa.gov>
+# 7071-7098 Unassigned
+lazy-ptop 7099/udp # lazy-ptop
+lazy-ptop 7099/tcp # lazy-ptop
+# Guy Keren <Guy_Keren at mail.stil.scitex.com>
+font-service 7100/udp # X Font Service
+font-service 7100/tcp # X Font Service
+# Stephen Gildea <gildea at lcs.mit.edu>
+# 7101-7120 Unassigned
+virprot-lm 7121/udp # Virtual Prototypes License Manager
+virprot-lm 7121/tcp # Virtual Prototypes License Manager
+# Victor Galis <galis at satchmo.virtualprototypes.ca>
+# 7122-7173 Unassigned
+clutild 7174/udp # Clutild
+clutild 7174/tcp # Clutild
+# Cheryl Stoutenburg <cstoutenburg at vnet.ibm.com>
+# 7175-7199 Unassigned
+fodms 7200/udp # FODMS FLIP
+fodms 7200/tcp # FODMS FLIP
+# David Anthony <anthony at power.amasd.anatcp.rockwell.com>
+dlip 7201/udp # DLIP
+dlip 7201/tcp # DLIP
+# Albert Manfredi <manfredi at engr05.comsys.rockwell.com>
+# 7202-7279 Unassigned
+itactionserver1 7280/udp # ITACTIONSERVER 1
+itactionserver1 7280/tcp # ITACTIONSERVER 1
+itactionserver2 7281/udp # ITACTIONSERVER 2
+itactionserver2 7281/tcp # ITACTIONSERVER 2
+# Brian Taylor <btaylor at imagetag.com>
+# 7282-7299 Unassigned
+# Edgar Blum <edgar.blum at swx.ch>
+mindfilesys 7391/udp # mind-file system server
+mindfilesys 7391/tcp # mind-file system server
+mrssrendezvous 7392/udp # mrss-rendezvous server
+mrssrendezvous 7392/tcp # mrss-rendezvous server
+# Dave Porter <porter at mango.com>
+# 7393-7394 Unassigned
+winqedit 7395/udp # winqedit
+winqedit 7395/tcp # winqedit
+# David Greer <david_greer at robelle.com>
+# 7396-7425 Unassigned
+pmdmgr 7426/udp # OpenView DM Postmaster Manager
+pmdmgr 7426/tcp # OpenView DM Postmaster Manager
+oveadmgr 7427/udp # OpenView DM Event Agent Manager
+oveadmgr 7427/tcp # OpenView DM Event Agent Manager
+ovladmgr 7428/udp # OpenView DM Log Agent Manager
+ovladmgr 7428/tcp # OpenView DM Log Agent Manager
+opi-sock 7429/udp # OpenView DM rqt communication
+opi-sock 7429/tcp # OpenView DM rqt communication
+xmpv7 7430/udp # OpenView DM xmpv7 api pipe
+xmpv7 7430/tcp # OpenView DM xmpv7 api pipe
+pmd 7431/udp # OpenView DM ovc/xmpv3 api pipe
+pmd 7431/tcp # OpenView DM ovc/xmpv3 api pipe
+# Dave Lamb <rdl at rdl.cnd.hp.com>
+faximum 7437/udp # Faximum
+faximum 7437/tcp # Faximum
+# George Pajari <George.Pajari at faximum.com>
+# 7438-7490 Unassigned
+telops-lmd 7491/udp # telops-lmd
+telops-lmd 7491/tcp # telops-lmd
+# David Spencer <dspencer at telops.com>
+# 7492-7499 Unassigned
+# 7500 Unassigned
+ovbus 7501/udp # HP OpenView Bus Daemon
+ovbus 7501/tcp # HP OpenView Bus Daemon
+# David M. Rhodes <davidrho at cnd.hp.com>
+# 7502-7509 Unassigned
+ovhpas 7510/udp # HP OpenView Application Server
+ovhpas 7510/tcp # HP OpenView Application Server
+# Jeff Conrad <jeff_conrad at hp.com>
+pafec-lm 7511/udp # pafec-lm
+pafec-lm 7511/tcp # pafec-lm
+# Billy Dhillon <bdsos at pafec.co.uk>
+# 7512-7543 Unassigned
+nta-ds 7544/udp # FlowAnalyzer DisplayServer
+nta-ds 7544/tcp # FlowAnalyzer DisplayServer
+nta-us 7545/udp # FlowAnalyzer UtilityServer
+nta-us 7545/tcp # FlowAnalyzer UtilityServer
+# Fred Messinger <fredm at cisco.com>
+# 7546-7565 Unassigned
+vsi-omega 7566/udp # VSI Omega
+vsi-omega 7566/tcp # VSI Omega
+# Curtis Smith <curtis.smith at vsin.com>
+# 7567-7569 Unassigned
+aries-kfinder 7570/udp # Aries Kfinder
+aries-kfinder 7570/tcp # Aries Kfinder
+# James King, III <jking at ariessys.com>
+# 7571-7587 Unassigned
+sun-lm 7588/udp # Sun License Manager
+sun-lm 7588/tcp # Sun License Manager
+# Sophie Deng <Sophie.Deng at Eng.Sun.COM>
+# 7589-7623 Unassigned
+indi 7624/udp # Instrument Neutral Distributed Interface
+indi 7624/tcp # Instrument Neutral Distributed Interface
+# Elwood Downey <ecdowney at clearskyinstitute.com> April 2002
+# 7625-7632 Unassigned
+pmdfmgt 7633/udp # PMDF Management
+pmdfmgt 7633/tcp # PMDF Management
+# Hunter Goatley <goathunter at goatley.com>
+# 7634-7673 Unassigned
+imqtunnels 7674/udp # iMQ SSL tunnel
+imqtunnels 7674/tcp # iMQ SSL tunnel
+imqtunnel 7675/udp # iMQ Tunnel
+imqtunnel 7675/tcp # iMQ Tunnel
+# Shailesh S. Bavadekar <shailesh.bavadekar at sun.com> April 2002
+imqbrokerd 7676/udp # iMQ Broker Rendezvous
+imqbrokerd 7676/tcp # iMQ Broker Rendezvous
+# Joseph Di Pol <joe.dipol at sun.com> April 2002
+# 7677-7742 Unassigned
+sstp-1 7743/udp # Sakura Script Transfer Protocol
+sstp-1 7743/tcp # Sakura Script Transfer Protocol
+# Kouichi Takeda <KHBO5271 at nifty.com>
+# 7744-7776 Unassigned
+cbt 7777/udp # cbt
+cbt 7777/tcp # cbt
+# Tony Ballardie <A.Ballardie at cs.ucl.ac.uk>
+interwise 7778/udp # Interwise
+interwise 7778/tcp # Interwise
+# Joseph Gray <gray at interwise.co.il>
+vstat 7779/udp # VSTAT
+vstat 7779/tcp # VSTAT
+# Vinh Nguyn <vinh at sportvision.com>
+# 7780 Unassigned
+accu-lmgr 7781/udp # accu-lmgr
+accu-lmgr 7781/tcp # accu-lmgr
+# Moises E. Hernandez <moises at accugraph.com>
+# 7782-7785 Unassigned
+minivend 7786/udp # MINIVEND
+minivend 7786/tcp # MINIVEND
+# Mike Heins <mike at minivend.com>
+# 7787-7796 Unassigned
+pnet-conn 7797/udp # Propel Connector port
+pnet-conn 7797/tcp # Propel Connector port
+pnet-enc 7798/udp # Propel Encoder port
+pnet-enc 7798/tcp # Propel Encoder port
+# Leif Hedstrom <leif at propel.com> April 2002
+# 7799-7844 Unassigned
+apc-7845 7845/udp # APC 7845
+apc-7845 7845/tcp # APC 7845
+apc-7846 7846/udp # APC 7846
+apc-7846 7846/tcp # APC 7846
+# American Power Conversion <ports at apcc.com>
+# 7847-7912 Unassigned
+qo-secure 7913/udp # QuickObjects secure port
+qo-secure 7913/tcp # QuickObjects secure port
+# Jonas Bovin <jonas.bovin at quickobjects.com>
+# 7914-7931 Unassigned
+t2-drm 7932/udp # Tier 2 Data Resource Manager
+t2-drm 7932/tcp # Tier 2 Data Resource Manager
+t2-brm 7933/udp # Tier 2 Business Rules Manager
+t2-brm 7933/tcp # Tier 2 Business Rules Manager
+# Peter Carlson <pcarlson at tier2.com>
+# 7934-7966 Unassigned
+supercell 7967/udp # Supercell
+supercell 7967/tcp # Supercell
+# Kevin Nakagawa <nakagawa at sigsci.com>
+# 7968-7978 Unassigned
+micromuse-ncps 7979/udp # Micromuse-ncps
+micromuse-ncps 7979/tcp # Micromuse-ncps
+# Hing Wing To <wing.to at mircromuse.com>
+quest-vista 7980/udp # Quest Vista
+quest-vista 7980/tcp # Quest Vista
+# Preston Bannister <pbannister at quests.com>
+# 7981-7998 Unassigned
+irdmi2 7999/udp # iRDMI2
+irdmi2 7999/tcp # iRDMI2
+irdmi 8000/udp # iRDMI
+irdmi 8000/tcp # iRDMI
+# Gil Shafriri <shafriri at ilccm1.iil.intel.com>
+vcom-tunnel 8001/udp # VCOM Tunnel
+vcom-tunnel 8001/tcp # VCOM Tunnel
+# Mark Lewandowski <mlewan0 at us.ibm.com>
+teradataordbms 8002/udp # Teradata ORDBMS
+teradataordbms 8002/tcp # Teradata ORDBMS
+# Curt Ellmann <curt.ellmann at ncr.com>
+# 8003-8007 Unassigned
+http-alt 8008/udp # HTTP Alternate
+http-alt 8008/tcp # HTTP Alternate
+# James Gettys <jg at w3.org>
+# 8009-8021 Unassigned
+oa-system 8022/udp # oa-system
+oa-system 8022/tcp # oa-system
+# Denis Girault <Denis.Girault at evidian.com>
+# 8023-8031 Unassigned
+pro-ed 8032/udp # ProEd
+pro-ed 8032/tcp # ProEd
+mindprint 8033/udp # MindPrint
+mindprint 8033/tcp # MindPrint
+# Larry Tusoni <larry at goldrush.com>
+# 8034-8079 Unassigned
+http-alt 8080/udp # HTTP Alternate (see port 80)
+http-alt 8080/tcp # HTTP Alternate (see port 80)
+# Stephen Casner <casner at precpt.com>
+# 8081-8087 Unassigned
+radan-http 8088/udp # Radan HTTP
+radan-http 8088/tcp # Radan HTTP
+# Steve Hay <Steve.Hay at uk.radan.com> April 2002
+# 8089-8099 Unassigned
+xprint-server 8100/udp # Xprint Server
+xprint-server 8100/tcp # Xprint Server
+# John McKernan <John.McKernan at sun.com>
+# 8101-8114 Unassigned
+mtl8000-matrix 8115/udp # MTL8000 Matrix
+mtl8000-matrix 8115/tcp # MTL8000 Matrix
+# David Pinch <dpinch at mtl-inst.com> April 2002
+cp-cluster 8116/udp # Check Point Clustering
+cp-cluster 8116/tcp # Check Point Clustering
+# Roni Moshitzky <rmosh at checkpoint.com>
+# 8117 Unassigned
+privoxy 8118/udp # Privoxy HTTP proxy
+privoxy 8118/tcp # Privoxy HTTP proxy
+# Andreas Oesterhelt <oes at privoxy.org> June 2002
+# 8119-8129 Unassigned
+indigo-vrmi 8130/udp # INDIGO-VRMI
+indigo-vrmi 8130/tcp # INDIGO-VRMI
+indigo-vbcp 8131/udp # INDIGO-VBCP
+indigo-vbcp 8131/tcp # INDIGO-VBCP
+# Colin Caughie <cfc at indigo-avs.com>
+dbabble 8132/udp # dbabble
+dbabble 8132/tcp # dbabble
+# Chris Pugmire <chrisp at netwinsite.com>
+# 8133-8159 Unassigned
+patrol 8160/udp # Patrol
+patrol 8160/tcp # Patrol
+patrol-snmp 8161/udp # Patrol SNMP
+patrol-snmp 8161/tcp # Patrol SNMP
+# Daisy Tam <Daisy_Tam at bmc.com>
+# 8162-8198 Unassigned
+vvr-data 8199/udp # VVR DATA
+vvr-data 8199/tcp # VVR DATA
+# Ming Xu <ming at veritas.com>
+trivnet1 8200/udp # TRIVNET
+trivnet1 8200/tcp # TRIVNET
+trivnet2 8201/udp # TRIVNET
+trivnet2 8201/tcp # TRIVNET
+# Saar Wilf <saar at trivnet.com>
+# 8202-8203 Unassigned
+lm-perfworks 8204/udp # LM Perfworks
+lm-perfworks 8204/tcp # LM Perfworks
+lm-instmgr 8205/udp # LM Instmgr
+lm-instmgr 8205/tcp # LM Instmgr
+lm-dta 8206/udp # LM Dta
+lm-dta 8206/tcp # LM Dta
+lm-sserver 8207/udp # LM SServer
+lm-sserver 8207/tcp # LM SServer
+lm-webwatcher 8208/udp # LM Webwatcher
+lm-webwatcher 8208/tcp # LM Webwatcher
+# Chris Flynn <cflynn at landmark.com>
+# 8209-8350 Unassigned
+server-find 8351/udp # Server Find
+server-find 8351/tcp # Server Find
+# Chris Brown <chrisb at chancery.com>
+# 8352-8375 Unassigned
+cruise-enum 8376/udp # Cruise ENUM
+cruise-enum 8376/tcp # Cruise ENUM
+cruise-swroute 8377/udp # Cruise SWROUTE
+cruise-swroute 8377/tcp # Cruise SWROUTE
+cruise-config 8378/udp # Cruise CONFIG
+cruise-config 8378/tcp # Cruise CONFIG
+cruise-diags 8379/udp # Cruise DIAGS
+cruise-diags 8379/tcp # Cruise DIAGS
+cruise-update 8380/udp # Cruise UPDATE
+cruise-update 8380/tcp # Cruise UPDATE
+# Steve Husak <portmaster at cruisetech.com>
+# 8381-8399 Unassigned
+cvd 8400/udp # cvd
+cvd 8400/tcp # cvd
+sabarsd 8401/udp # sabarsd
+sabarsd 8401/tcp # sabarsd
+abarsd 8402/udp # abarsd
+abarsd 8402/tcp # abarsd
+admind 8403/udp # admind
+admind 8403/tcp # admind
+# Aaron Bilbrey <abilbrey at commvault.com>
+# 8404-8415 Unassigned
+espeech 8416/udp # eSpeech Session Protocol
+espeech 8416/tcp # eSpeech Session Protocol
+# Scott Tarone <starone at proactivethought.com> November 2002
+espeech-rtp 8417/udp # eSpeech RTP Protocol
+espeech-rtp 8417/tcp # eSpeech RTP Protocol
+# Scott Tarone <starone at proactivethought.com> April 2003
+# 8418-8442 Unassigned
+pcsync-https 8443/udp # PCsync HTTPS
+pcsync-https 8443/tcp # PCsync HTTPS
+pcsync-http 8444/udp # PCsync HTTP
+pcsync-http 8444/tcp # PCsync HTTP
+# Katy Lynn McCullough <KatyM at LapLink.com>
+# 8445-8449 Unassigned
+npmp 8450/udp # npmp
+npmp 8450/tcp # npmp
+# Ian Chard <ian at tanagra.demon.co.uk>
+# 8451-8472 Unassigned
+vp2p 8473/udp # Virtual Point to Point
+vp2p 8473/tcp # Virtual Point to Point
+# Jerome Grimbert <jerome.grimbert at atosorigin.com>
+# 8474-8553 Unassigned
+rtsp-alt 8554/udp # RTSP Alternate (see port 554)
+rtsp-alt 8554/tcp # RTSP Alternate (see port 554)
+# Stephen Casner <casner at precept.com>
+d-fence 8555/udp # SYMAX D-FENCE
+d-fence 8555/tcp # SYMAX D-FENCE
+# Thomas Geisel <tgeisel at symax.de> January 2003
+# 8556-8667 Unassigned
+natd 8668/divert # Network Address Translation
+# 8669-8732 Unassigned
+ibus 8733/udp # iBus
+ibus 8733/tcp # iBus
+# Silvano Maffeis <maffeis at softwired.ch>
+# 8734-8762 Unassigned
+mc-appserver 8763/udp # MC-APPSERVER
+mc-appserver 8763/tcp # MC-APPSERVER
+# Romeo Kasanwidjojo <romeo at microcomgroup.com>
+openqueue 8764/udp # OPENQUEUE
+openqueue 8764/tcp # OPENQUEUE
+# Matt Jensen <mattj at newsblip.com>
+ultraseek-http 8765/udp # Ultraseek HTTP
+ultraseek-http 8765/tcp # Ultraseek HTTP
+# Walter Underwood <wunder at infoseek.com>
+# 8766-8785 Unassigned
+msgclnt 8786/udp # Message Client
+msgclnt 8786/tcp # Message Client
+msgsrvr 8787/udp # Message Server
+msgsrvr 8787/tcp # Message Server
+# Michael O'Brien <mobrien02 at attbi.com> March 2003
+# 8788-8803 Unassigned
+truecm 8804/udp # truecm
+truecm 8804/tcp # truecm
+# Scott Kramer <scottk at truebluesoftware.com>
+# 8805-8879
+cddbp-alt 8880/udp # CDDBP
+cddbp-alt 8880/tcp # CDDBP
+# Steve Scherf <steve at moonsoft.com>
+# 8881-8887 Unassigned
+ddi-udp-1 8888/udp # NewsEDGE server UDP (UDP 1)
+ddi-tcp-1 8888/tcp # NewsEDGE server TCP (TCP 1)
+ddi-udp-2 8889/udp # NewsEDGE server broadcast
+ddi-tcp-2 8889/tcp # Desktop Data TCP 1
+ddi-udp-3 8890/udp # NewsEDGE client broadcast
+ddi-tcp-3 8890/tcp # Desktop Data TCP 2
+ddi-udp-4 8891/udp # Desktop Data UDP 3: NESS application
+ddi-tcp-4 8891/tcp # Desktop Data TCP 3: NESS application
+ddi-udp-5 8892/udp # Desktop Data UDP 4: FARM product
+ddi-tcp-5 8892/tcp # Desktop Data TCP 4: FARM product
+ddi-udp-6 8893/udp # Desktop Data UDP 5: NewsEDGE/Web application
+ddi-tcp-6 8893/tcp # Desktop Data TCP 5: NewsEDGE/Web application
+ddi-udp-7 8894/udp # Desktop Data UDP 6: COAL application
+ddi-tcp-7 8894/tcp # Desktop Data TCP 6: COAL application
+# Fred Yao <Fred_Yao at DDIGATE2.desktopdata.com>
+# 8895-8899 Unassigned
+jmb-cds1 8900/udp # JMB-CDS 1
+jmb-cds1 8900/tcp # JMB-CDS 1
+jmb-cds2 8901/udp # JMB-CDS 2
+jmb-cds2 8901/tcp # JMB-CDS 2
+# Curtis Bray <CurtisB at creativedesign.com>
+# 8902-8909 Unassigned
+manyone-http 8910/udp # manyone-http
+manyone-http 8910/tcp # manyone-http
+manyone-xml 8911/udp # manyone-xml
+manyone-xml 8911/tcp # manyone-xml
+# Matt King <m at manyone.net> April 2002
+# 8912-8953 Unassigned
+cumulus-admin 8954/udp # Cumulus Admin Port
+cumulus-admin 8954/tcp # Cumulus Admin Port
+# Thomas Schleu <tschleu at canto.de>
+# 8955-8998 Unassigned
+bctp 8999/udp # Brodos Crypto Trade Protocol
+bctp 8999/tcp # Brodos Crypto Trade Protocol
+# Alexander Sahler <alexander.sahler at brodos.de> February 2002
+cslistener 9000/udp # CSlistener
+cslistener 9000/tcp # CSlistener
+# David Jones <djones at cincom.com>
+etlservicemgr 9001/udp # ETL Service Manager
+etlservicemgr 9001/tcp # ETL Service Manager
+# Stephen McCrea <smccrea at etlelectronique.com> March 2002
+dynamid 9002/udp # DynamID authentication
+dynamid 9002/tcp # DynamID authentication
+# Jerome Dusautois <jdusautois at scrypto.fr> March 2002
+# 9003-9005 Unassigned
+# 9006 De-Commissioned Port 02/24/00, ms
+# 9007-9019 Unassigned
+tambora 9020/udp # TAMBORA
+tambora 9020/tcp # TAMBORA
+# Jason van Zyl <jvanzyl at zenplex.com> March 2002
+panagolin-ident 9021/udp # Pangolin Identification
+panagolin-ident 9021/tcp # Pangolin Identification
+# William Benner <bill at pangolin.com> March 2002
+paragent 9022/udp # PrivateArk Remote Agent
+paragent 9022/tcp # PrivateArk Remote Agent
+# Gal Cucuy <galc at cyber-ark.com> March 2002
+swa-1 9023/udp # Secure Web Access - 1
+swa-1 9023/tcp # Secure Web Access - 1
+swa-2 9024/udp # Secure Web Access - 2
+swa-2 9024/tcp # Secure Web Access - 2
+swa-3 9025/udp # Secure Web Access - 3
+swa-3 9025/tcp # Secure Web Access - 3
+swa-4 9026/udp # Secure Web Access - 4
+swa-4 9026/tcp # Secure Web Access - 4
+# Tim McGranaghan <tim_mcgranaghan at mech.disa.mil>
+# 9027-9079 Unassigned
+glrpc 9080/udp # Groove GLRPC
+glrpc 9080/tcp # Groove GLRPC
+# Adrian Popescu <Adrian_Popescu at groove.net> September 2002
+# 9081-9089 Unassigned
+websm 9090/udp # WebSM
+websm 9090/tcp # WebSM
+# I-Hsing Tsao <itsao at austin.ibm.com>
+xmltec-xmlmail 9091/udp # xmltec-xmlmail
+xmltec-xmlmail 9091/tcp # xmltec-xmlmail
+# Mitch Kaufman <mk at weconnectyou.com>
+# 9092-9099 Unassigned
+hp-pdl-datastr 9100/udp # PDL Data Streaming Port
+hp-pdl-datastr 9100/tcp # PDL Data Streaming Port
+# Shivaun Albright <shivaun_albright at hp.com> April 2002
+#### The protocol name "pdl-datastream" is primarily registered for use ####
+#### in DNS SRV records (RFC 2782). DNS SRV records allow a protocol to run on ####
+#### any port number, but the default port for this protocol is 9100 ####.
+pdl-datastream 9100/udp # Printer PDL Data Stream
+pdl-datastream 9100/tcp # Printer PDL Data Stream
+bacula-dir 9101/udp # Bacula Director
+bacula-dir 9101/tcp # Bacula Director
+bacula-fd 9102/udp # Bacula File Daemon
+bacula-fd 9102/tcp # Bacula File Daemon
+bacula-sd 9103/udp # Bacula Storage Daemon
+bacula-sd 9103/tcp # Bacula Storage Daemon
+# Kern Sibbald <kern at sibbald.com> January 2002
+# 9104-9159 Unassigned
+netlock1 9160/udp # NetLOCK1
+netlock1 9160/tcp # NetLOCK1
+netlock2 9161/udp # NetLOCK2
+netlock2 9161/tcp # NetLOCK2
+netlock3 9162/udp # NetLOCK3
+netlock3 9162/tcp # NetLOCK3
+netlock4 9163/udp # NetLOCK4
+netlock4 9163/tcp # NetLOCK4
+netlock5 9164/udp # NetLOCK5
+netlock5 9164/tcp # NetLOCK5
+# Steven Sawkins <ssawkins at netlock.com>
+# 9165-9199 Unassigned
+wap-wsp 9200/udp # WAP connectionless session service
+wap-wsp 9200/tcp # WAP connectionless session service
+wap-wsp-wtp 9201/udp # WAP session service
+wap-wsp-wtp 9201/tcp # WAP session service
+wap-wsp-s 9202/udp # WAP secure connectionless session service
+wap-wsp-s 9202/tcp # WAP secure connectionless session service
+wap-wsp-wtp-s 9203/udp # WAP secure session service
+wap-wsp-wtp-s 9203/tcp # WAP secure session service
+wap-vcard 9204/udp # WAP vCard
+wap-vcard 9204/tcp # WAP vCard
+wap-vcal 9205/udp # WAP vCal
+wap-vcal 9205/tcp # WAP vCal
+wap-vcard-s 9206/udp # WAP vCard Secure
+wap-vcard-s 9206/tcp # WAP vCard Secure
+wap-vcal-s 9207/udp # WAP vCal Secure
+wap-vcal-s 9207/tcp # WAP vCal Secure
+# WAP Forum <wap-feedback at mail.wapforum.org>
+# WAP Forum <pg at uplanet.com>
+# 9208-9209 Unassigned
+lif-mlp 9210/udp # LIF Mobile Locn Protocol
+lif-mlp 9210/tcp # LIF Mobile Locn Protocol
+lif-mlp-s 9211/udp # LIF Mobile Locn Secure
+lif-mlp-s 9211/tcp # LIF Mobile Locn Secure
+# Location Interoperability Forum
+# <greening at bigtribe.com> April 2002
+# 9212-9216 Unassigned
+fsc-port 9217/udp # FSC Communication Port
+fsc-port 9217/tcp # FSC Communication Port
+# Teijo Mustonen <Teijo.Mustonen at F-Secure.com> March 2002
+# 9218-9280 Unassigned
+swtp-port1 9281/udp # SofaWare transport port 1
+swtp-port1 9281/tcp # SofaWare transport port 1
+swtp-port2 9282/udp # SofaWare transport port 2
+swtp-port2 9282/tcp # SofaWare transport port 2
+# Amir Rapson <rapson at sofaware.com> February 2002
+callwaveiam 9283/udp # CallWaveIAM
+callwaveiam 9283/tcp # CallWaveIAM
+# Colin Kelley <cdk at callwave.com>
+visd 9284/udp # VERITAS Information Serve
+visd 9284/tcp # VERITAS Information Serve
+# Ravi Tavakely <ravi.tavakley at veritas.com> February 2002
+n2h2server 9285/udp # N2H2 Filter Service Port
+n2h2server 9285/tcp # N2H2 Filter Service Port
+# Jim Irwin <jirwin at n2h2.com> February 2002
+# 9286 Unassigned
+cumulus 9287/udp # Cumulus
+cumulus 9287/tcp # Cumulus
+# Thomas Schleu <tschleu at canto.de>
+# 9288-9291 Unassigned
+armtechdaemon 9292/udp # ArmTech Daemon
+armtechdaemon 9292/tcp # ArmTech Daemon
+# Rohan Story <rohan at aurema.com>
+# 9293-9320 Unassigned
+guibase 9321/udp # guibase
+guibase 9321/tcp # guibase
+# Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+# 9322-9342 Unassigned
+mpidcmgr 9343/udp # MpIdcMgr
+mpidcmgr 9343/tcp # MpIdcMgr
+mphlpdmc 9344/udp # Mphlpdmc
+mphlpdmc 9344/tcp # Mphlpdmc
+# Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+# 9345 Unassigned
+ctechlicensing 9346/udp # C Tech Licensing
+ctechlicensing 9346/tcp # C Tech Licensing
+# Reed Copsey, Jr. <reedc at ctech.com>
+# 9347-9373 Unassigned
+fjdmimgr 9374/udp # fjdmimgr
+fjdmimgr 9374/tcp # fjdmimgr
+# Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+# 9375-9395 Unassigned
+fjinvmgr 9396/udp # fjinvmgr
+fjinvmgr 9396/tcp # fjinvmgr
+mpidcagt 9397/udp # MpIdcAgt
+mpidcagt 9397/tcp # MpIdcAgt
+# Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+# 9398-9499 Unassigned
+ismserver 9500/udp # ismserver
+ismserver 9500/tcp # ismserver
+# Ian Gordon <iang at micromuse.co.uk>
+# 9501-9534 Unassigned
+mngsuite 9535/udp # Management Suite Remote Control
+mngsuite 9535/tcp # Management Suite Remote Control
+# Alan Butt <alan.butt at landesk.com>
+# 9536-9593 Unassigned
+msgsys 9594/udp # Message System
+msgsys 9594/tcp # Message System
+pds 9595/udp # Ping Discovery Service
+pds 9595/tcp # Ping Discovery Service
+# Alan Butt <alan.butt at landesk.com>
+# 9596-9599 Unassigned
+micromuse-ncpw 9600/udp # MICROMUSE-NCPW
+micromuse-ncpw 9600/tcp # MICROMUSE-NCPW
+# Hing Wing To <wing.to at micromuse.com>
+# 9601-9611 Unassigned
+streamcomm-ds 9612/udp # StreamComm User Directory
+streamcomm-ds 9612/tcp # StreamComm User Directory
+# Brian C. Wiles <brian at streamcomm.com>
+# 9613-9746 Unassigned
+l5nas-parchan 9747/udp # L5NAS Parallel Channel
+l5nas-parchan 9747/tcp # L5NAS Parallel Channel
+# Lawrence J. Dickson - Land-5 Corporation
+# <ldickson at land-5.com> March 2002
+# 9748-9752 Unassigned
+rasadv 9753/udp # rasadv
+rasadv 9753/tcp # rasadv
+# Dave Thaler <dthaler at microsoft.com>
+# 9754-9799 Unassigned
+davsrc 9800/udp # WebDav Source Port
+davsrc 9800/tcp # WebDav Source Port
+# Ethan Fremen <mindlace at digicool.com>
+sstp-2 9801/udp # Sakura Script Transfer Protocol-2
+sstp-2 9801/tcp # Sakura Script Transfer Protocol-2
+# Kouichi Takeda <KHB05271 at nifty.com>
+# 9802-9874 Unassigned
+sapv1 9875/udp # Session Announcement v1
+sapv1 9875/tcp # Session Announcement v1
+# RFC 2974 <ftp://ftp.isi.edu/in-notes/rfc2974.txt>
+sd 9876/udp # Session Director
+sd 9876/tcp # Session Director
+# Van Jacobson <van at ee.lbl.gov>
+cyborg-systems 9888/udp # CYBORG Systems
+cyborg-systems 9888/tcp # CYBORG Systems
+# Malcolm Graham <Malcolm_Graham at CYBORG.COM>
+monkeycom 9898/udp # MonkeyCom
+monkeycom 9898/tcp # MonkeyCom
+# Yuji Kuwabara <HHG01200 at niftyserve.or.jp>
+sctp-tunneling 9899/udp # SCTP TUNNELING
+sctp-tunneling 9899/tcp # SCTP TUNNELING
+iua 9900/sctp # IUA
+iua 9900/udp # IUA
+iua 9900/tcp # IUA
+# Lyndon Ong <LyOng at ciena.com>
+# 9901-9908 Unassigned
+domaintime 9909/udp # domaintime
+domaintime 9909/tcp # domaintime
+# Jeffry Dwight <jeffryd at greyware.com>
+# 9910 Unassigned
+sype-transport 9911/udp # SYPECom Transport Protocol
+sype-transport 9911/tcp # SYPECom Transport Protocol
+# Sylvain Pedneault <sylvain at sypecom.qc.ca> March 2003
+# 9912-9949 Unassigned
+apc-9950 9950/udp # APC 9950
+apc-9950 9950/tcp # APC 9950
+apc-9951 9951/udp # APC 9951
+apc-9951 9951/tcp # APC 9951
+apc-9952 9952/udp # APC 9952
+apc-9952 9952/tcp # APC 9952
+# American Power Conversion <ports at apcc.com>
+# 9953-9991 Unassigned
+palace-1 9992/udp # OnLive-1
+palace-1 9992/tcp # OnLive-1
+palace-2 9993/udp # OnLive-2
+palace-2 9993/tcp # OnLive-2
+palace-3 9994/udp # OnLive-3
+palace-3 9994/tcp # OnLive-3
+palace-4 9995/udp # Palace-4
+palace-4 9995/tcp # Palace-4
+palace-5 9996/udp # Palace-5
+palace-5 9996/tcp # Palace-5
+palace-6 9997/udp # Palace-6
+palace-6 9997/tcp # Palace-6
+# Douglas Crockford <crock at communities.com>
+distinct32 9998/udp # Distinct32
+distinct32 9998/tcp # Distinct32
+distinct 9999/udp # distinct
+distinct 9999/tcp # distinct
+# Anoop Tewari <anoop at next.distinct.com>
+ndmp 10000/udp # Network Data Management Protocol
+ndmp 10000/tcp # Network Data Management Protocol
+# Brian Ehrmantraut <bae at netapp.com>
+scp-config 10001/udp # SCP Configuration Port
+scp-config 10001/tcp # SCP Configuration Port
+# Brad Strand <brad.strand at 3ware.com>
+# 10002-10006 Unassigned
+mvs-capacity 10007/udp # MVS Capacity
+mvs-capacity 10007/tcp # MVS Capacity
+# Donna Dillenberger <engd at us.ibm.com>
+octopus 10008/udp # Octopus Multiplexer
+octopus 10008/tcp # Octopus Multiplexer
+# Chris Koeritz <fred at gruntose.com> October 2002
+# 10009-10079 Unassigned
+amanda 10080/udp # Amanda
+amanda 10080/tcp # Amanda
+# John Jackson <jrj at gandalf.cc.purdue.edu>
+# <amanda-core at amanda.org>
+# 10081-10100 Unassigned
+ezmeeting-2 10101/udp # eZmeeting
+ezmeeting-2 10101/tcp # eZmeeting
+ezproxy-2 10102/udp # eZproxy
+ezproxy-2 10102/tcp # eZproxy
+ezrelay 10103/udp # eZrelay
+ezrelay 10103/tcp # eZrelay
+# Albert C. Yang <albert.yang at eZmeeting.com> March 2002
+# 10104-10112 Unassigned
+netiq-endpoint 10113/udp # NetIQ Endpoint
+netiq-endpoint 10113/tcp # NetIQ Endpoint
+netiq-qcheck 10114/udp # NetIQ Qcheck
+netiq-qcheck 10114/tcp # NetIQ Qcheck
+# John Wood <John.Wood at netiq.com>
+netiq-endpt 10115/udp # NetIQ Endpoint
+netiq-endpt 10115/tcp # NetIQ Endpoint
+# Gary Weichinger <gary.weichinger at netiq.com>
+netiq-voipa 10116/udp # NetIQ VoIP Assessor
+netiq-voipa 10116/tcp # NetIQ VoIP Assessor
+# Gary Weichinger <gary.weichinger at netiq.com>
+# 10117-10127 Unassigned
+bmc-perf-sd 10128/udp # BMC-PERFORM-SERVICE DAEMON
+bmc-perf-sd 10128/tcp # BMC-PERFORM-SERVICE DAEMON
+# Dima Seliverstov <Dima_Seliverstov at bmc.com>
+# 10129-10259 Unassigned
+axis-wimp-port 10260/udp # Axis WIMP Port
+axis-wimp-port 10260/tcp # Axis WIMP Port
+# Stefan Eriksson <contact-iana at axis.com>
+# 10261-10287 Unassigned
+blocks 10288/udp # Blocks
+blocks 10288/tcp # Blocks
+# Carl Malamud
+# 10289-10989 Unassigned
+rmiaux 10990/udp # Auxiliary RMI Port
+rmiaux 10990/tcp # Auxiliary RMI Port
+# Eugen Bacic <eugen at texar.com>
+# 10991-10999 Unassigned
+irisa 11000/udp # IRISA
+irisa 11000/tcp # IRISA
+# Vladimir Brauner <vbrauner at datamedia.fr>
+metasys 11001/udp # Metasys
+metasys 11001/tcp # Metasys
+# Tobin Schuster <tobin.j.schuster at jci.com>
+# 11002-11110 Unassigned
+vce 11111/udp # Viral Computing Environment (VCE)
+vce 11111/tcp # Viral Computing Environment (VCE)
+# Fred Cohen <fc at all.net>
+# 11112-11200 Unassigned
+smsqp 11201/udp # smsqp
+smsqp 11201/tcp # smsqp
+# Andres Seco Hernandez <AndresSH at alamin.org>
+# 11202-11318 Unassigned
+imip 11319/udp # IMIP
+imip 11319/tcp # IMIP
+# IM Unified Coalition, Len Zuvela
+# <imu-comments at egroups.com>
+imip-channels 11320/udp # IMIP Channels Port
+imip-channels 11320/tcp # IMIP Channels Port
+# Len Zuvela <lenz at microsoft.com>
+arena-server 11321/udp # Arena Server Listen
+arena-server 11321/tcp # Arena Server Listen
+# Earl Brannigan <earl.brannigan at lindenhous.co.uk>
+# 11322-11366 Unassigned
+atm-uhas 11367/udp # ATM UHAS
+atm-uhas 11367/tcp # ATM UHAS
+# Todd Barker <toddba at attachmate.com>
+# 11368-11370 Unassigned
+hkp 11371/udp # OpenPGP HTTP Keyserver
+hkp 11371/tcp # OpenPGP HTTP Keyserver
+# David Shaw <dshaw at jabberwocky.com> May 2003
+# 11372-11599 Unassigned
+tempest-port 11600/udp # Tempest Protocol Port
+tempest-port 11600/tcp # Tempest Protocol Port
+# Francis Cianfrocca <francis at tempest.com>
+# 11601-11719 Unassigned
+h323callsigalt 11720/udp # h323 Call Signal Alternate
+h323callsigalt 11720/tcp # h323 Call Signal Alternate
+# Chris White <cjwhite at cisco.com>
+# 11721-11750 Unassigned
+intrepid-ssl 11751/udp # Intrepid SSL
+intrepid-ssl 11751/tcp # Intrepid SSL
+# Robert Eden <reden at sieglertech.com> March 2003
+# 11752-11966 Unassigned
+sysinfo-sp 11967/udp # SysInfo Sercice Protocol
+sysinfo-sp 11967/tcp # SysInfo Service Protocol
+# Mike Cooper <mcooper at magnicomp.com> March 2003
+# 11968-11999 Unassiged
+entextxid 12000/udp # IBM Enterprise Extender SNA XID Exchange
+entextxid 12000/tcp # IBM Enterprise Extender SNA XID Exchange
+entextnetwk 12001/udp # IBM Enterprise Extender SNA COS Network Priority
+entextnetwk 12001/tcp # IBM Enterprise Extender SNA COS Network Priority
+entexthigh 12002/udp # IBM Enterprise Extender SNA COS High Priority
+entexthigh 12002/tcp # IBM Enterprise Extender SNA COS High Priority
+entextmed 12003/udp # IBM Enterprise Extender SNA COS Medium Priority
+entextmed 12003/tcp # IBM Enterprise Extender SNA COS Medium Priority
+entextlow 12004/udp # IBM Enterprise Extender SNA COS Low Priority
+entextlow 12004/tcp # IBM Enterprise Extender SNA COS Low Priority
+# Eugene Cox <genecox at raleigh.ibm.com>
+dbisamserver1 12005/udp # DBISAM Database Server - Regular
+dbisamserver1 12005/tcp # DBISAM Database Server - Regular
+dbisamserver2 12006/udp # DBISAM Database Server - Admin
+dbisamserver2 12006/tcp # DBISAM Database Server - Admin
+# Tim Young <timyoung at elevatesoft.com> May 2002
+# 12007-12108 Unassigned
+rets-ssl 12109/udp # RETS over SSL
+rets-ssl 12109/tcp # RETS over SSL
+# Bruce Toback <btoback at optc.com> February 2003
+# 12110-12171 Unassigned
+hivep 12172/udp # HiveP
+hivep 12172/tcp # HiveP
+# Dick Augustsson <dick at skenbe.net>
+# 12173-12344 Unassigned
+italk 12345/udp # Italk Chat System
+italk 12345/tcp # Italk Chat System
+# Takayuki Ito <yuki at euc.jp>
+# 12346-12752 Unassigned
+tsaf 12753/udp # tsaf port
+tsaf 12753/tcp # tsaf port
+# Andreas Fehr <100042.2070 at CompuServe.COM>
+# 12754-13159 Unassigned
+i-zipqd 13160/udp # I-ZIPQD
+i-zipqd 13160/tcp # I-ZIPQD
+# Chuck Runquist <crunquist at quarterdeck.com>
+# 13161-13222 Unassigned
+powwow-client 13223/udp # PowWow Client
+powwow-client 13223/tcp # PowWow Client
+powwow-server 13224/udp # PowWow Server
+powwow-server 13224/tcp # PowWow Server
+# Paul K. Peterson <paul at tribal.com>
+# 13225-13719 Unassigned
+bprd 13720/udp # BPRD Protocol (VERITAS NetBackup)
+bprd 13720/tcp # BPRD Protocol (VERITAS NetBackup)
+bpdbm 13721/udp # BPDBM Protocol (VERITAS NetBackup)
+bpdbm 13721/tcp # BPDBM Protocol (VERITAS NetBackup)
+# Jeff Holmbeck <Jeff.Holmbeck at veritas.com>
+bpjava-msvc 13722/udp # BP Java MSVC Protocol
+bpjava-msvc 13722/tcp # BP Java MSVC Protocol
+# Tim Schmidt <Tim.Schmidt at veritas.com>
+# 13723 Unassigned
+vnetd 13724/udp # Veritas Network Utility
+vnetd 13724/tcp # Veritas Network Utility
+# Jeff Holmbeck <Jeff.Holmbeck at veritas.com>
+# 13725-13781 Unassigned
+bpcd 13782/udp # VERITAS NetBackup
+bpcd 13782/tcp # VERITAS NetBackup
+vopied 13783/udp # VOPIED Protocol
+vopied 13783/tcp # VOPIED Protocol
+# Jeff Holmbeck <Jeff.Holmbeck at veritas.com>
+# 13784-13817 Unassigned
+dsmcc-config 13818/udp # DSMCC Config
+dsmcc-config 13818/tcp # DSMCC Config
+dsmcc-session 13819/udp # DSMCC Session Messages
+dsmcc-session 13819/tcp # DSMCC Session Messages
+dsmcc-passthru 13820/udp # DSMCC Pass-Thru Messages
+dsmcc-passthru 13820/tcp # DSMCC Pass-Thru Messages
+dsmcc-download 13821/udp # DSMCC Download Protocol
+dsmcc-download 13821/tcp # DSMCC Download Protocol
+dsmcc-ccp 13822/udp # DSMCC Channel Change Protocol
+dsmcc-ccp 13822/tcp # DSMCC Channel Change Protocol
+# Tim Addington <Tim.Addington at sciatl.com>
+# ISO/IEC 13818-6 MPEG-2 DSM-CC
+# 13823-14000 Unassigned
+sua 14001/sctp # SUA
+sua 14001/udp # De-Registered (2001 June 06)
+sua 14001/tcp # SUA
+# Miguel Angel Garcia <Miguel.A.Garcia at ericsson.com>
+# 14002-14032 Unassigned
+sage-best-com1 14033/udp # sage Best! Config Server 1
+sage-best-com1 14033/tcp # sage Best! Config Server 1
+sage-best-com2 14034/udp # sage Best! Config Server 2
+sage-best-com2 14034/tcp # sage Best! Config Server 2
+# Christian Rubach <Christian_Rubach at bestsoftware.com>
+# 14035-14140 Unassigned
+vcs-app 14141/udp # VCS Application
+vcs-app 14141/tcp # VCS Application
+# Ming Xu <ming at veritas.com>
+# 14142-14144 Unassigned
+gcm-app 14145/udp # GCM Application
+gcm-app 14145/tcp # GCM Application
+# Ming Xu <ming at veritas.com>
+# 14146-14148 Unassigned
+vrts-tdd 14149/udp # Veritas Traffic Director
+vrts-tdd 14149/tcp # Veritas Traffic Director
+# Sameer Deokule <sameer.deokule at veritas.com> March 2002
+# 14150-14935 Unassigned
+hde-lcesrvr-1 14936/udp # hde-lcesrvr-1
+hde-lcesrvr-1 14936/tcp # hde-lcesrvr-1
+hde-lcesrvr-2 14937/udp # hde-lcesrvr-2
+hde-lcesrvr-2 14937/tcp # hde-lcesrvr-2
+# Horizon Digital Enterprise, Inc. <info at hde.co.jp>
+# 14938-14999 Unassigned
+hydap 15000/udp # Hypack Data Aquisition
+hydap 15000/tcp # Hypack Data Aquisition
+# Mircea Neacsu <mircea at videotron.ca>
+# 15001-15344 Unassigned
+xpilot 15345/udp # XPilot Contact Port
+xpilot 15345/tcp # XPilot Contact Port
+# Bert Gijsbers <bert at xpilot.org>
+# 15346-15362 Unassigned
+3link 15363/udp # 3Link Negotiation
+3link 15363/tcp # 3Link Negotiation
+# Brant Thomsen <brant_thomsen at 3com.com> January 2003
+# 15364-16359 Unassigned
+netserialext1 16360/udp # netserialext1
+netserialext1 16360/tcp # netserialext1
+netserialext2 16361/udp # netserialext2
+netserialext2 16361/tcp # netserialext2
+# Mike Hoy <mhoy at aquilagroup.com>
+# 16362-16366 Unassigned
+netserialext3 16367/udp # netserialext3
+netserialext3 16367/tcp # netserialext3
+netserialext4 16368/udp # netserialext4
+netserialext4 16368/tcp # netserialext4
+# Mike Hoy <mhoy at aquilagroup.com>
+# 16369-16990 Unassigned
+intel-rci-mp 16991/udp # INTEL-RCI-MP
+intel-rci-mp 16991/tcp # INTEL-RCI-MP
+# Jane Dashevsky <jane.dashevsky at intel.com>
+# 16992-17006 Unassigned
+isode-dua 17007/udp #
+isode-dua 17007/tcp #
+# 17008-17184 Unassigned
+soundsvirtual 17185/udp # Sounds Virtual
+soundsvirtual 17185/tcp # Sounds Virtual
+# Richard Snider <rsnider at sounds.com>
+# 17186-17218 Unassigned
+chipper 17219/udp # Chipper
+chipper 17219/tcp # Chipper
+# Ronald Jimmink <Ronald.Jimmink at chipper.nl>
+# 17220-17999 Unassigned
+biimenu 18000/udp # Beckman Instruments, Inc.
+biimenu 18000/tcp # Beckman Instruments, Inc.
+# R. L. Meyering <RLMEYERING at BIIVAX.DP.BECKMAN.COM>
+# 18001-18180 Unassigned
+opsec-cvp 18181/udp # OPSEC CVP
+opsec-cvp 18181/tcp # OPSEC CVP
+opsec-ufp 18182/udp # OPSEC UFP
+opsec-ufp 18182/tcp # OPSEC UFP
+# Alon Kantor <alonk at checkpoint.com>
+opsec-sam 18183/udp # OPSEC SAM
+opsec-sam 18183/tcp # OPSEC SAM
+opsec-lea 18184/udp # OPSEC LEA
+opsec-lea 18184/tcp # OPSEC LEA
+opsec-omi 18185/udp # OPSEC OMI
+opsec-omi 18185/tcp # OPSEC OMI
+# Alon Kantor <alonk at checkpoint.com>
+# 18186 Unassigned
+opsec-ela 18187/udp # OPSEC ELA
+opsec-ela 18187/tcp # OPSEC ELA
+# Alon Kantor <alonk at checkpoint.com>
+# 18188-18240 Unassigned
+checkpoint-rtm 18241/udp # Check Point RTM
+checkpoint-rtm 18241/tcp # Check Point RTM
+# Dudi Hazan <dudi at checkpoint.com>
+# 18242-18462 Unassigned
+ac-cluster 18463/udp # AC Cluster
+ac-cluster 18463/tcp # AC Cluster
+# Lisa Zhong <lzhong at cup.hp.com>
+# 18464-18768 Unassigned
+ique 18769/udp # IQue Protocol
+ique 18769/tcp # IQue Protocol
+# Avi Drissman <avi_drissman at baseview.com> July 2002
+# 18770-18887 Unassigned
+apc-necmp 18888/udp # APCNECMP
+apc-necmp 18888/tcp # APCNECMP
+# Michael Yip <Michael.Yip at alcatel.com>
+# 18889-19190 Unassigned
+opsec-uaa 19191/udp # OPSEC UAA
+opsec-uaa 19191/tcp # OPSEC UAA
+# Reuven Harrison <rnd_ana at checkpoint.com>
+# 19192-19193 Unassigned
+ua-secureagent 19194/udp # UserAuthority SecureAgent
+ua-secureagent 19194/tcp # UserAuthority SecureAgent
+# Reuven Harrison <rharrison at checkpoint.com> January 2003
+# 19195-19282 Unassigned
+keysrvr 19283/udp # Key Server for SASSAFRAS
+keysrvr 19283/tcp # Key Server for SASSAFRAS
+# Mark Valence <kurash at sassafras.com>
+# 19284-19314 Unassigned
+keyshadow 19315/udp # Key Shadow for SASSAFRAS
+keyshadow 19315/tcp # Key Shadow for SASSAFRAS
+# Mark Valence <kurash at sassafras.com>
+# 19316-19397 Unassigned
+mtrgtrans 19398/udp # mtrgtrans
+mtrgtrans 19398/tcp # mtrgtrans
+# Katsuhito Muroi <muroi at pfu.co.jp>
+# 19399-19409 Unassigned
+hp-sco 19410/udp # hp-sco
+hp-sco 19410/tcp # hp-sco
+hp-sca 19411/udp # hp-sca
+hp-sca 19411/tcp # hp-sca
+# Larry Schwartz <lrs at cup.hp.com>
+hp-sessmon 19412/udp # HP-SESSMON
+hp-sessmon 19412/tcp # HP-SESSMON
+# Gita Murthy <gita at cup.hp.com>
+# 19413-19539 Unassigned
+sxuptp 19540/udp # SXUPTP
+sxuptp 19540/tcp # SXUPTP
+# Keiji Okuma <okuma at silex.jp> August 2002
+jcp 19541/udp # JCP Client
+jcp 19541/tcp # JCP Client
+# Yuji Sasaki <sasaki at silex.jp>
+# 19542-19999 Unassigned
+dnp 20000/udp # DNP
+dnp 20000/tcp # DNP
+# Michael Thesing <michael.thesing at acsatlanta.com>
+# 20001-20201 Unassigned
+ipdtp-port 20202/udp # IPD Tunneling Port
+ipdtp-port 20202/tcp # IPD Tunneling Port
+# Vikki Yin Wei <vikki at ipdynamics.com> January 2003
+# 20203-20221 Unassigned
+ipulse-ics 20222/udp # iPulse-ICS
+ipulse-ics 20222/tcp # iPulse-ICS
+# Meggie Garica-Woodruff <ipulse at ericsson.com>
+# 20223-20669 Unassigned
+track 20670/udp # Track
+track 20670/tcp # Track
+# Michael Sweet <msweet at ctr.nawcad.navy.mil>
+# 20671-20998 Unassigned
+athand-mmp 20999/udp # AT Hand MMP
+athand-mmp 20999/tcp # At Hand MMP
+# Stepan Riha <stepan.riha at hand.com>
+# 20300-21589 Unassigned
+vofr-gateway 21590/udp # VoFR Gateway
+vofr-gateway 21590/tcp # VoFR Gateway
+# Marty Borden <mborden at tollbridgetech.com>
+# 21591-21799 Unassigned
+tvpm 21800/udp # TVNC Pro Multiplexing
+tvpm 21800/tcp # TVNC Pro Multiplexing
+# Brian Blevins <brian.blevins at tridia.com>
+# 21801-21844 Unassigned
+webphone 21845/udp # webphone
+webphone 21845/tcp # webphone
+netspeak-is 21846/udp # NetSpeak Corp. Directory Services
+netspeak-is 21846/tcp # NetSpeak Corp. Directory Services
+netspeak-cs 21847/udp # NetSpeak Corp. Connection Services
+netspeak-cs 21847/tcp # NetSpeak Corp. Connection Services
+netspeak-acd 21848/udp # NetSpeak Corp. Automatic Call Distribution
+netspeak-acd 21848/tcp # NetSpeak Corp. Automatic Call Distribution
+netspeak-cps 21849/udp # NetSpeak Corp. Credit Processing System
+netspeak-cps 21849/tcp # NetSpeak Corp. Credit Processing System
+# Toby Hosterman <root at netspeak.com>
+# 21850-21999 Unassigned
+snapenetio 22000/udp # SNAPenetIO
+snapenetio 22000/tcp # SNAPenetIO
+optocontrol 22001/udp # OptoControl
+optocontrol 22001/tcp # OptoControl
+# Kevin Kuhns <kkuhns at opto22.com>
+# 22002-22272 Unassigned
+wnn6 22273/udp # wnn6
+wnn6 22273/tcp # wnn6
+# Yasunari Gon Yamasita <yamasita at omronsoft.co.jp
+# 22274-22554 Unassigned
+vocaltec-phone 22555/udp # Vocaltec Internet Phone
+vocaltec-wconf 22555/tcp # Vocaltec Web Conference
+# Scott Petrack >Scott_Petrack at vocaltec.com>
+# 22556-22799 Unassigned
+aws-brf 22800/udp # Telerate Information Platform LAN
+aws-brf 22800/tcp # Telerate Information Platform LAN
+# Timo Sivonen <timo.sivonen at ccmail.dowjones.com>
+# 22801-22950 Unassigned
+brf-gw 22951/udp # Telerate Information Platform WAN
+brf-gw 22951/tcp # Telerate Information Platform WAN
+# Timo Sivonen <timo.sivonen at ccmail.dowjones.com>
+# 22952-23999 Unassigned
+med-ltp 24000/udp # med-ltp
+med-ltp 24000/tcp # med-ltp
+med-fsp-rx 24001/udp # med-fsp-rx
+med-fsp-rx 24001/tcp # med-fsp-rx
+med-fsp-tx 24002/udp # med-fsp-tx
+med-fsp-tx 24002/tcp # med-fsp-tx
+med-supp 24003/udp # med-supp
+med-supp 24003/tcp # med-supp
+med-ovw 24004/udp # med-ovw
+med-ovw 24004/tcp # med-ovw
+med-ci 24005/udp # med-ci
+med-ci 24005/tcp # med-ci
+med-net-svc 24006/udp # med-net-svc
+med-net-svc 24006/tcp # med-net-svc
+# Juergen Fischbach <Juergen_Fischbach at agilent.com>
+# 24007-24241 Unassigned
+filesphere 24242/udp # fileSphere
+filesphere 24242/tcp # fileSphere
+# Carl Cedergren <asperon at home.se>
+# 24243-24248 Unassigned
+vista-4gl 24249/udp # Vista 4GL
+vista-4gl 24249/tcp # Vista 4GL
+# Mark Itzcovitz <mji at vistacomp.com>
+# 24250-24385 Unassigned
+intel_rci 24386/udp # Intel RCI
+intel_rci 24386/tcp # Intel RCI
+# Mark Lewis <mark.h.lewis at intel.com>
+# 24387-24553 Unassigned
+binkp 24554/udp # BINKP
+binkp 24554/tcp # BINKP
+# Max Masyutin <max at ritlabs.com>
+# 24554-34676 Unassigned
+flashfiler 24677/udp # FlashFiler
+flashfiler 24677/tcp # FlashFiler
+# Ben Oram <beno at turbopower.com>
+proactivate 24678/udp # Turbopower Proactivate
+proactivate 24678/tcp # Turbopower Proactivate
+# Ben Oram <beno at turbopower.com>
+# 24679-24921 Unassigned
+snip 24922/udp # Simple Net Ident Protocol
+snip 24922/tcp # Simple Net Ident Protocol
+# Jean-Paul Moreaux
+# <jean-paul.moreaux at airbus.dasa.de>
+# 24923-24999 Unassigned
+icl-twobase1 25000/udp # icl-twobase1
+icl-twobase1 25000/tcp # icl-twobase1
+icl-twobase2 25001/udp # icl-twobase2
+icl-twobase2 25001/tcp # icl-twobase2
+icl-twobase3 25002/udp # icl-twobase3
+icl-twobase3 25002/tcp # icl-twobase3
+icl-twobase4 25003/udp # icl-twobase4
+icl-twobase4 25003/tcp # icl-twobase4
+icl-twobase5 25004/udp # icl-twobase5
+icl-twobase5 25004/tcp # icl-twobase5
+icl-twobase6 25005/udp # icl-twobase6
+icl-twobase6 25005/tcp # icl-twobase6
+icl-twobase7 25006/udp # icl-twobase7
+icl-twobase7 25006/tcp # icl-twobase7
+icl-twobase8 25007/udp # icl-twobase8
+icl-twobase8 25007/tcp # icl-twobase8
+icl-twobase9 25008/udp # icl-twobase9
+icl-twobase9 25008/tcp # icl-twobase9
+icl-twobase10 25009/udp # icl-twobase10
+icl-twobase10 25009/tcp # icl-twobase10
+# J. A. (Tony) Sever <J.A.Sever at bra0119.wins.icl.co.uk>
+# 25010-25792 Unassigned
+vocaltec-hos 25793/udp # Vocaltec Address Server
+vocaltec-hos 25793/tcp # Vocaltec Address Server
+# Scott Petrack <Scott_Petrack at vocaltec.com>
+# 25794-25900 Unassigned
+niobserver 25901/udp # NIObserver
+niobserver 25901/tcp # NIObserver
+# Roman Oliynyk <romano at netinst.com>
+# 25902 Unassigned
+niprobe 25903/udp # NIProbe
+niprobe 25903/tcp # NIProbe
+# Roman Oliynyk <romano at netinst.com>
+# 25904-25999 Unassigned
+quake 26000/udp # quake
+quake 26000/tcp # quake
+# Yasunari Gon Yamasita <yamasita at omronsoft.co.jp>
+# 26001-26207 Unassigned
+wnn6-ds 26208/udp # wnn6-ds
+wnn6-ds 26208/tcp # wnn6-ds
+# Yasunari Gon Yamasita <yamasita at omronsoft.co.jp>
+# 26209-26259 Unassigned
+ezproxy 26260/udp # eZproxy
+ezproxy 26260/tcp # eZproxy
+ezmeeting 26261/udp # eZmeeting
+ezmeeting 26261/tcp # eZmeeting
+# Albert C. Yang <albert.yang at eZmeeting.com>
+k3software-svr 26262/udp # K3 Software-Server
+k3software-svr 26262/tcp # K3 Software-Server
+k3software-cli 26263/udp # K3 Software-Client
+k3software-cli 26263/tcp # K3 Software-Client
+# Jim Baldridge <jimb at rpower.com>
+gserver 26264/udp # Gserver
+gserver 26264/tcp # Gserver
+# Szanto Gabor <sgabor90 at hotmail.com>
+# 26265-26999 Unassigned
+# Daniel Birns <daniel at globes.com>
+# 27010-27344 Unassigned
+imagepump 27345/udp # ImagePump
+imagepump 27345/tcp # ImagePump
+# Richard Minner <ports at xippix.com>
+# 27346-27503 Unassigned
+kopek-httphead 27504/udp # Kopek HTTP Head Port
+kopek-httphead 27504/tcp # Kopek HTTP Head Port
+# Sten H. Danielsen <shd at kopek.net> July 2002
+# 27505-27998 Unassigned
+tw-auth-key 27999/udp # Attribute Certificate Services
+tw-auth-key 27999/tcp # TW Authentication/Key Distribution and
+# Alex Duncan <Alex.Duncan at sse.ie>
+# 28000-30000 Unassigned
+pago-services1 30001/udp # Pago Services 1
+pago-services1 30001/tcp # Pago Services 1
+pago-services2 30002/udp # Pago Services 2
+pago-services2 30002/tcp # Pago Services 2
+# Balduin Mueller-Platz
+# <balduin.mueller-platz at pago.de> March 2002
+# 30003-31415 Unassigned
+xqosd 31416/udp # XQoS network monitor
+xqosd 31416/tcp # XQoS network monitor
+# Joe Elliott <joe at inetd.com> June 2002
+# 31417-31619 Unassigned
+lm-mon 31620/udp # lm mon
+lm-mon 31620/tcp # lm mon
+# Mounir Hahad <mounir.hahad at eecad.com> June 2003
+# 31621-31764 Unassigned
+gamesmith-port 31765/udp # GameSmith Port
+gamesmith-port 31765/tcp # GameSmith Port
+# Randy Thompson <thompr at earthlink.net> August 2002
+# 31766-32767 Unassigned
+filenet-tms 32768/udp # Filenet TMS
+filenet-tms 32768/tcp # Filenet TMS
+filenet-rpc 32769/udp # Filenet RPC
+filenet-rpc 32769/tcp # Filenet RPC
+filenet-nch 32770/udp # Filenet NCH
+filenet-nch 32770/tcp # Filenet NCH
+# Daniel Whelan <dwhelan at filenet.com>
+filenet-rmi 32771/udp # FileNet RMI
+filenet-rmi 32771/tcp # FileNET RMI
+# Chris Adkins <cadkins at filenet.com>
+filenet-pa 32772/udp # FileNET Process Analyzer
+filenet-pa 32772/tcp # FileNET Process Analyzer
+# Chris Adkins <cadkins at filenet.com> January 2003
+# 32773-32895 Unassigned
+idmgratm 32896/udp # Attachmate ID Manager
+idmgratm 32896/tcp # Attachmate ID Manager
+# George Gianelos <GeorgeGi at Attachmate.com> March 2003
+# 32897-33330 Unassigned
+diamondport 33331/udp # DiamondCentral Interface
+diamondport 33331/tcp # DiamondCentral Interface
+# Edward Browdy <ebrowdy at cryptek.com> July 2002
+# 33332-33433 Unassigned
+traceroute 33434/udp # traceroute use
+traceroute 33434/tcp # traceroute use
+# IANA <iana at iana.org>
+# 33435-34248 Unassigned
+turbonote-2 34249/udp # TurboNote Relay Server Default Port
+turbonote-2 34249/tcp # TurboNote Relay Server Default Port
+# Peter Hyde <peter at spis.co.nz>
+# 34250-36864 Unassigned
+kastenxpipe 36865/udp # KastenX Pipe
+kastenxpipe 36865/tcp # KastenX Pipe
+# Guy Cheng <GCHE at kastenchase.com>
+# 36866-37474 Unassigned
+neckar 37475/udp # science + computing's Venus Administration Port
+neckar 37475/tcp # science + computing's Venus Administration Port
+# Ralf Allrutz <R.Allrutz at science-computing.de> February 2002
+# 37476-38200 Unassigned
+galaxy7-data 38201/udp # Galaxy7 Data Tunnel
+galaxy7-data 38201/tcp # Galaxy7 Data Tunnel
+# Tatham Oddie <tatham at e-oddie.com> September 2002
+# 38202-39680 Unassigned
+turbonote-1 39681/udp # TurboNote Default Port
+turbonote-1 39681/tcp # TurboNote Default Port
+# Peter Hyde <peter at spis.co.nz>
+# 39682-40840 Unassigned
+cscp 40841/udp # CSCP
+cscp 40841/tcp # CSCP
+# Michael Dodge <sarge at centerspan.com>
+csccredir 40842/udp # CSCCREDIR
+csccredir 40842/tcp # CSCCREDIR
+csccfirewall 40843/udp # CSCCFIREWALL
+csccfirewall 40843/tcp # CSCCFIREWALL
+# Sudhir Menon <sudhir at centerspan.com>
+# 40844-41110 Unassigned
+fs-qos 41111/udp # Foursticks QoS Protocol
+fs-qos 41111/tcp # Foursticks QoS Protocol
+# Chee Kent Lam <cklam at foursticks.com> April 2002
+# 41112-41793 Unassigned
+crestron-cip 41794/udp # Crestron Control Port
+crestron-cip 41794/tcp # Crestron Control Port
+crestron-ctp 41795/udp # Crestron Terminal Port
+crestron-ctp 41795/tcp # Crestron Terminal Port
+# Ed Ranney <eranney at crestron.com> January 2003
+# 41796-43187 Unassigned
+reachout 43188/udp # REACHOUT
+reachout 43188/tcp # REACHOUT
+ndm-agent-port 43189/udp # NDM-AGENT-PORT
+ndm-agent-port 43189/tcp # NDM-AGENT-PORT
+ip-provision 43190/udp # IP-PROVISION
+ip-provision 43190/tcp # IP-PROVISION
+# Roman Kriis <roman at previo.ee>
+# 43191-44320 Unassigned
+pmcd 44321/udp # PCP server (pmcd)
+pmcd 44321/tcp # PCP server (pmcd)
+# Ken McDonell <kenmcd at sgi.com> June 2002
+# 44322-44817 Unassigned
+rockwell-encap 44818/udp # Rockwell Encapsulation
+rockwell-encap 44818/tcp # Rockwell Encapsulation
+# Brian Batke <babatke at ra.rockwell.com>
+# 44819-45053 Unassigned
+invision-ag 45054/udp # InVision AG
+invision-ag 45054/tcp # InVision AG
+# Matthias Schroer <matthias.schroer at invision.de>
+# 45055-45677 Unassigned
+eba 45678/udp # EBA PRISE
+eba 45678/tcp # EBA PRISE
+# Patrick Kara <Patrick at EBA.NET>
+# 45679-45965 Unassigned
+ssr-servermgr 45966/udp # SSRServerMgr
+ssr-servermgr 45966/tcp # SSRServerMgr
+# Jeremy Gilliat <jeremy.gilliat at geac.com>
+# 45967-46999 Unassigned
+mbus 47000/udp # Message Bus
+mbus 47000/tcp # Message Bus
+# Dirk Kutscher <dku at informatik.uni-bremen.de>
+# 47001-47556 Unassigned
+dbbrowse 47557/udp # Databeam Corporation
+dbbrowse 47557/tcp # Databeam Corporation
+# Cindy Martin <cmartin at databeam.com>
+# 47558-47623 Unassigned
+directplaysrvr 47624/udp # Direct Play Server
+directplaysrvr 47624/tcp # Direct Play Server
+# Ajay Jindal <ajayj at microsoft.com>
+# 47625-47805 Unassigned
+ap 47806/udp # ALC Protocol
+ap 47806/tcp # ALC Protocol
+# Andrew Newton <alnewton at automatedlogic.com>
+# 47807 Unassigned
+bacnet 47808/udp # Building Automation and Control Networks
+bacnet 47808/tcp # Building Automation and Control Networks
+# H. Michael Newman <hmn2 at cornell.edu>
+# 47809-47999 Unassigned
+nimcontroller 48000/udp # Nimbus Controller
+nimcontroller 48000/tcp # Nimbus Controller
+nimspooler 48001/udp # Nimbus Spooler
+nimspooler 48001/tcp # Nimbus Spooler
+nimhub 48002/udp # Nimbus Hub
+nimhub 48002/tcp # Nimbus Hub
+nimgtw 48003/udp # Nimbus Gateway
+nimgtw 48003/tcp # Nimbus Gateway
+# Carstein Seeberg <case at nimsoft.no>
+# 48004-48555 Unassigned
+com-bardac-dw 48556/udp # com-bardac-dw
+com-bardac-dw 48556/tcp # com-bardac-dw
+# Nicholas J Howes <nick at ghostwood.org>
+# 48557-49150 Unassigned
+# 49151 IANA Reserved
diff --git a/test/data/types/sshkey/1 b/test/data/types/sshkey/1
new file mode 100644
index 0000000..840ed19
--- /dev/null
+++ b/test/data/types/sshkey/1
@@ -0,0 +1,21 @@
+hosting2.planetargon.com,64.34.164.77 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAy+f2t52cDMrYkgEKQ6juqfMf/a0nDFry3JAzl+SAWQ0gTklVxNcVbfHx2pkZk66EBGQfrK33Bx1BflZ/iEDyiCwmzVtNba0X9A6ELYjB9WSkWdIqZCfPlKZMu9N//aZ6+3SDVuz/BVFsAVmtqQ4Let2QjOFiSIKXrtPqWvVT/MM=
+kirby.madstop.com,192.168.0.5 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAw9iHuAa/wepHoUzWqsvhQvSkpE4K7agrdLOWHM9mvyRQ2X3HVq5GqzAvWu4J+f0FvcLPwA9tivpxt1oSt5MOtvDM6HoM+8m3P4daBp0nlNaYR8/vHCAmX6N3RyM8FWfp+VqWyux1SooQwxYxVFy86G78ApTqNsZ+p7cHmnBYqk0=
+fedora1,192.168.0.51 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAyz1rKcApU4//j8CHYKexq4qnq2WVqLPrZYGnlij1t7FscLiDVKvBuRHVkfyTNIjAM/t7tM1Dj+FuD4iWziCmf7RO9q4wI5y/1zgCiSUegnZVSmH2yxnWGMdHGpXOkN3NXcpy6jylxyBo0M7T22PSezCxyUVfMclesjOEO1jETd0=
+kirby ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAw9iHuAa/wepHoUzWqsvhQvSkpE4K7agrdLOWHM9mvyRQ2X3HVq5GqzAvWu4J+f0FvcLPwA9tivpxt1oSt5MOtvDM6HoM+8m3P4daBp0nlNaYR8/vHCAmX6N3RyM8FWfp+VqWyux1SooQwxYxVFy86G78ApTqNsZ+p7cHmnBYqk0=
+sol10b,192.168.0.50 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAs37kiDwKxWqi6EfSdKwRaZXBwh2doOARRqZzyitBaPwESy26DwTx+xdQ2rwB4V2k1WIec+1f3bgTS2ArH75dQSPyba2HKqxaSRBd3Zh4z23+uUxpupEyoRdW1HolMOvuoceheSMsruiuYcuiyct41d4c/Qmr51Dv04Doi00k6Ws=
+piratehaven.org,64.81.59.88 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA7TYRRkle0wDNohZ0TNZN6R1Zp0svxgX+GJ9umI5yNM1bMxUTgeNRh5nIvZg1HgD1WRXQ57dSxxLzbvRyAqc245g6S8eWWCtenvOFLl0rOF5D3VxbQuw79sOe8/Ac8TC+c8RuWB7aaxpwL5Rv9xfDeazOtoKXj7+uwQW1PUmTaEM=
+atalanta,192.168.0.10 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAysniuWiJH6OQLXl63XXcS1b/hP2lAgSz0IutjQ6ZUfBrt1BZ8udEgSh57w5QDLsZ1lNvND61u5cy6iDKXI5TIQY4DvUmsoFZhyr4iYJbtT/h6UJSyaZtEnA7ZMRjGhUIMOn+mjbj7Z3zmJMhxtImK3Xo3O2fJ1hnK4jsBwQPSLc=
+pixie,192.168.0.9 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAzDp588CvET6w11LB2s/vPjc4tX9+u46iYJgNFfhzxrXYMVv4GF7d30IXB5+Hwyi2FOQIG1+h0kUXVGWEv64rAFBT7pD2KMFX0lcDERV4avqT0TRDIIA5OqFOhq9Ff+kOmHS2cB7eFyR5vqbN4ujOnJGTmru9dcqyL+2AcFekvh0=
+culain,192.168.0.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvJ/IORhQMdAsJ7LB1sI2LlWUHc7HPTCDiEgJ96ij3jFvqaIiYieRFaNkxbbk75mPkj3vIqWIgAsAtHmKX4wDikNG/gyjs4WM4cWFKtl2jiVhqpoxqqCaVxs6Ex+vpKuKhQR6SzFBFDlBZYP9an6DPu1msTLT8/hZH2WwswVmpyU=
+cs312-server.een.orst.edu,128.193.40.66 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA+t3hsOiyp1mztt013bLdJqIAFCo8lxlz86MYEPz/mADHzWLs3Xv7xpAUv/E8pRbhEOzXo84EddORRBXz6DgVyMah8+v/u3IOkpXuZI0Iu1n5hZyf2l5DGEyGecr3oqqjUdMuM9HeXFLnqXJI3hDE7civBtqf5AJSol+TCcipeE8=
+freebsd1,192.168.0.52 ssh-dss AAAAB3NzaC1kc3MAAACBAJSiOyQhYlKAi0FDLKy42VzLDq6yJWXGXVCLSfgWyVx7QCq/3+W3C1dtHuAvjbypcjqqvsuGGITgQ1Y6B/+76n5d7FyQnj4SFZ5drOBn/TvslXhrS/Ok5KCcndfNAa+EyMnSZJ21jhoRjZftY4lmb4hy6fEF3RvjuOdf1qBN5FWpAAAAFQDcsWF0zELAW6YUlSjAyO0T0lfPbwAAAIAlOLdOd/WszzVaplCOnH5vF6LWfr6BosZKDkFi0mv6Ec636YGaj4AMxK8sRPusHv6sVByN17ntIJnLo2XD1SuoH28bZ0ZnPIdVnd0l1KqsOCuuow9LZYJUihezoUuYuTvij1jZdrwltuPNJTVLYtsZDnKE5plw+Tjzeb7ImjbXGwAAAIBT40olg3fxhRDiZECle0WK7GitgXCB3njs+4dba8VwveEJb9UuulMc1eR+zQiJR96IUBagC9NiLvUGS1IfiIHpT4FA8O/MK1W9SgxXB9d39Nk/9l8dH3U/fLnbC/hYVo8bN0or/mKxcxQMkdBwpPlWAbELRftod2BkkkvgfQdc+g==
+192.168.0.2 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCZ+qxpMMRJ3otGsjaYeKTKf6tuCZyK1cD+ns9Eu7V0ZJLJ/LLMxduu7n4H/ufGI5rGV5axzgx8yZhjDRzsrGjLAQYsqlomMkf901YQI6UuieSA4MZa5MDkq/Jt6Vx1kEGTpkgrfw9kRMX5BngECt1QKY4xTgC7Ex+WlFvZwk+tRUT3
+openbsd1,192.168.0.54 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvgRVrtJk0fBg9YsLf7rWR1X32ZjFcva5XBvenDlHruObaHzuGXyyr6iOCAEOc7eCZjlPBYrGZ2potqyk8HlBOHXr1cCBf49t4yAt8KgKswtzWlgdbU1UEwllSRVOpzqULAT0smv/jfaIZdvRoN1rLriqtpn4bQL//ZOHiyXCwdlJ+di8Mza2L8KZ5T75hwIFBhrgL12xfymRp3v+Iy21MjjzsF3pROIkZ7icitNqQF55U9vsHaA37vG8FepVkO10bYYP7IHPZaBPBMPx7qPyRgRDJahEUGBnkIkzwJHEmA+7YMiNTZu6MigezD+CIqY1xOi/eXZwObLwLKXo7eRmpw==
+192.168.0.60 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAufcvE7s1eRwhUwMBfZ6uFNxkdSdzjSDEn3vjByOjG/eraNhnYAW3rxV7WIf2pEa6JSOMrE1mqsEL75xEtpXlzC949Ysz4+1OSHY52KonoFm/a+FbmbFp81TVuVPYaLoeWN27STiJh+puC5spkIZe0laqT1GU13M4gj6B+j3NLhU=
+rh3a,192.168.0.55 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAufcvE7s1eRwhUwMBfZ6uFNxkdSdzjSDEn3vjByOjG/eraNhnYAW3rxV7WIf2pEa6JSOMrE1mqsEL75xEtpXlzC949Ysz4+1OSHY52KonoFm/a+FbmbFp81TVuVPYaLoeWN27STiJh+puC5spkIZe0laqT1GU13M4gj6B+j3NLhU=
+tsetse,192.168.0.7 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwCDGn82BEMSCfcE2LZKcwdAoyIBC+u2twVwWNRm3KzyrJMQ+RbTQo4AwGOdyr/QYh6KaxTKTSoDtiBLr132uenMQKwF47gCKMA1T47uiy+TBUehgOGwOxteSYP/pQRpKXFmhOppSPyDPQVq234XvANeJp0iT8ZKEhF2FsWTs6sM=
+config.sage.org,131.106.3.205 ssh-dss AAAAB3NzaC1kc3MAAACBAL2akEcIfQsfm3zCd2hD6PgH3kWA/tqX/qbrLhL/ipX7iqK/y282GMClZQSQjc1YNi9virvLzb6u/gdZxicZ8K5O3FaJrULQJOZaP62SOHk5CUSHVnvpMCaCnbwB6gEHa2LeMWStcEfWW+g1CC2hzPJw16/S5GISGXbyanO02MnXAAAAFQDomwx/OCjTmmQljMTU5rgNn2E4gwAAAIBmtMSfcs2Tq5iFFKK5cahluv047vVNfXqYIAkeJniceL0Et16MKfuzadpq0H9ocxQYW/5Ir9nUULrdxBUN9LxNKq15/uWkJC9QCSh8PysgvFnjVZeCODua/dn6eZTZnY9DZ3S6v1pT8CP6uWr5fmZJ8FKJGrC3gYX4y1V1ZTCVewAAAIB6e7RCST6vkTS5rgn5wGbrfLK5ad+PW+2i66k77Zv1pjtfRz+0oejBjwJDPNVSc2YNEl7X0nEEMNjo/a5x8Ls+nVqhzJA+NXIwS1e/moKbXFGewW5HAtxd79gtInC8dEIO7hmnWnqF1dBkRHXg1YffYkHrMVJBxpzagw7nYa0BBQ==
+rh3b,192.168.0.56 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAufcvE7s1eRwhUwMBfZ6uFNxkdSdzjSDEn3vjByOjG/eraNhnYAW3rxV7WIf2pEa6JSOMrE1mqsEL75xEtpXlzC949Ysz4+1OSHY52KonoFm/a+FbmbFp81TVuVPYaLoeWN27STiJh+puC5spkIZe0laqT1GU13M4gj6B+j3NLhU=
+centos1,192.168.0.57 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA0DXqYF+3Lf68GkWBAjjKBb6UITNnzm4wiDi/AGjv5+DoVXqDcqHvZ8rZFAMgUe1dVob4pWT2ZWLHW0gicoJCdr4UQbPXlWz1F62z8fo2PRRPlG6KN1wmF7pnyml8jr0wBX8lQZJsMqi4InGozf7wFHLH/7DNGRK3MD6tSp3Z4is=
+doorstop.cafes.net,205.241.238.186 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEApJKeB9/bN5t55zLETHs0MVo/vEkfQ3EzY7178GKLI/yiOFmcn+NvUvUtCQK/xKpod813LBHCODxZPG1Kb0SjlaC/EkFEenb74LNu0o1qXa1GWh3wfaIm0JRNjXqPqxAWTlMs43O2HXwOwmLVhl7SSP3xtTw6h9gREbVKmfBaRdsRfzD0etfz1NCnmGh/1Sh9+j4eeS+IBtwoR5JVhZVhuofHCqs5HZ8gLDgfn8HXP7pMbLkx54cf1R/tmFmn9JGLdTPtEGcSIiu7414XSbfChSC83rGZCDPKHq7ZodiE8GpbWLBnyPXi2AYxTPM7aZMqitIHv3MWf5suV0q0WLGdnQ==
+host.domain.com,host1.domain.com,192.168.0.1 dss thisismykey1
diff --git a/test/data/types/yumrepos/fedora-devel.repo b/test/data/types/yumrepos/fedora-devel.repo
new file mode 100644
index 0000000..ebb150b
--- /dev/null
+++ b/test/data/types/yumrepos/fedora-devel.repo
@@ -0,0 +1,26 @@
+[development]
+# These packages are untested and still under development. This
+# repository is used for updates to test releases, and for
+# development of new releases.
+#
+# This repository can see significant daily turn over and can see major
+# functionality changes which cause unexpected problems with other
+# development packages. Please use these packages if you want to work
+# with the Fedora developers by testing these new development packages.
+#
+# fedora-test-list at redhat.com is available as a discussion forum for
+# testing and troubleshooting for development packages in conjunction
+# with new test releases.
+#
+# fedora-devel-list at redhat.com is available as a discussion forum for
+# testing and troubleshooting for development packages in conjunction
+# with developing new releases.
+#
+# Reportable issues should be filed at bugzilla.redhat.com
+# Product: Fedora Core
+# Version: devel
+name=Fedora Core $releasever - Development Tree
+#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/$basearch/
+mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-rawhide
+enabled=0
+gpgcheck=0
diff --git a/test/data/types/yumrepos/fedora.repo b/test/data/types/yumrepos/fedora.repo
new file mode 100644
index 0000000..995fa68
--- /dev/null
+++ b/test/data/types/yumrepos/fedora.repo
@@ -0,0 +1,9 @@
+[base]
+name=Fedora Core $releasever - $basearch - Base
+mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-$releasever
+enabled=1
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
+exclude=foo
+ bar
+ baz
diff --git a/test/executables/puppetbin.rb b/test/executables/puppetbin.rb
index 218787c..08329ef 100755
--- a/test/executables/puppetbin.rb
+++ b/test/executables/puppetbin.rb
@@ -83,5 +83,22 @@ class TestPuppetBin < Test::Unit::TestCase
assert(FileTest.exists?(path), "Failed to create config'ed file")
end
+
+ def test_parseonly
+ path = tempfile()
+ manifest = tempfile()
+ puppet = %x{which puppet}.chomp
+ if puppet == ""
+ Puppet.info "cannot find puppet; cannot test parseonly"
+ return
+ end
+ code = 'File <<| |>>
+ include nosuchclass'
+
+ assert_nothing_raised {
+ IO.popen("#{puppet} --parseonly", 'w') { |p| p.puts code }
+ }
+ assert($? == 0, "parseonly test exited with code %s" % $?.to_i)
+ end
end
diff --git a/test/language/ast.rb b/test/language/ast.rb
index b31012d..8c0f31a 100755
--- a/test/language/ast.rb
+++ b/test/language/ast.rb
@@ -35,14 +35,14 @@ class TestAST < Test::Unit::TestCase
# We initialized it to true, so we should get that first
ret = nil
assert_nothing_raised {
- ret = astif.evaluate(:scope => "yay")
+ ret = astif.evaluate("yay")
}
assert_equal(:if, ret)
# Now set it to false and check that
faketest.evaluate = false
assert_nothing_raised {
- ret = astif.evaluate(:scope => "yay")
+ ret = astif.evaluate("yay")
}
assert_equal(:else, ret)
end
@@ -57,10 +57,10 @@ class TestAST < Test::Unit::TestCase
end
Puppet::Parser::Resource.expects(:new).with { |o| o.is_a?(Hash) }.returns(:override)
- scope.compile.expects(:store_override).with(:override)
+ scope.compiler.expects(:add_override).with(:override)
ret = nil
assert_nothing_raised do
- ret = ref.evaluate :scope => scope
+ ret = ref.evaluate scope
end
assert_equal(:override, ret, "Did not return override")
@@ -74,7 +74,7 @@ class TestAST < Test::Unit::TestCase
args = {:source => "/yay/ness", :group => "yayness"}
assert_nothing_raised do
obj = defaultobj "file", args
- obj.evaluate :scope => scope
+ obj.evaluate scope
end
hash = nil
@@ -93,56 +93,6 @@ class TestAST < Test::Unit::TestCase
end
end
- def test_node
- scope = mkscope
- parser = scope.compile.parser
-
- # Define a base node
- basenode = parser.newnode "basenode", :code => AST::ASTArray.new(:children => [
- resourcedef("file", "/tmp/base", "owner" => "root")
- ])
-
- # Now define a subnode
- nodes = parser.newnode ["mynode", "othernode"],
- :code => AST::ASTArray.new(:children => [
- resourcedef("file", "/tmp/mynode", "owner" => "root"),
- resourcedef("file", "/tmp/basenode", "owner" => "daemon")
- ])
-
- assert_instance_of(Array, nodes)
-
- # Make sure we can find them all.
- %w{mynode othernode}.each do |node|
- assert(parser.nodes[node], "Could not find %s" % node)
- end
- mynode = parser.nodes["mynode"]
-
- # Now try evaluating the node
- assert_nothing_raised do
- mynode.evaluate :scope => scope, :resource => scope.resource
- end
-
- # Make sure that we can find each of the files
- myfile = scope.findresource "File[/tmp/mynode]"
- assert(myfile, "Could not find file from node")
- assert_equal("root", myfile[:owner])
-
- basefile = scope.findresource "File[/tmp/basenode]"
- assert(basefile, "Could not find file from base node")
- assert_equal("daemon", basefile[:owner])
-
- # Now make sure we can evaluate nodes with parents
- child = parser.newnode(%w{child}, :parent => "basenode").shift
-
- newscope = mkscope :parser => parser
- assert_nothing_raised do
- child.evaluate :scope => newscope, :resource => scope.resource
- end
-
- assert(newscope.findresource("File[/tmp/base]"),
- "Could not find base resource")
- end
-
def test_collection
scope = mkscope
@@ -155,13 +105,13 @@ class TestAST < Test::Unit::TestCase
ret = nil
assert_nothing_raised do
- ret = coll.evaluate :scope => scope
+ ret = coll.evaluate scope
end
assert_instance_of(Puppet::Parser::Collector, ret)
# Now make sure we get it back from the scope
- colls = scope.compile.instance_variable_get("@collections")
+ colls = scope.compiler.instance_variable_get("@collections")
assert_equal([ret], colls, "Did not store collector in config's collection list")
end
@@ -175,7 +125,7 @@ class TestAST < Test::Unit::TestCase
run_collection_queries(:virtual) do |string, result, query|
code = nil
assert_nothing_raised do
- str, code = query.evaluate :scope => scope
+ str, code = query.evaluate scope
end
assert_instance_of(Proc, code)
diff --git a/test/language/ast/casestatement.rb b/test/language/ast/casestatement.rb
index 0a744b6..d95d788 100755
--- a/test/language/ast/casestatement.rb
+++ b/test/language/ast/casestatement.rb
@@ -45,7 +45,7 @@ class TestCaseStatement < Test::Unit::TestCase
result = nil
assert_nothing_raised do
- result = ast.evaluate :scope => scope
+ result = ast.evaluate scope
end
assert(result, "did not get valid result")
assert_equal(["upper"], $evaluated, "Did not match case-sensitively")
@@ -56,7 +56,7 @@ class TestCaseStatement < Test::Unit::TestCase
$evaluated.clear
hash["MyParam"].reset
assert_nothing_raised do
- result = ast.evaluate :scope => scope
+ result = ast.evaluate scope
end
assert(result, "did not get valid result")
assert_equal(["lower"], result, "Did not match case-insensitively")
@@ -92,7 +92,7 @@ class TestCaseStatement < Test::Unit::TestCase
scope = mkscope
scope.setvar("testparam", value)
assert_nothing_raised do
- result = ast.evaluate(:scope => scope)
+ result = ast.evaluate(scope)
end
assert_equal(should, result, "Got incorrect result for %s" % value)
diff --git a/test/language/ast/definition.rb b/test/language/ast/definition.rb
deleted file mode 100755
index 2a71aaa..0000000
--- a/test/language/ast/definition.rb
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/env ruby
-#
-# Created by Luke A. Kanies on 2006-02-20.
-# Copyright (c) 2006. All rights reserved.
-
-require File.dirname(__FILE__) + '/../../lib/puppettest'
-
-require 'puppettest'
-require 'mocha'
-require 'puppettest/parsertesting'
-require 'puppettest/resourcetesting'
-
-class TestASTDefinition < Test::Unit::TestCase
- include PuppetTest
- include PuppetTest::ParserTesting
- include PuppetTest::ResourceTesting
- AST = Puppet::Parser::AST
-
- def test_initialize
- parser = mkparser
-
- # Create a new definition
- klass = parser.newdefine "yayness",
- :arguments => [["owner", stringobj("nobody")], %w{mode}],
- :code => AST::ASTArray.new(
- :children => [resourcedef("file", "/tmp/$name",
- "owner" => varref("owner"), "mode" => varref("mode"))]
- )
-
- # Test validattr? a couple different ways
- [:owner, "owner", :schedule, "schedule"].each do |var|
- assert(klass.validattr?(var), "%s was not considered valid" % var.inspect)
- end
-
- [:random, "random"].each do |var|
- assert(! klass.validattr?(var), "%s was considered valid" % var.inspect)
- end
-
- end
-
- def test_evaluate
- parser = mkparser
- config = mkcompile
- config.send(:evaluate_main)
- scope = config.topscope
- klass = parser.newdefine "yayness",
- :arguments => [["owner", stringobj("nobody")], %w{mode}],
- :code => AST::ASTArray.new(
- :children => [resourcedef("file", "/tmp/$name",
- "owner" => varref("owner"), "mode" => varref("mode"))]
- )
-
- resource = Puppet::Parser::Resource.new(
- :title => "first",
- :type => "yayness",
- :exported => false,
- :virtual => false,
- :scope => scope,
- :source => scope.source
- )
- resource.send(:set_parameter, "name", "first")
- resource.send(:set_parameter, "mode", "755")
-
- resource.stubs(:title)
- assert_nothing_raised do
- klass.evaluate(:scope => scope, :resource => resource)
- end
-
- firstobj = config.findresource("File[/tmp/first]")
- assert(firstobj, "Did not create /tmp/first obj")
-
- assert_equal("File", firstobj.type)
- assert_equal("/tmp/first", firstobj.title)
- assert_equal("nobody", firstobj[:owner])
- assert_equal("755", firstobj[:mode])
-
- # Make sure we can't evaluate it with the same args
- assert_raise(Puppet::ParseError) do
- klass.evaluate(:scope => scope, :resource => resource)
- end
-
- # Now create another with different args
- resource2 = Puppet::Parser::Resource.new(
- :title => "second",
- :type => "yayness",
- :exported => false,
- :virtual => false,
- :scope => scope,
- :source => scope.source
- )
- resource2.send(:set_parameter, "name", "second")
- resource2.send(:set_parameter, "mode", "755")
- resource2.send(:set_parameter, "owner", "daemon")
-
- assert_nothing_raised do
- klass.evaluate(:scope => scope, :resource => resource2)
- end
-
- secondobj = config.findresource("File[/tmp/second]")
- assert(secondobj, "Did not create /tmp/second obj")
-
- assert_equal("File", secondobj.type)
- assert_equal("/tmp/second", secondobj.title)
- assert_equal("daemon", secondobj[:owner])
- assert_equal("755", secondobj[:mode])
- end
-
- # #539 - definitions should support both names and titles
- def test_names_and_titles
- parser = mkparser
- scope = mkscope :parser => parser
-
- [
- {:name => "one", :title => "two"},
- {:title => "mytitle"}
- ].each_with_index do |hash, i|
- # Create a definition that uses both name and title. Put this
- # inside the loop so the subscope expectations work.
- klass = parser.newdefine "yayness%s" % i
-
- resource = Puppet::Parser::Resource.new(
- :title => hash[:title],
- :type => "yayness%s" % i,
- :exported => false,
- :virtual => false,
- :scope => scope,
- :source => scope.source
- )
-
- subscope = klass.subscope(scope, resource)
-
- klass.expects(:subscope).returns(subscope)
-
- if hash[:name]
- resource.stubs(:to_hash).returns({:name => hash[:name]})
- end
-
- assert_nothing_raised("Could not evaluate definition with %s" % hash.inspect) do
- klass.evaluate(:scope => scope, :resource => resource)
- end
-
- name = hash[:name] || hash[:title]
- title = hash[:title]
-
- assert_equal(name, subscope.lookupvar("name"),
- "Name did not get set correctly")
- assert_equal(title, subscope.lookupvar("title"),
- "title did not get set correctly")
-
- [:name, :title].each do |param|
- val = resource.send(param)
- assert(subscope.tags.include?(val),
- "Scope was not tagged with %s '%s'" % [param, val])
- end
- end
- end
-
- # Testing the root cause of #615. We should be using the fqname for the type, instead
- # of just the short name.
- def test_fully_qualified_types
- parser = mkparser
- klass = parser.newclass("one::two")
-
- assert_equal("one::two", klass.classname, "Class did not get fully qualified class name")
- end
-end
diff --git a/test/language/ast/hostclass.rb b/test/language/ast/hostclass.rb
deleted file mode 100755
index 80032f3..0000000
--- a/test/language/ast/hostclass.rb
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/env ruby
-#
-# Created by Luke A. Kanies on 2006-02-20.
-# Copyright (c) 2006. All rights reserved.
-
-require File.dirname(__FILE__) + '/../../lib/puppettest'
-
-require 'puppettest'
-require 'puppettest/parsertesting'
-require 'puppettest/resourcetesting'
-require 'mocha'
-
-class TestASTHostClass < Test::Unit::TestCase
- include PuppetTest
- include PuppetTest::ParserTesting
- include PuppetTest::ResourceTesting
- AST = Puppet::Parser::AST
-
- def test_hostclass
- scope = mkscope
- parser = scope.compile.parser
-
- # Create the class we're testing, first with no parent
- klass = parser.newclass "first",
- :code => AST::ASTArray.new(
- :children => [resourcedef("file", "/tmp",
- "owner" => "nobody", "mode" => "755")]
- )
-
- resource = Puppet::Parser::Resource.new(:type => "class", :title => "first", :scope => scope)
- assert_nothing_raised do
- klass.evaluate(:scope => scope, :resource => resource)
- end
-
- # Then try it again
- assert_nothing_raised do
- klass.evaluate(:scope => scope, :resource => resource)
- end
-
- assert(scope.compile.class_scope(klass), "Class was not considered evaluated")
-
- tmp = scope.findresource("File[/tmp]")
- assert(tmp, "Could not find file /tmp")
- assert_equal("nobody", tmp[:owner])
- assert_equal("755", tmp[:mode])
-
- # Now create a couple more classes.
- newbase = parser.newclass "newbase",
- :code => AST::ASTArray.new(
- :children => [resourcedef("file", "/tmp/other",
- "owner" => "nobody", "mode" => "644")]
- )
-
- newsub = parser.newclass "newsub",
- :parent => "newbase",
- :code => AST::ASTArray.new(
- :children => [resourcedef("file", "/tmp/yay",
- "owner" => "nobody", "mode" => "755"),
- resourceoverride("file", "/tmp/other",
- "owner" => "daemon")
- ]
- )
-
- # Override a different variable in the top scope.
- moresub = parser.newclass "moresub",
- :parent => "newbase",
- :code => AST::ASTArray.new(
- :children => [resourceoverride("file", "/tmp/other",
- "mode" => "755")]
- )
-
- assert_nothing_raised do
- newsub.evaluate(:scope => scope, :resource => resource)
- end
-
- assert_nothing_raised do
- moresub.evaluate(:scope => scope, :resource => resource)
- end
-
- assert(scope.compile.class_scope(newbase), "Did not eval newbase")
- assert(scope.compile.class_scope(newsub), "Did not eval newsub")
-
- yay = scope.findresource("File[/tmp/yay]")
- assert(yay, "Did not find file /tmp/yay")
- assert_equal("nobody", yay[:owner])
- assert_equal("755", yay[:mode])
-
- other = scope.findresource("File[/tmp/other]")
- assert(other, "Did not find file /tmp/other")
- assert_equal("daemon", other[:owner])
- assert_equal("755", other[:mode])
- end
-
- # Make sure that classes set their namespaces to themselves. This
- # way they start looking for definitions in their own namespace.
- def test_hostclass_namespace
- scope = mkscope
- parser = scope.compile.parser
-
- # Create a new class
- klass = nil
- assert_nothing_raised do
- klass = parser.newclass "funtest"
- end
-
- # Now define a definition in that namespace
-
- define = nil
- assert_nothing_raised do
- define = parser.newdefine "funtest::mydefine"
- end
-
- assert_equal("funtest", klass.namespace,
- "component namespace was not set in the class")
-
- assert_equal("funtest", define.namespace,
- "component namespace was not set in the definition")
-
- newscope = klass.subscope(scope, mock("resource"))
-
- assert_equal(["funtest"], newscope.namespaces,
- "Scope did not inherit namespace")
-
- # Now make sure we can find the define
- assert(newscope.finddefine("mydefine"),
- "Could not find definition in my enclosing class")
- end
-
- # Make sure that our scope is a subscope of the parentclass's scope.
- # At the same time, make sure definitions in the parent class can be
- # found within the subclass (#517).
- def test_parent_scope_from_parentclass
- scope = mkscope
- parser = scope.compile.parser
-
- source = parser.newclass ""
- parser.newclass("base")
- fun = parser.newdefine("base::fun")
- parser.newclass("middle", :parent => "base")
- parser.newclass("sub", :parent => "middle")
- scope = mkscope :parser => parser
-
- ret = nil
- assert_nothing_raised do
- ret = scope.compile.evaluate_classes(["sub"], scope)
- end
- scope.compile.send(:evaluate_generators)
-
- subscope = scope.compile.class_scope(scope.findclass("sub"))
- assert(subscope, "could not find sub scope")
- mscope = scope.compile.class_scope(scope.findclass("middle"))
- assert(mscope, "could not find middle scope")
- pscope = scope.compile.class_scope(scope.findclass("base"))
- assert(pscope, "could not find parent scope")
-
- assert(pscope == mscope.parent, "parent scope of middle was not set correctly")
- assert(mscope == subscope.parent, "parent scope of sub was not set correctly")
-
- result = mscope.finddefine("fun")
- assert(result, "could not find parent-defined definition from middle")
- assert(fun == result, "found incorrect parent-defined definition from middle")
-
- result = subscope.finddefine("fun")
- assert(result, "could not find parent-defined definition from sub")
- assert(fun == result, "found incorrect parent-defined definition from sub")
- end
-
- # #795 - make sure the subclass's tags get set before we
- # evaluate the parent class, so we can be sure that the parent
- # class can switch based on the sub classes.
- def test_tags_set_before_parent_is_evaluated
- scope = mkscope
- parser = scope.compile.parser
- base = parser.newclass "base"
- sub = parser.newclass "sub", :parent => "base"
-
- base.expects(:safeevaluate).with do |args|
- assert(scope.compile.catalog.tags.include?("sub"), "Did not tag with sub class name before evaluating base class")
- base.evaluate(args)
- true
- end
- sub.evaluate :scope => scope, :resource => scope.resource
- end
-end
diff --git a/test/language/ast/resource.rb b/test/language/ast/resource.rb
index c99d98e..97541d9 100755
--- a/test/language/ast/resource.rb
+++ b/test/language/ast/resource.rb
@@ -16,8 +16,7 @@ class TestASTResource< Test::Unit::TestCase
def setup
super
@scope = mkscope
- @parser = @scope.compile.parser
- @scope.compile.send(:evaluate_main)
+ @parser = @scope.compiler.parser
end
def newdef(type, title, params = nil)
@@ -36,24 +35,24 @@ class TestASTResource< Test::Unit::TestCase
title = "title"
# First try a qualified type
- assert_equal("One::Two", newdef("two", title).evaluate(:scope => twoscope)[0].type,
+ assert_equal("One::Two", newdef("two", title).evaluate(twoscope)[0].type,
"Defined type was not made fully qualified")
# Then try a type that does not need to be qualified
- assert_equal("One", newdef("one", title).evaluate(:scope => twoscope)[0].type,
+ assert_equal("One", newdef("one", title).evaluate(twoscope)[0].type,
"Unqualified defined type was not handled correctly")
# Then an unqualified type from within the one namespace
- assert_equal("Three", newdef("three", title).evaluate(:scope => twoscope)[0].type,
+ assert_equal("Three", newdef("three", title).evaluate(twoscope)[0].type,
"Defined type was not made fully qualified")
# Then a builtin type
- assert_equal("File", newdef("file", title).evaluate(:scope => twoscope)[0].type,
+ assert_equal("File", newdef("file", title).evaluate(twoscope)[0].type,
"Builtin type was not handled correctly")
# Now try a type that does not exist, which should throw an error.
assert_raise(Puppet::ParseError, "Did not fail on a missing type in a resource reference") do
- newdef("nosuchtype", title).evaluate(:scope => twoscope)
+ newdef("nosuchtype", title).evaluate(twoscope)
end
end
end
diff --git a/test/language/ast/resource_reference.rb b/test/language/ast/resource_reference.rb
index c9fde07..1f554d9 100755
--- a/test/language/ast/resource_reference.rb
+++ b/test/language/ast/resource_reference.rb
@@ -20,7 +20,7 @@ class TestASTResourceReference < Test::Unit::TestCase
def setup
super
@scope = mkscope
- @parser = @scope.compile.parser
+ @parser = @scope.compiler.parser
end
def test_evaluate
@@ -31,7 +31,7 @@ class TestASTResourceReference < Test::Unit::TestCase
evaled = nil
assert_nothing_raised("Could not evaluate resource ref") do
- evaled = ref.evaluate(:scope => @scope)
+ evaled = ref.evaluate(@scope)
end
assert_equal(type, evaled.type, "Type did not translate correctly")
@@ -44,7 +44,7 @@ class TestASTResourceReference < Test::Unit::TestCase
ref = newref("Class", "one")
evaled = nil
assert_nothing_raised("Could not evaluate resource ref") do
- evaled = ref.evaluate(:scope => @scope)
+ evaled = ref.evaluate(@scope)
end
assert_equal("Class", evaled.type, "Did not set type to 'class'")
@@ -61,24 +61,24 @@ class TestASTResourceReference < Test::Unit::TestCase
title = "title"
# First try a qualified type
- assert_equal("One::Two", newref("two", title).evaluate(:scope => twoscope).type,
+ assert_equal("One::Two", newref("two", title).evaluate(twoscope).type,
"Defined type was not made fully qualified")
# Then try a type that does not need to be qualified
- assert_equal("One", newref("one", title).evaluate(:scope => twoscope).type,
+ assert_equal("One", newref("one", title).evaluate(twoscope).type,
"Unqualified defined type was not handled correctly")
# Then an unqualified type from within the one namespace
- assert_equal("Three", newref("three", title).evaluate(:scope => twoscope).type,
+ assert_equal("Three", newref("three", title).evaluate(twoscope).type,
"Defined type was not made fully qualified")
# Then a builtin type
- assert_equal("File", newref("file", title).evaluate(:scope => twoscope).type,
+ assert_equal("File", newref("file", title).evaluate(twoscope).type,
"Builtin type was not handled correctly")
# Now try a type that does not exist, which should throw an error.
assert_raise(Puppet::ParseError, "Did not fail on a missing type in a resource reference") do
- newref("nosuchtype", title).evaluate(:scope => twoscope)
+ newref("nosuchtype", title).evaluate(twoscope)
end
# Now run the same tests, but with the classes
@@ -86,20 +86,20 @@ class TestASTResourceReference < Test::Unit::TestCase
@parser.newclass "one::five"
# First try an unqualified type
- assert_equal("four", newref("class", "four").evaluate(:scope => twoscope).title,
+ assert_equal("four", newref("class", "four").evaluate(twoscope).title,
"Unqualified class was not found")
# Then a qualified class
- assert_equal("one::five", newref("class", "five").evaluate(:scope => twoscope).title,
+ assert_equal("one::five", newref("class", "five").evaluate(twoscope).title,
"Class was not made fully qualified")
# Then try a type that does not need to be qualified
- assert_equal("four", newref("class", "four").evaluate(:scope => twoscope).title,
+ assert_equal("four", newref("class", "four").evaluate(twoscope).title,
"Unqualified class was not handled correctly")
# Now try a type that does not exist, which should throw an error.
assert_raise(Puppet::ParseError, "Did not fail on a missing type in a resource reference") do
- newref("class", "nosuchclass").evaluate(:scope => twoscope)
+ newref("class", "nosuchclass").evaluate(twoscope)
end
end
end
diff --git a/test/language/ast/selector.rb b/test/language/ast/selector.rb
index 535fcbf..6e923bd 100755
--- a/test/language/ast/selector.rb
+++ b/test/language/ast/selector.rb
@@ -37,7 +37,7 @@ class TestSelector < Test::Unit::TestCase
params = maker.call()
sel = AST::Selector.new(:param => param, :values => params.values)
result = nil
- assert_nothing_raised { result = sel.evaluate(:scope => scope) }
+ assert_nothing_raised { result = sel.evaluate(scope) }
assert_equal(should[str], result, "did not case-sensitively match %s" % str)
end
@@ -53,7 +53,7 @@ class TestSelector < Test::Unit::TestCase
params.delete(:upper)
sel = AST::Selector.new(:param => param, :values => params.values)
result = nil
- assert_nothing_raised { result = sel.evaluate(:scope => scope) }
+ assert_nothing_raised { result = sel.evaluate(scope) }
assert_equal("lower", result, "did not case-insensitively match %s" % str)
end
end
diff --git a/test/language/ast/variable.rb b/test/language/ast/variable.rb
index 09122ce..bde397b 100755
--- a/test/language/ast/variable.rb
+++ b/test/language/ast/variable.rb
@@ -22,9 +22,9 @@ class TestVariable < Test::Unit::TestCase
end
def test_evaluate
- assert_equal("", @var.evaluate(:scope => @scope), "did not return empty string on unset var")
+ assert_equal("", @var.evaluate(@scope), "did not return empty string on unset var")
@scope.setvar(@name, "something")
- assert_equal("something", @var.evaluate(:scope => @scope), "incorrect variable value")
+ assert_equal("something", @var.evaluate(@scope), "incorrect variable value")
end
end
diff --git a/test/language/compile.rb b/test/language/compile.rb
deleted file mode 100755
index 298493c..0000000
--- a/test/language/compile.rb
+++ /dev/null
@@ -1,569 +0,0 @@
-#!/usr/bin/env ruby
-
-require File.dirname(__FILE__) + '/../lib/puppettest'
-
-require 'mocha'
-require 'puppettest'
-require 'puppettest/parsertesting'
-require 'puppet/parser/compile'
-
-# Test our compile object.
-class TestCompile < Test::Unit::TestCase
- include PuppetTest
- include PuppetTest::ParserTesting
-
- Compile = Puppet::Parser::Compile
- Scope = Puppet::Parser::Scope
- Node = Puppet::Network::Handler.handler(:node)
- SimpleNode = Puppet::Node
-
- def mknode(name = "foo")
- @node = SimpleNode.new(name)
- end
-
- def mkparser
- # This should mock an interpreter
- @parser = stub 'parser', :version => "1.0", :nodes => {}
- end
-
- def mkcompile(options = {})
- if node = options[:node]
- options.delete(:node)
- else
- node = mknode
- end
- @compile = Compile.new(node, mkparser, options)
- end
-
- def test_initialize
- compile = nil
- node = stub 'node', :name => "foo"
- parser = stub 'parser', :version => "1.0", :nodes => {}
- assert_nothing_raised("Could not init compile with all required options") do
- compile = Compile.new(node, parser)
- end
-
- assert_equal(node, compile.node, "Did not set node correctly")
- assert_equal(parser, compile.parser, "Did not set parser correctly")
-
- # We're not testing here whether we call initvars, because it's too difficult to
- # mock.
-
- # Now try it with some options
- assert_nothing_raised("Could not init compile with extra options") do
- compile = Compile.new(node, parser)
- end
-
- assert_equal(false, compile.ast_nodes?, "Did not set ast_nodes? correctly")
- end
-
- def test_initvars
- compile = mkcompile
- [:class_scopes, :resource_table, :exported_resources, :resource_overrides].each do |table|
- assert_instance_of(Hash, compile.send(:instance_variable_get, "@#{table}"), "Did not set %s table correctly" % table)
- end
- assert_instance_of(Scope, compile.topscope, "Did not create a topscope")
- graph = compile.instance_variable_get("@scope_graph")
- assert_instance_of(GRATR::Digraph, graph, "Did not create scope graph")
- assert(graph.vertex?(compile.topscope), "Did not add top scope as a vertex in the graph")
- end
-
- # Make sure we store and can retrieve references to classes and their scopes.
- def test_class_set_and_class_scope
- klass = mock 'ast_class'
- klass.expects(:classname).returns("myname")
-
- compile = mkcompile
- compile.catalog.expects(:tag).with("myname")
-
- assert_nothing_raised("Could not set class") do
- compile.class_set "myname", "myscope"
- end
- # First try to retrieve it by name.
- assert_equal("myscope", compile.class_scope("myname"), "Could not retrieve class scope by name")
-
- # Then by object
- assert_equal("myscope", compile.class_scope(klass), "Could not retrieve class scope by object")
- end
-
- def test_classlist
- compile = mkcompile
-
- compile.class_set "", "empty"
- compile.class_set "one", "yep"
- compile.class_set "two", "nope"
-
- # Make sure our class list is correct
- assert_equal(%w{one two}.sort, compile.classlist.sort, "Did not get correct class list")
- end
-
- # Make sure collections get added to our internal array
- def test_add_collection
- compile = mkcompile
- assert_nothing_raised("Could not add collection") do
- compile.add_collection "nope"
- end
- assert_equal(%w{nope}, compile.instance_variable_get("@collections"), "Did not add collection")
- end
-
- # Make sure we create a graph of scopes.
- def test_newscope
- compile = mkcompile
- graph = compile.instance_variable_get("@scope_graph")
- assert_instance_of(Scope, compile.topscope, "Did not create top scope")
- assert_instance_of(GRATR::Digraph, graph, "Did not create graph")
-
- assert(graph.vertex?(compile.topscope), "The top scope is not a vertex in the graph")
-
- # Now that we've got the top scope, create a new, subscope
- subscope = nil
- assert_nothing_raised("Could not create subscope") do
- subscope = compile.newscope(compile.topscope)
- end
- assert_instance_of(Scope, subscope, "Did not create subscope")
- assert(graph.edge?(compile.topscope, subscope), "An edge between top scope and subscope was not added")
-
- # Make sure a scope can find its parent.
- assert(compile.parent(subscope), "Could not look up parent scope on compile")
- assert_equal(compile.topscope.object_id, compile.parent(subscope).object_id, "Did not get correct parent scope from compile")
- assert_equal(compile.topscope.object_id, subscope.parent.object_id, "Scope did not correctly retrieve its parent scope")
-
- # Now create another, this time specifying options
- another = nil
- assert_nothing_raised("Could not create subscope") do
- another = compile.newscope(subscope, :level => 5)
- end
- assert_equal(5, another.level, "did not set scope option correctly")
- assert_instance_of(Scope, another, "Did not create second subscope")
- assert(graph.edge?(subscope, another), "An edge between parent scope and second subscope was not added")
-
- # Make sure it can find its parent.
- assert(compile.parent(another), "Could not look up parent scope of second subscope on compile")
- assert_equal(subscope.object_id, compile.parent(another).object_id, "Did not get correct parent scope of second subscope from compile")
- assert_equal(subscope.object_id, another.parent.object_id, "Second subscope did not correctly retrieve its parent scope")
-
- # And make sure both scopes show up in the right order in the search path
- assert_equal([another.object_id, subscope.object_id, compile.topscope.object_id], another.scope_path.collect { |p| p.object_id },
- "Did not get correct scope path")
- end
-
- # The heart of the action.
- def test_compile
- compile = mkcompile
- [:set_node_parameters, :evaluate_main, :evaluate_ast_node, :evaluate_node_classes, :evaluate_generators, :fail_on_unevaluated, :finish].each do |method|
- compile.expects(method)
- end
- assert_instance_of(Puppet::Node::Catalog, compile.compile, "Did not return the catalog")
- end
-
- # Test setting the node's parameters into the top scope.
- def test_set_node_parameters
- compile = mkcompile
- @node.parameters = {"a" => "b", "c" => "d"}
- scope = compile.topscope
- @node.parameters.each do |param, value|
- scope.expects(:setvar).with(param, value)
- end
-
- assert_nothing_raised("Could not call 'set_node_parameters'") do
- compile.send(:set_node_parameters)
- end
- end
-
- # Test that we can evaluate the main class, which is the one named "" in namespace
- # "".
- def test_evaluate_main
- compile = mkcompile
- main_class = mock 'main_class'
- compile.topscope.expects(:source=).with(main_class)
- @parser.expects(:findclass).with("", "").returns(main_class)
-
- main_resource = mock 'main resource'
- Puppet::Parser::Resource.expects(:new).with { |args| args[:title] == :main }.returns(main_resource)
-
- main_resource.expects(:evaluate)
-
- assert_nothing_raised("Could not call evaluate_main") do
- compile.send(:evaluate_main)
- end
- end
-
- def test_evaluate_node_classes
- compile = mkcompile
- @node.classes = %w{one two three four}
- compile.expects(:evaluate_classes).with(%w{one two three four}, compile.topscope)
- assert_nothing_raised("could not call evaluate_node_classes") do
- compile.send(:evaluate_node_classes)
- end
- end
-
- def test_evaluate_collections
- compile = mkcompile
-
- colls = []
-
- # Make sure we return false when there's nothing there.
- assert(! compile.send(:evaluate_collections), "Returned true when there were no collections")
-
- # And when the collections fail to evaluate.
- colls << mock("coll1-false")
- colls << mock("coll2-false")
- colls.each { |c| c.expects(:evaluate).returns(false) }
-
- compile.instance_variable_set("@collections", colls)
- assert(! compile.send(:evaluate_collections), "Returned true when collections both evaluated nothing")
-
- # Now have one of the colls evaluate
- colls.clear
- colls << mock("coll1-one-true")
- colls << mock("coll2-one-true")
- colls[0].expects(:evaluate).returns(true)
- colls[1].expects(:evaluate).returns(false)
- assert(compile.send(:evaluate_collections), "Did not return true when one collection evaluated true")
-
- # And have them both eval true
- colls.clear
- colls << mock("coll1-both-true")
- colls << mock("coll2-both-true")
- colls[0].expects(:evaluate).returns(true)
- colls[1].expects(:evaluate).returns(true)
- assert(compile.send(:evaluate_collections), "Did not return true when both collections evaluated true")
- end
-
- def test_unevaluated_resources
- compile = mkcompile
- resources = {}
- compile.instance_variable_set("@resource_table", resources)
-
- # First test it when the table is empty
- assert_nil(compile.send(:unevaluated_resources), "Somehow found unevaluated resources in an empty table")
-
- # Then add a builtin resources
- resources["one"] = mock("builtin only")
- resources["one"].expects(:builtin?).returns(true)
- assert_nil(compile.send(:unevaluated_resources), "Considered a builtin resource unevaluated")
-
- # And do both builtin and non-builtin but already evaluated
- resources.clear
- resources["one"] = mock("builtin (with eval)")
- resources["one"].expects(:builtin?).returns(true)
- resources["two"] = mock("evaled (with builtin)")
- resources["two"].expects(:builtin?).returns(false)
- resources["two"].expects(:evaluated?).returns(true)
- assert_nil(compile.send(:unevaluated_resources), "Considered either a builtin or evaluated resource unevaluated")
-
- # Now a single unevaluated resource.
- resources.clear
- resources["one"] = mock("unevaluated")
- resources["one"].expects(:builtin?).returns(false)
- resources["one"].expects(:evaluated?).returns(false)
- assert_equal([resources["one"]], compile.send(:unevaluated_resources), "Did not find unevaluated resource")
-
- # With two uneval'ed resources, and an eval'ed one thrown in
- resources.clear
- resources["one"] = mock("unevaluated one")
- resources["one"].expects(:builtin?).returns(false)
- resources["one"].expects(:evaluated?).returns(false)
- resources["two"] = mock("unevaluated two")
- resources["two"].expects(:builtin?).returns(false)
- resources["two"].expects(:evaluated?).returns(false)
- resources["three"] = mock("evaluated")
- resources["three"].expects(:builtin?).returns(false)
- resources["three"].expects(:evaluated?).returns(true)
-
- result = compile.send(:unevaluated_resources)
- %w{one two}.each do |name|
- assert(result.include?(resources[name]), "Did not find %s in the unevaluated list" % name)
- end
- end
-
- def test_evaluate_definitions
- # First try the case where there's nothing to return
- compile = mkcompile
- compile.expects(:unevaluated_resources).returns(nil)
-
- assert_nothing_raised("Could not test for unevaluated resources") do
- assert(! compile.send(:evaluate_definitions), "evaluate_definitions returned true when no resources were evaluated")
- end
-
- # Now try it with resources left to evaluate
- resources = []
- res1 = mock("resource1")
- res1.expects(:evaluate)
- res2 = mock("resource2")
- res2.expects(:evaluate)
- resources << res1 << res2
- compile = mkcompile
- compile.expects(:unevaluated_resources).returns(resources)
-
- assert_nothing_raised("Could not test for unevaluated resources") do
- assert(compile.send(:evaluate_definitions), "evaluate_definitions returned false when resources were evaluated")
- end
- end
-
- def test_evaluate_generators
- # First try the case where we have nothing to do
- compile = mkcompile
- compile.expects(:evaluate_definitions).returns(false)
- compile.expects(:evaluate_collections).returns(false)
-
- assert_nothing_raised("Could not call :eval_iterate") do
- compile.send(:evaluate_generators)
- end
-
- # FIXME I could not get this test to work, but the code is short
- # enough that I'm ok with it.
- # It's important that collections are evaluated before definitions,
- # so make sure that's the case by verifying that collections get tested
- # twice but definitions only once.
- #compile = mkcompile
- #compile.expects(:evaluate_collections).returns(true).returns(false)
- #compile.expects(:evaluate_definitions).returns(false)
- #compile.send(:eval_iterate)
- end
-
- def test_store
- compile = mkcompile
- Puppet.features.expects(:rails?).returns(true)
- Puppet::Rails.expects(:connect)
-
- node = mock 'node'
- resource_table = mock 'resources'
- resource_table.expects(:values).returns(:resources)
- compile.instance_variable_set("@node", node)
- compile.instance_variable_set("@resource_table", resource_table)
- compile.expects(:store_to_active_record).with(node, :resources)
- compile.send(:store)
- end
-
- def test_store_to_active_record
- compile = mkcompile
- node = mock 'node'
- node.expects(:name).returns("myname")
- Puppet::Rails::Host.stubs(:transaction).yields
- Puppet::Rails::Host.expects(:store).with(node, :resources)
- compile.send(:store_to_active_record, node, :resources)
- end
-
- # Make sure that 'finish' gets called on all of our resources.
- def test_finish
- compile = mkcompile
- table = compile.instance_variable_get("@resource_table")
-
- # Add a resource that does respond to :finish
- yep = mock("finisher")
- yep.expects(:respond_to?).with(:finish).returns(true)
- yep.expects(:finish)
- table["yep"] = yep
-
- # And one that does not
- dnf = mock("dnf")
- dnf.expects(:respond_to?).with(:finish).returns(false)
- table["dnf"] = dnf
-
- compile.send(:finish)
- end
-
- def test_verify_uniqueness
- compile = mkcompile
-
- resources = compile.instance_variable_get("@resource_table")
- resource = mock("noconflict")
- resource.expects(:ref).returns("File[yay]")
- assert_nothing_raised("Raised an exception when there should have been no conflict") do
- compile.send(:verify_uniqueness, resource)
- end
-
- # Now try the case where our type is isomorphic
- resources["thing"] = true
-
- isoconflict = mock("isoconflict")
- isoconflict.expects(:ref).returns("thing")
- isoconflict.expects(:type).returns("testtype")
- faketype = mock("faketype")
- faketype.expects(:isomorphic?).returns(false)
- faketype.expects(:name).returns("whatever")
- Puppet::Type.expects(:type).with("testtype").returns(faketype)
- assert_nothing_raised("Raised an exception when was a conflict in non-isomorphic types") do
- compile.send(:verify_uniqueness, isoconflict)
- end
-
- # Now test for when we actually have an exception
- initial = mock("initial")
- resources["thing"] = initial
- initial.expects(:file).returns(false)
-
- conflict = mock("conflict")
- conflict.expects(:ref).returns("thing").times(2)
- conflict.expects(:type).returns("conflict")
- conflict.expects(:file).returns(false)
- conflict.expects(:line).returns(false)
-
- faketype = mock("faketype")
- faketype.expects(:isomorphic?).returns(true)
- Puppet::Type.expects(:type).with("conflict").returns(faketype)
- assert_raise(Puppet::ParseError, "Did not fail when two isomorphic resources conflicted") do
- compile.send(:verify_uniqueness, conflict)
- end
- end
-
- def test_store_resource
- # Run once when there's no conflict
- compile = mkcompile
- table = compile.instance_variable_get("@resource_table")
- resource = mock("resource")
- resource.expects(:ref).returns("yay")
- compile.expects(:verify_uniqueness).with(resource)
- scope = stub("scope", :resource => mock('resource'))
-
- compile.catalog.expects(:add_edge!).with(scope.resource, resource)
-
- assert_nothing_raised("Could not store resource") do
- compile.store_resource(scope, resource)
- end
- assert_equal(resource, table["yay"], "Did not store resource in table")
-
- # Now for conflicts
- compile = mkcompile
- table = compile.instance_variable_get("@resource_table")
- resource = mock("resource")
- compile.expects(:verify_uniqueness).with(resource).raises(ArgumentError)
-
- assert_raise(ArgumentError, "Did not raise uniqueness exception") do
- compile.store_resource(scope, resource)
- end
- assert(table.empty?, "Conflicting resource was stored in table")
- end
-
- def test_fail_on_unevaluated
- compile = mkcompile
- compile.expects(:fail_on_unevaluated_overrides)
- compile.expects(:fail_on_unevaluated_resource_collections)
- compile.send :fail_on_unevaluated
- end
-
- def test_store_override
- # First test the case when the resource is not present.
- compile = mkcompile
- overrides = compile.instance_variable_get("@resource_overrides")
- override = Object.new
- override.expects(:ref).returns(:myref).times(2)
- override.expects(:override=).with(true)
-
- assert_nothing_raised("Could not call store_override") do
- compile.store_override(override)
- end
- assert_instance_of(Array, overrides[:myref], "Overrides table is not a hash of arrays")
- assert_equal(override, overrides[:myref][0], "Did not store override in appropriately named array")
-
- # And when the resource already exists.
- resource = mock 'resource'
- resources = compile.instance_variable_get("@resource_table")
- resources[:resref] = resource
-
- override = mock 'override'
- resource.expects(:merge).with(override)
- override.expects(:override=).with(true)
- override.expects(:ref).returns(:resref)
- assert_nothing_raised("Could not call store_override when the resource already exists.") do
- compile.store_override(override)
- end
- end
-
- def test_resource_overrides
- compile = mkcompile
- overrides = compile.instance_variable_get("@resource_overrides")
- overrides[:test] = :yay
- resource = mock 'resource'
- resource.expects(:ref).returns(:test)
-
- assert_equal(:yay, compile.resource_overrides(resource), "Did not return overrides from table")
- end
-
- def test_fail_on_unevaluated_resource_collections
- compile = mkcompile
- collections = compile.instance_variable_get("@collections")
-
- # Make sure we're fine when the list is empty
- assert_nothing_raised("Failed when no collections were present") do
- compile.send :fail_on_unevaluated_resource_collections
- end
-
- # And that we're fine when we've got collections but with no resources
- collections << mock('coll')
- collections[0].expects(:resources).returns(nil)
- assert_nothing_raised("Failed when no resource collections were present") do
- compile.send :fail_on_unevaluated_resource_collections
- end
-
- # But that we do fail when we've got resource collections left.
- collections.clear
-
- # return both an array and a string, because that's tested internally
- collections << mock('coll returns one')
- collections[0].expects(:resources).returns(:something)
-
- collections << mock('coll returns many')
- collections[1].expects(:resources).returns([:one, :two])
-
- assert_raise(Puppet::ParseError, "Did not fail on unevaluated resource collections") do
- compile.send :fail_on_unevaluated_resource_collections
- end
- end
-
- def test_fail_on_unevaluated_overrides
- compile = mkcompile
- overrides = compile.instance_variable_get("@resource_overrides")
-
- # Make sure we're fine when the list is empty
- assert_nothing_raised("Failed when no collections were present") do
- compile.send :fail_on_unevaluated_overrides
- end
-
- # But that we fail if there are any overrides left in the table.
- overrides[:yay] = []
- overrides[:foo] = []
- overrides[:bar] = [mock("override")]
- overrides[:bar][0].expects(:ref).returns("yay")
- assert_raise(Puppet::ParseError, "Failed to fail when overrides remain") do
- compile.send :fail_on_unevaluated_overrides
- end
- end
-
- def test_find_resource
- compile = mkcompile
- resources = compile.instance_variable_get("@resource_table")
-
- assert_nothing_raised("Could not call findresource when the resource table was empty") do
- assert_nil(compile.findresource("yay", "foo"), "Returned a non-existent resource")
- assert_nil(compile.findresource("yay[foo]"), "Returned a non-existent resource")
- end
-
- resources["Foo[bar]"] = :yay
- assert_nothing_raised("Could not call findresource when the resource table was not empty") do
- assert_equal(:yay, compile.findresource("foo", "bar"), "Returned a non-existent resource")
- assert_equal(:yay, compile.findresource("Foo[bar]"), "Returned a non-existent resource")
- end
- end
-
- # #620 - Nodes and classes should conflict, else classes don't get evaluated
- def test_nodes_and_classes_name_conflict
- # Test node then class
- compile = mkcompile
- node = stub :nodescope? => true
- klass = stub :nodescope? => false
- compile.class_set("one", node)
- assert_raise(Puppet::ParseError, "Did not fail when replacing node with class") do
- compile.class_set("one", klass)
- end
-
- # and class then node
- compile = mkcompile
- node = stub :nodescope? => true
- klass = stub :nodescope? => false
- compile.class_set("two", klass)
- assert_raise(Puppet::ParseError, "Did not fail when replacing node with class") do
- compile.class_set("two", node)
- end
- end
-end
diff --git a/test/language/functions.rb b/test/language/functions.rb
index 132ee97..a5d52d7 100755
--- a/test/language/functions.rb
+++ b/test/language/functions.rb
@@ -41,7 +41,7 @@ class TestLangFunctions < Test::Unit::TestCase
scope = mkscope
val = nil
assert_nothing_raised do
- val = func.evaluate(:scope => scope)
+ val = func.evaluate(scope)
end
assert_equal("output avalue", val)
@@ -57,7 +57,7 @@ class TestLangFunctions < Test::Unit::TestCase
val = nil
assert_nothing_raised do
- val = func.evaluate(:scope => scope)
+ val = func.evaluate(scope)
end
assert_equal(retval, val, "'tagged' returned %s for %s" % [val, tag])
@@ -66,7 +66,7 @@ class TestLangFunctions < Test::Unit::TestCase
# Now make sure we correctly get tags.
scope.resource.tag("resourcetag")
assert(scope.function_tagged("resourcetag"), "tagged function did not catch resource tags")
- scope.compile.catalog.tag("configtag")
+ scope.compiler.catalog.tag("configtag")
assert(scope.function_tagged("configtag"), "tagged function did not catch catalog tags")
end
@@ -86,7 +86,7 @@ class TestLangFunctions < Test::Unit::TestCase
scope = mkscope
val = nil
assert_raise(Puppet::ParseError) do
- val = func.evaluate(:scope => scope)
+ val = func.evaluate(scope)
end
end
@@ -117,16 +117,16 @@ class TestLangFunctions < Test::Unit::TestCase
scope = mkscope
assert_raise(Puppet::ParseError) do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
scope.setvar("one", "One")
assert_raise(Puppet::ParseError) do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
scope.setvar("two", "Two")
assert_nothing_raised do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
assert_equal("template One\ntemplate Two\n", scope.lookupvar("output"),
@@ -155,13 +155,13 @@ class TestLangFunctions < Test::Unit::TestCase
scope = mkscope
assert_raise(Puppet::ParseError) do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
scope.setvar("yayness", "this is yayness")
assert_nothing_raised do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
assert_equal("template this is yayness\n", scope.lookupvar("output"),
@@ -191,7 +191,7 @@ class TestLangFunctions < Test::Unit::TestCase
scope = mkscope
scope.setvar("myvar", "this is yayness")
assert_raise(Puppet::ParseError) do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
end
@@ -264,14 +264,14 @@ class TestLangFunctions < Test::Unit::TestCase
}.each do |string, value|
scope = mkscope
assert_raise(Puppet::ParseError) do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
scope.setvar("yayness", string)
assert_equal(string, scope.lookupvar("yayness", false))
assert_nothing_raised("An empty string was not a valid variable value") do
- ast.evaluate(:scope => scope)
+ ast.evaluate(scope)
end
assert_equal("template #{value}\n", scope.lookupvar("output"),
@@ -308,7 +308,7 @@ class TestLangFunctions < Test::Unit::TestCase
def test_realize
scope = mkscope
- parser = scope.compile.parser
+ parser = scope.compiler.parser
# Make a definition
parser.newdefine("mytype")
@@ -318,7 +318,7 @@ class TestLangFunctions < Test::Unit::TestCase
virtual = mkresource(:type => type, :title => title,
:virtual => true, :params => {}, :scope => scope)
- scope.compile.store_resource(scope, virtual)
+ scope.compiler.add_resource(scope, virtual)
ref = Puppet::Parser::Resource::Reference.new(
:type => type, :title => title,
@@ -330,13 +330,13 @@ class TestLangFunctions < Test::Unit::TestCase
end
# Make sure it created a collection
- assert_equal(1, scope.compile.collections.length,
+ assert_equal(1, scope.compiler.collections.length,
"Did not set collection")
assert_nothing_raised do
- scope.compile.collections.each do |coll| coll.evaluate end
+ scope.compiler.collections.each do |coll| coll.evaluate end
end
- scope.compile.collections.clear
+ scope.compiler.collections.clear
# Now make sure the virtual resource is no longer virtual
assert(! virtual.virtual?, "Did not make virtual resource real")
@@ -354,17 +354,17 @@ class TestLangFunctions < Test::Unit::TestCase
end
# Make sure it created a collection
- assert_equal(1, scope.compile.collections.length,
+ assert_equal(1, scope.compiler.collections.length,
"Did not set collection")
# And the collection has our resource in it
- assert_equal([none.to_s], scope.compile.collections[0].resources,
+ assert_equal([none.to_s], scope.compiler.collections[0].resources,
"Did not set resources in collection")
end
def test_defined
scope = mkscope
- parser = scope.compile.parser
+ parser = scope.compiler.parser
parser.newclass("yayness")
parser.newdefine("rahness")
@@ -385,7 +385,7 @@ class TestLangFunctions < Test::Unit::TestCase
"Multiple falses were somehow true")
# Now make sure we can test resources
- scope.compile.store_resource(scope, mkresource(:type => "file", :title => "/tmp/rahness",
+ scope.compiler.add_resource(scope, mkresource(:type => "file", :title => "/tmp/rahness",
:scope => scope, :source => scope.source,
:params => {:owner => "root"}))
@@ -420,7 +420,7 @@ class TestLangFunctions < Test::Unit::TestCase
def test_include
scope = mkscope
- parser = scope.compile.parser
+ parser = scope.compiler.parser
assert_raise(Puppet::ParseError, "did not throw error on missing class") do
scope.function_include("nosuchclass")
@@ -428,7 +428,7 @@ class TestLangFunctions < Test::Unit::TestCase
parser.newclass("myclass")
- scope.compile.expects(:evaluate_classes).with(%w{myclass otherclass}, scope, false).returns(%w{myclass otherclass})
+ scope.compiler.expects(:evaluate_classes).with(%w{myclass otherclass}, scope, false).returns(%w{myclass otherclass})
assert_nothing_raised do
scope.function_include(["myclass", "otherclass"])
@@ -480,7 +480,7 @@ class TestLangFunctions < Test::Unit::TestCase
assert_equal("yay-foo\n", %x{#{command} foo}, "command did not work")
scope = mkscope
- parser = scope.compile.parser
+ parser = scope.compiler.parser
val = nil
assert_nothing_raised("Could not call generator with no args") do
diff --git a/test/language/lexer.rb b/test/language/lexer.rb
deleted file mode 100755
index e09828d..0000000
--- a/test/language/lexer.rb
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/usr/bin/env ruby
-
-require File.dirname(__FILE__) + '/../lib/puppettest'
-
-require 'puppet'
-require 'puppet/parser/lexer'
-require 'puppettest'
-
-#%q{service("telnet") = \{
-# port => "23",
-# protocol => "tcp",
-# name => "telnet",
-#\}
-#} => [[:NAME, "service"], [:LPAREN, "("], [:DQUOTE, "\""], [:NAME, "telnet"], [:DQUOTE, "\""], [:RPAREN, ")"], [:EQUALS, "="], [:lbrace, "{"], [:NAME, "port"], [:FARROW, "=>"], [:DQUOTE, "\""], [:NAME, "23"], [:DQUOTE, "\""], [:COMMA, ","], [:NAME, "protocol"], [:FARROW, "=>"], [:DQUOTE, "\""], [:NAME, "tcp"], [:DQUOTE, "\""], [:COMMA, ","], [:NAME, "name"], [:FARROW, "=>"], [:DQUOTE, "\""], [:NAME, "telnet"], [:DQUOTE, "\""], [:COMMA, ","], [:RBRACE, "}"]]
-
-class TestLexer < Test::Unit::TestCase
- include PuppetTest
- def setup
- super
- mklexer
- end
-
- def mklexer
- @lexer = Puppet::Parser::Lexer.new()
- end
-
- def test_simple_lex
- strings = {
-%q{\\} => [[:BACKSLASH,"\\"],[false,false]],
-%q{simplest scanner test} => [[:NAME,"simplest"],[:NAME,"scanner"],[:NAME,"test"],[false,false]],
-%q{returned scanner test
-} => [[:NAME,"returned"],[:NAME,"scanner"],[:NAME,"test"],[false,false]]
- }
- strings.each { |str,ary|
- @lexer.string = str
- assert_equal(
- ary,
- @lexer.fullscan()
- )
- }
- end
-
- def test_quoted_strings
- strings = {
-%q{a simple "scanner" test
-} => [[:NAME,"a"],[:NAME,"simple"],[:DQTEXT,"scanner"],[:NAME,"test"],[false,false]],
-%q{a simple 'single quote scanner' test
-} => [[:NAME,"a"],[:NAME,"simple"],[:SQTEXT,"single quote scanner"],[:NAME,"test"],[false,false]],
-%q{a harder 'a $b \c"'
-} => [[:NAME,"a"],[:NAME,"harder"],[:SQTEXT,'a $b \c"'],[false,false]],
-%q{a harder "scanner test"
-} => [[:NAME,"a"],[:NAME,"harder"],[:DQTEXT,"scanner test"],[false,false]],
-%q{a hardest "scanner \"test\""
-} => [[:NAME,"a"],[:NAME,"hardest"],[:DQTEXT,'scanner "test"'],[false,false]],
-%q{a hardestest "scanner \"test\"
-"
-} => [[:NAME,"a"],[:NAME,"hardestest"],[:DQTEXT,'scanner "test"
-'],[false,false]],
-%q{function("call")} => [[:NAME,"function"],[:LPAREN,"("],[:DQTEXT,'call'],[:RPAREN,")"],[false,false]]
-}
- strings.each { |str,array|
- @lexer.string = str
- assert_equal(
- array,
- @lexer.fullscan()
- )
- }
- end
-
- def test_errors
- strings = %w{
- ^
- }
- strings.each { |str|
- @lexer.string = str
- assert_raise(RuntimeError) {
- @lexer.fullscan()
- }
- }
- end
-
- def test_more_error
- assert_raise(TypeError) {
- @lexer.fullscan()
- }
- end
-
- def test_files
- textfiles() { |file|
- lexer = Puppet::Parser::Lexer.new()
- lexer.file = file
- assert_nothing_raised("Failed to lex %s" % file) {
- lexer.fullscan()
- }
- Puppet::Type.allclear
- }
- end
-
- def test_strings
- names = %w{this is a bunch of names}
- types = %w{Many Different Words A Word}
- words = %w{differently Cased words A a}
-
- names.each { |t|
- @lexer.string = t
- assert_equal(
- [[:NAME,t],[false,false]],
- @lexer.fullscan
- )
- }
- types.each { |t|
- @lexer.string = t
- assert_equal(
- [[:CLASSREF,t],[false,false]],
- @lexer.fullscan
- )
- }
- end
-
- def test_emptystring
- bit = '$var = ""'
-
- assert_nothing_raised {
- @lexer.string = bit
- }
-
- assert_nothing_raised {
- @lexer.fullscan
- }
- end
-
- def test_collectlexing
- {"@" => :AT, "<|" => :LCOLLECT, "|>" => :RCOLLECT}.each do |string, token|
- assert_nothing_raised {
- @lexer.string = string
- }
-
- ret = nil
- assert_nothing_raised {
- ret = @lexer.fullscan
- }
-
- assert_equal([[token, string],[false, false]], ret)
- end
- end
-
- def test_collectabletype
- string = "@type {"
-
- assert_nothing_raised {
- @lexer.string = string
- }
-
- ret = nil
- assert_nothing_raised {
- ret = @lexer.fullscan
- }
-
- assert_equal([[:AT, "@"], [:NAME, "type"], [:LBRACE, "{"], [false,false]],ret)
- end
-
- def test_namespace
- @lexer.string = %{class myclass}
-
- assert_nothing_raised {
- @lexer.fullscan
- }
-
- assert_equal("myclass", @lexer.namespace)
-
- assert_nothing_raised do
- @lexer.namepop
- end
-
- assert_equal("", @lexer.namespace)
-
- @lexer.string = "class base { class sub { class more"
-
- assert_nothing_raised {
- @lexer.fullscan
- }
-
- assert_equal("base::sub::more", @lexer.namespace)
-
- assert_nothing_raised do
- @lexer.namepop
- end
-
- assert_equal("base::sub", @lexer.namespace)
-
- # Now try it with some fq names
- mklexer
-
- @lexer.string = "class base { class sub::more {"
-
- assert_nothing_raised {
- @lexer.fullscan
- }
-
- assert_equal("base::sub::more", @lexer.namespace)
-
- assert_nothing_raised do
- @lexer.namepop
- end
-
- assert_equal("base", @lexer.namespace)
- end
-
- def test_indefine
- @lexer.string = %{define me}
-
- assert_nothing_raised {
- @lexer.scan { |t,s| }
- }
-
- assert(@lexer.indefine?, "Lexer not considered in define")
-
- # Now make sure we throw an error when trying to nest defines.
- assert_raise(Puppet::ParseError) do
- @lexer.string = %{define another}
- @lexer.scan { |t,s| }
- end
-
- assert_nothing_raised do
- @lexer.indefine = false
- end
-
- assert(! @lexer.indefine?, "Lexer still considered in define")
- end
-
- # Make sure the different qualified variables work.
- def test_variable
- ["$variable", "$::variable", "$qualified::variable", "$further::qualified::variable"].each do |string|
- @lexer.string = string
-
- assert_nothing_raised("Could not lex %s" % string) do
- @lexer.scan do |t, s|
- assert_equal(:VARIABLE, t, "did not get variable as token")
- assert_equal(string.sub(/^\$/, ''), s, "did not get correct string back")
- break
- end
- end
- end
- end
-
- # Make sure the expected stack works as it should
- def test_expected
- @lexer.string = "[a{"
- expected = @lexer.instance_variable_get("@expected")
- @lexer.scan {}
- assert_equal("}", @lexer.expected, "expected value is wrong")
-
- @lexer.string = "}"
- @lexer.scan {}
- assert_equal("]", @lexer.expected, "expected value is wrong after pop")
- end
-
- # #774
- def test_classref_token
- string = ["Foo", "::Foo","Foo::Bar","::Foo::Bar"]
-
- string.each do |foo|
- assert_nothing_raised {
- @lexer.string = foo
- }
-
- ret = nil
- assert_nothing_raised {
- ret = @lexer.fullscan
- }
-
- assert_equal([:CLASSREF, foo],ret[0], "Did not correctly tokenize '%s'" % foo)
- end
- end
-end
-
diff --git a/test/language/parser.rb b/test/language/parser.rb
index 9a2aed7..2a0e9c0 100755
--- a/test/language/parser.rb
+++ b/test/language/parser.rb
@@ -45,9 +45,9 @@ class TestParser < Test::Unit::TestCase
assert_raise(Puppet::ParseError, "Did not fail while parsing %s" % file) {
parser.file = file
ast = parser.parse
- config = mkcompile(parser)
+ config = mkcompiler(parser)
config.compile
- #ast.classes[""].evaluate :scope => config.topscope
+ #ast.classes[""].evaluate config.topscope
}
Puppet::Type.allclear
}
@@ -868,7 +868,7 @@ file { "/tmp/yayness":
def test_newclass
scope = mkscope
- parser = scope.compile.parser
+ parser = scope.compiler.parser
mkcode = proc do |ary|
classes = ary.collect do |string|
@@ -891,7 +891,7 @@ file { "/tmp/yayness":
assert(parser.classes["myclass"], "Could not find definition")
assert_equal("myclass", parser.classes["myclass"].classname)
assert_equal(%w{original code},
- parser.classes["myclass"].code.evaluate(:scope => scope))
+ parser.classes["myclass"].code.evaluate(scope))
# Newclass behaves differently than the others -- it just appends
# the code to the existing class.
@@ -901,7 +901,7 @@ file { "/tmp/yayness":
end
assert(klass, "Did not return class when appending")
assert_equal(%w{original code something new},
- parser.classes["myclass"].code.evaluate(:scope => scope))
+ parser.classes["myclass"].code.evaluate(scope))
# Now create the same class name in a different scope
assert_nothing_raised {
@@ -914,7 +914,7 @@ file { "/tmp/yayness":
assert_equal("other::myclass", other.classname)
assert_equal("other::myclass", other.namespace)
assert_equal(%w{something diff},
- other.code.evaluate(:scope => scope))
+ other.code.evaluate(scope))
# Make sure newclass deals correctly with nodes with no code
klass = parser.newclass("nocode")
@@ -925,7 +925,7 @@ file { "/tmp/yayness":
end
assert(klass, "Did not return class with no code")
assert_equal(%w{yay test},
- parser.classes["nocode"].code.evaluate(:scope => scope))
+ parser.classes["nocode"].code.evaluate(scope))
# Then try merging something into nothing
parser.newclass("nocode2", :code => mkcode.call(%w{foo test}))
@@ -936,7 +936,7 @@ file { "/tmp/yayness":
end
assert(klass, "Did not return class with no code")
assert_equal(%w{foo test},
- parser.classes["nocode2"].code.evaluate(:scope => scope))
+ parser.classes["nocode2"].code.evaluate(scope))
# And lastly, nothing and nothing
klass = parser.newclass("nocode3")
@@ -1188,5 +1188,17 @@ file { "/tmp/yayness":
assert_equal(result, parser.finddefine("", "fUntEst"),
"%s was not matched" % "fUntEst")
end
+
+ def test_manifests_with_multiple_environments
+ parser = mkparser :environment => "something"
+
+ # We use an exception to cut short the processing to simplify our stubbing
+ #Puppet::Module.expects(:find_manifests).with("test", {:cwd => ".", :environment => "something"}).raises(Puppet::ParseError)
+ Puppet::Module.expects(:find_manifests).with("test", {:cwd => ".", :environment => "something"}).returns([])
+
+ assert_raise(Puppet::ImportError) do
+ parser.import("test")
+ end
+ end
end
diff --git a/test/language/resource.rb b/test/language/resource.rb
index 84a30b0..b3eaf03 100755
--- a/test/language/resource.rb
+++ b/test/language/resource.rb
@@ -23,96 +23,6 @@ class TestResource < PuppetTest::TestCase
mocha_verify
end
- def test_initialize
- args = {:type => "resource", :title => "testing",
- :scope => mkscope}
- # Check our arg requirements
- args.each do |name, value|
- try = args.dup
- try.delete(name)
- assert_raise(ArgumentError, "Did not fail when %s was missing" % name) do
- Parser::Resource.new(try)
- end
- end
-
- res = nil
- assert_nothing_raised do
- res = Parser::Resource.new(args)
- end
-
- ref = res.instance_variable_get("@ref")
- assert_equal("Resource", ref.type, "did not set resource type")
- assert_equal("testing", ref.title, "did not set resource title")
- end
-
- def test_merge
- res = mkresource
- other = mkresource
-
- # First try the case where the resource is not allowed to override
- res.source = "source1"
- other.source = "source2"
- other.source.expects(:child_of?).with("source1").returns(false)
- assert_raise(Puppet::ParseError, "Allowed unrelated resources to override") do
- res.merge(other)
- end
-
- # Next try it when the sources are equal.
- res.source = "source3"
- other.source = res.source
- other.source.expects(:child_of?).with("source3").never
- params = {:a => :b, :c => :d}
- other.expects(:params).returns(params)
- res.expects(:override_parameter).with(:b)
- res.expects(:override_parameter).with(:d)
- res.merge(other)
-
- # And then parentage is involved
- other = mkresource
- res.source = "source3"
- other.source = "source4"
- other.source.expects(:child_of?).with("source3").returns(true)
- params = {:a => :b, :c => :d}
- other.expects(:params).returns(params)
- res.expects(:override_parameter).with(:b)
- res.expects(:override_parameter).with(:d)
- res.merge(other)
- end
-
- # the [] method
- def test_array_accessors
- res = mkresource
- params = res.instance_variable_get("@params")
- assert_nil(res[:missing], "Found a missing parameter somehow")
- params[:something] = stub(:value => "yay")
- assert_equal("yay", res[:something], "Did not correctly call value on the parameter")
-
- res.expects(:title).returns(:mytitle)
- assert_equal(:mytitle, res[:title], "Did not call title when asked for it as a param")
- end
-
- # Make sure any defaults stored in the scope get added to our resource.
- def test_add_defaults
- res = mkresource
- params = res.instance_variable_get("@params")
- params[:a] = :b
- res.scope.expects(:lookupdefaults).with(res.type).returns(:a => :replaced, :c => :d)
- res.expects(:debug)
-
- res.send(:add_defaults)
- assert_equal(:d, params[:c], "Did not set default")
- assert_equal(:b, params[:a], "Replaced parameter with default")
- end
-
- def test_finish
- res = mkresource
- res.expects(:add_overrides)
- res.expects(:add_defaults)
- res.expects(:add_metaparams)
- res.expects(:validate)
- res.finish
- end
-
# Make sure we paramcheck our params
def test_validate
res = mkresource
@@ -124,43 +34,6 @@ class TestResource < PuppetTest::TestCase
res.send(:validate)
end
- def test_override_parameter
- res = mkresource
- params = res.instance_variable_get("@params")
-
- # There are three cases, with the second having two options:
-
- # No existing parameter.
- param = stub(:name => "myparam")
- res.send(:override_parameter, param)
- assert_equal(param, params["myparam"], "Override was not added to param list")
-
- # An existing parameter that we can override.
- source = stub(:child_of? => true)
- # Start out without addition
- params["param2"] = stub(:source => :whatever)
- param = stub(:name => "param2", :source => source, :add => false)
- res.send(:override_parameter, param)
- assert_equal(param, params["param2"], "Override was not added to param list")
-
- # Try with addition.
- params["param2"] = stub(:value => :a, :source => :whatever)
- param = stub(:name => "param2", :source => source, :add => true, :value => :b)
- param.expects(:value=).with([:a, :b])
- res.send(:override_parameter, param)
- assert_equal(param, params["param2"], "Override was not added to param list")
-
- # And finally, make sure we throw an exception when the sources aren't related
- source = stub(:child_of? => false)
- params["param2"] = stub(:source => :whatever, :file => :f, :line => :l)
- old = params["param2"]
- param = stub(:name => "param2", :source => source, :file => :f, :line => :l)
- assert_raise(Puppet::ParseError, "Did not fail when params conflicted") do
- res.send(:override_parameter, param)
- end
- assert_equal(old, params["param2"], "Param was replaced irrespective of conflict")
- end
-
def test_set_parameter
res = mkresource
params = res.instance_variable_get("@params")
@@ -266,48 +139,12 @@ class TestResource < PuppetTest::TestCase
ref.expects(:definedtype).returns(type)
res.expects(:finish)
res.scope = mock("scope")
- config = mock("config")
- res.scope.expects(:compile).returns(config)
- config.expects(:delete_resource).with(res)
- args = {:scope => res.scope, :resource => res}
- type.expects(:evaluate).with(args)
+ type.expects(:evaluate_code).with(res)
res.evaluate
end
- def test_add_overrides
- # Try it with nil
- res = mkresource
- res.scope = mock('scope')
- config = mock("config")
- res.scope.expects(:compile).returns(config)
- config.expects(:resource_overrides).with(res).returns(nil)
- res.expects(:merge).never
- res.send(:add_overrides)
-
- # And an empty array
- res = mkresource
- res.scope = mock('scope')
- config = mock("config")
- res.scope.expects(:compile).returns(config)
- config.expects(:resource_overrides).with(res).returns([])
- res.expects(:merge).never
- res.send(:add_overrides)
-
- # And with some overrides
- res = mkresource
- res.scope = mock('scope')
- config = mock("config")
- res.scope.expects(:compile).returns(config)
- returns = %w{a b}
- config.expects(:resource_overrides).with(res).returns(returns)
- res.expects(:merge).with("a")
- res.expects(:merge).with("b")
- res.send(:add_overrides)
- assert(returns.empty?, "Did not clear overrides")
- end
-
def test_proxymethods
res = Parser::Resource.new :type => "evaltest", :title => "yay",
:source => mock("source"), :scope => mkscope
@@ -378,7 +215,7 @@ class TestResource < PuppetTest::TestCase
{:name => "one", :title => "two"},
{:title => "three"},
].each do |hash|
- config = mkcompile parser
+ config = mkcompiler parser
args = {:type => "yayness", :title => hash[:title],
:source => klass, :scope => config.topscope}
if hash[:name]
@@ -425,7 +262,7 @@ class TestResource < PuppetTest::TestCase
:code => resourcedef("file", varref("name"),
"mode" => "644"))
- config = mkcompile(parser)
+ config = mkcompiler(parser)
res = mkresource :type => "yayness", :title => "foo", :params => {}, :scope => config.topscope
res.virtual = true
@@ -457,37 +294,4 @@ class TestResource < PuppetTest::TestCase
assert(newres.exported?, "Exported defined resource generated non-exported resources")
assert(newres.virtual?, "Exported defined resource generated non-virtual resources")
end
-
- # Make sure tags behave appropriately.
- def test_tags
- scope_resource = stub 'scope_resource', :tags => %w{srone srtwo}
- scope = stub 'scope', :resource => scope_resource
- resource = Puppet::Parser::Resource.new(:type => "file", :title => "yay", :scope => scope, :source => mock('source'))
-
- # Make sure we get the scope resource's tags, plus the type and title
- %w{srone srtwo yay file}.each do |tag|
- assert(resource.tags.include?(tag), "Did not tag resource with %s" % tag)
- end
-
- # make sure we can only set legal tags
- ["an invalid tag", "-anotherinvalid", "bad*tag"].each do |tag|
- assert_raise(Puppet::ParseError, "Tag #{tag} was considered valid") do
- resource.tag tag
- end
- end
-
- # make sure good tags make it through.
- tags = %w{good-tag yaytag GoodTag another_tag a ab A}
- tags.each do |tag|
- assert_nothing_raised("Tag #{tag} was considered invalid") do
- resource.tag tag
- end
- end
-
- # make sure we get each of them.
- ptags = resource.tags
- tags.each do |tag|
- assert(ptags.include?(tag.downcase), "missing #{tag}")
- end
- end
end
diff --git a/test/language/scope.rb b/test/language/scope.rb
index ec11a86..c96581a 100755
--- a/test/language/scope.rb
+++ b/test/language/scope.rb
@@ -27,7 +27,7 @@ class TestScope < Test::Unit::TestCase
end
def test_variables
- config = mkcompile
+ config = mkcompiler
topscope = config.topscope
midscope = config.newscope(topscope)
botscope = config.newscope(midscope)
@@ -94,7 +94,7 @@ class TestScope < Test::Unit::TestCase
classes = ["", "one", "one::two", "one::two::three"].each do |name|
klass = parser.newclass(name)
Puppet::Parser::Resource.new(:type => "class", :title => name, :scope => scope, :source => mock('source')).evaluate
- scopes[name] = scope.compile.class_scope(klass)
+ scopes[name] = scope.compiler.class_scope(klass)
end
classes.each do |name|
@@ -125,7 +125,7 @@ class TestScope < Test::Unit::TestCase
end
def test_setdefaults
- config = mkcompile
+ config = mkcompiler
scope = config.topscope
@@ -151,7 +151,7 @@ class TestScope < Test::Unit::TestCase
end
def test_lookupdefaults
- config = mkcompile
+ config = mkcompiler
top = config.topscope
# Make a subscope
@@ -179,7 +179,7 @@ class TestScope < Test::Unit::TestCase
end
def test_parent
- config = mkcompile
+ config = mkcompiler
top = config.topscope
# Make a subscope
@@ -205,7 +205,7 @@ class TestScope < Test::Unit::TestCase
%w{one one::two one::two::three}.each do |name|
klass = parser.newclass(name)
Puppet::Parser::Resource.new(:type => "class", :title => name, :scope => scope, :source => mock('source')).evaluate
- scopes[name] = scope.compile.class_scope(klass)
+ scopes[name] = scope.compiler.class_scope(klass)
scopes[name].setvar("test", "value-%s" % name.sub(/.+::/,''))
end
@@ -284,13 +284,13 @@ class TestScope < Test::Unit::TestCase
)
assert_nothing_raised do
- function.evaluate :scope => scope
+ function.evaluate scope
end
- scope.compile.send(:evaluate_generators)
+ scope.compiler.send(:evaluate_generators)
[myclass, otherclass].each do |klass|
- assert(scope.compile.class_scope(klass),
+ assert(scope.compiler.class_scope(klass),
"%s was not set" % klass.classname)
end
end
@@ -328,18 +328,17 @@ class TestScope < Test::Unit::TestCase
"undef considered true")
end
- if defined? ActiveRecord
# Verify that we recursively mark as exported the results of collectable
# components.
- def test_exportedcomponents
- config = mkcompile
+ def test_virtual_definitions_do_not_get_evaluated
+ config = mkcompiler
parser = config.parser
# Create a default source
config.topscope.source = parser.newclass "", ""
# And a scope resource
- scope_res = stub 'scope_resource', :virtual? => true, :exported? => false, :tags => []
+ scope_res = stub 'scope_resource', :virtual? => true, :exported? => false, :tags => [], :builtin? => true, :type => "eh", :title => "bee"
config.topscope.resource = scope_res
args = AST::ASTArray.new(
@@ -348,7 +347,7 @@ class TestScope < Test::Unit::TestCase
:children => [nameobj("arg")]
)
- # Create a top-level component
+ # Create a top-level define
parser.newdefine "one", :arguments => [%w{arg}],
:code => AST::ASTArray.new(
:children => [
@@ -356,41 +355,26 @@ class TestScope < Test::Unit::TestCase
]
)
- # And a component that calls it
- parser.newdefine "two", :arguments => [%w{arg}],
- :code => AST::ASTArray.new(
- :children => [
- resourcedef("one", "ptest", {"arg" => varref("arg")})
- ]
- )
-
- # And then a third component that calls the second
- parser.newdefine "three", :arguments => [%w{arg}],
- :code => AST::ASTArray.new(
- :children => [
- resourcedef("two", "yay", {"arg" => varref("arg")})
- ]
- )
-
- # lastly, create an object that calls our third component
- obj = resourcedef("three", "boo", {"arg" => "parentfoo"})
+ # create a resource that calls our third define
+ obj = resourcedef("one", "boo", {"arg" => "parentfoo"})
- # And mark it as exported
- obj.exported = true
+ # And mark it as virtual
+ obj.virtual = true
# And then evaluate it
- obj.evaluate :scope => config.topscope
+ obj.evaluate config.topscope
# And run the loop.
config.send(:evaluate_generators)
%w{File}.each do |type|
- objects = config.resources.find_all { |r| r.type == type and r.exported }
+ objects = config.resources.find_all { |r| r.type == type and r.virtual }
- assert(!objects.empty?, "Did not get an exported %s" % type)
+ assert(objects.empty?, "Virtual define got evaluated")
end
end
+ if defined? ActiveRecord
# Verify that we can both store and collect an object in the same
# run, whether it's in the same scope as a collection or a different
# scope.
diff --git a/test/language/snippets.rb b/test/language/snippets.rb
index 2a4ba02..982ddfe 100755
--- a/test/language/snippets.rb
+++ b/test/language/snippets.rb
@@ -15,6 +15,8 @@ class TestSnippets < Test::Unit::TestCase
def setup
super
@file = Puppet::Type.type(:file)
+ Facter.stubs(:to_hash).returns({})
+ Facter.stubs(:value).returns("whatever")
end
def self.snippetdir
@@ -422,6 +424,11 @@ class TestSnippets < Test::Unit::TestCase
assert_file("/tmp/realize_defined_test2")
end
+ def snippet_collection_within_virtual_definitions
+ assert_file("/tmp/collection_within_virtual_definitions1_foo.txt")
+ assert_file("/tmp/collection_within_virtual_definitions2_foo2.txt")
+ end
+
def snippet_fqparents
assert_file("/tmp/fqparent1", "Did not make file from parent class")
assert_file("/tmp/fqparent2", "Did not make file from subclass")
diff --git a/test/lib/mocha/auto_verify.rb b/test/lib/mocha/auto_verify.rb
deleted file mode 100644
index dce877b..0000000
--- a/test/lib/mocha/auto_verify.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-require 'mocha/mock'
-
-module Mocha # :nodoc:
-
- # Methods added to TestCase allowing creation of traditional mock objects.
- #
- # Mocks created this way will have their expectations automatically verified at the end of the test.
- #
- # See Mock for methods on mock objects.
- module AutoVerify
-
- def mocks # :nodoc:
- @mocks ||= []
- end
-
- def reset_mocks # :nodoc:
- @mocks = nil
- end
-
- # :call-seq: mock(name) -> mock object
- # mock(expected_methods = {}) -> mock object
- # mock(name, expected_methods = {}) -> mock object
- #
- # Creates a mock object.
- #
- # +name+ is a +String+ identifier for the mock object.
- #
- # +expected_methods+ is a +Hash+ with expected method name symbols as keys and corresponding return values as values.
- #
- # Note that (contrary to expectations set up by #stub) these expectations <b>must</b> be fulfilled during the test.
- # def test_product
- # product = mock('ipod_product', :manufacturer => 'ipod', :price => 100)
- # assert_equal 'ipod', product.manufacturer
- # assert_equal 100, product.price
- # # an error will be raised unless both Product#manufacturer and Product#price have been called
- # end
- def mock(*args)
- name, expectations = name_and_expectations_from_args(args)
- build_mock_with_expectations(:expects, expectations, name)
- end
-
- # :call-seq: stub(name) -> mock object
- # stub(stubbed_methods = {}) -> mock object
- # stub(name, stubbed_methods = {}) -> mock object
- #
- # Creates a mock object.
- #
- # +name+ is a +String+ identifier for the mock object.
- #
- # +stubbed_methods+ is a +Hash+ with stubbed method name symbols as keys and corresponding return values as values.
- #
- # Note that (contrary to expectations set up by #mock) these expectations <b>need not</b> be fulfilled during the test.
- # def test_product
- # product = stub('ipod_product', :manufacturer => 'ipod', :price => 100)
- # assert_equal 'ipod', product.manufacturer
- # assert_equal 100, product.price
- # # an error will not be raised even if Product#manufacturer and Product#price have not been called
- # end
- def stub(*args)
- name, expectations = name_and_expectations_from_args(args)
- build_mock_with_expectations(:stubs, expectations, name)
- end
-
- # :call-seq: stub_everything(name) -> mock object
- # stub_everything(stubbed_methods = {}) -> mock object
- # stub_everything(name, stubbed_methods = {}) -> mock object
- #
- # Creates a mock object that accepts calls to any method.
- #
- # By default it will return +nil+ for any method call.
- #
- # +name+ and +stubbed_methods+ work in the same way as for #stub.
- # def test_product
- # product = stub_everything('ipod_product', :price => 100)
- # assert_nil product.manufacturer
- # assert_nil product.any_old_method
- # assert_equal 100, product.price
- # end
- def stub_everything(*args)
- name, expectations = name_and_expectations_from_args(args)
- build_mock_with_expectations(:stub_everything, expectations, name)
- end
-
- def verify_mocks # :nodoc:
- mocks.each { |mock| mock.verify { yield if block_given? } }
- end
-
- def teardown_mocks # :nodoc:
- reset_mocks
- end
-
- def build_mock_with_expectations(expectation_type = :expects, expectations = {}, name = nil) # :nodoc:
- stub_everything = (expectation_type == :stub_everything)
- expectation_type = :stubs if expectation_type == :stub_everything
- mock = Mocha::Mock.new(stub_everything, name)
- expectations.each do |method, result|
- mock.__send__(expectation_type, method).returns(result)
- end
- mocks << mock
- mock
- end
-
- private
-
- def name_and_expectations_from_args(args) # :nodoc:
- name = args.first.is_a?(String) ? args.delete_at(0) : nil
- expectations = args.first || {}
- [name, expectations]
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/central.rb b/test/lib/mocha/central.rb
deleted file mode 100644
index 3dde735..0000000
--- a/test/lib/mocha/central.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-module Mocha
-
- class Central
-
- attr_accessor :stubba_methods
-
- def initialize
- self.stubba_methods = []
- end
-
- def stub(method)
- unless stubba_methods.include?(method)
- method.stub
- stubba_methods.push method
- end
- end
-
- def verify_all(&block)
- unique_mocks.each { |mock| mock.verify(&block) }
- end
-
- def unique_mocks
- stubba_methods.inject({}) { |mocks, method| mocks[method.mock.__id__] = method.mock; mocks }.values
- end
-
- def unstub_all
- while stubba_methods.size > 0
- method = stubba_methods.pop
- method.unstub
- end
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/class_method.rb b/test/lib/mocha/class_method.rb
deleted file mode 100644
index 915fe71..0000000
--- a/test/lib/mocha/class_method.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-require 'mocha/metaclass'
-
-module Mocha
-
- class ClassMethod
-
- attr_reader :stubbee, :method
-
- def initialize(stubbee, method)
- @stubbee, @method = stubbee, method
- end
-
- def stub
- hide_original_method
- define_new_method
- end
-
- def unstub
- remove_new_method
- restore_original_method
- stubbee.reset_mocha
- end
-
- def mock
- stubbee.mocha
- end
-
- def hide_original_method
- stubbee.__metaclass__.class_eval "alias_method :#{hidden_method}, :#{method}" if stubbee.__metaclass__.method_defined?(method)
- end
-
- def define_new_method
- stubbee.__metaclass__.class_eval "def #{method}(*args, &block); mocha.method_missing(:#{method}, *args, &block); end"
- end
-
- def remove_new_method
- stubbee.__metaclass__.class_eval "remove_method :#{method}"
- end
-
- def restore_original_method
- stubbee.__metaclass__.class_eval "alias_method :#{method}, :#{hidden_method}; remove_method :#{hidden_method}" if stubbee.__metaclass__.method_defined?(hidden_method)
- end
-
- def hidden_method
- method_name = method.to_s.gsub(/\W/) {|s| "_substituted_character_#{s[0]}_" }
- "__stubba__#{method_name}__stubba__"
- end
-
- def eql?(other)
- return false unless (other.class == self.class)
- (stubbee == other.stubbee) and (method == other.method)
- end
-
- alias_method :==, :eql?
-
- def to_s
- "#{stubbee}.#{method}"
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/expectation.rb b/test/lib/mocha/expectation.rb
deleted file mode 100644
index 49b39be..0000000
--- a/test/lib/mocha/expectation.rb
+++ /dev/null
@@ -1,378 +0,0 @@
-require 'mocha/infinite_range'
-require 'mocha/pretty_parameters'
-require 'mocha/expectation_error'
-require 'mocha/return_values'
-require 'mocha/exception_raiser'
-require 'mocha/yield_parameters'
-require 'mocha/is_a'
-
-module Mocha # :nodoc:
-
- # Methods on expectations returned from Mock#expects, Mock#stubs, Object#expects and Object#stubs.
- class Expectation
-
- # :stopdoc:
-
- class AlwaysEqual
- def ==(other)
- true
- end
- end
-
- attr_reader :method_name, :backtrace
-
- def initialize(mock, method_name, backtrace = nil)
- @mock, @method_name = mock, method_name
- @expected_count = 1
- @parameters, @parameter_block = AlwaysEqual.new, nil
- @invoked_count, @return_values = 0, ReturnValues.new
- @backtrace = backtrace || caller
- @yield_parameters = YieldParameters.new
- end
-
- def match?(method_name, *arguments)
- return false unless @method_name == method_name
- if @parameter_block then
- return false unless @parameter_block.call(*arguments)
- else
- return false unless (@parameters == arguments)
- end
- if @expected_count.is_a?(Range) then
- return false unless @invoked_count < @expected_count.last
- else
- return false unless @invoked_count < @expected_count
- end
- return true
- end
-
- # :startdoc:
-
- # :call-seq: times(range) -> expectation
- #
- # Modifies expectation so that the number of calls to the expected method must be within a specific +range+.
- #
- # +range+ can be specified as an exact integer or as a range of integers
- # object = mock()
- # object.expects(:expected_method).times(3)
- # 3.times { object.expected_method }
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).times(3)
- # 2.times { object.expected_method }
- # # => verify fails
- #
- # object = mock()
- # object.expects(:expected_method).times(2..4)
- # 3.times { object.expected_method }
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).times(2..4)
- # object.expected_method
- # # => verify fails
- def times(range)
- @expected_count = range
- self
- end
-
- # :call-seq: once() -> expectation
- #
- # Modifies expectation so that the expected method must be called exactly once.
- # Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
- # object = mock()
- # object.expects(:expected_method).once
- # object.expected_method
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).once
- # object.expected_method
- # object.expected_method
- # # => verify fails
- #
- # object = mock()
- # object.expects(:expected_method).once
- # # => verify fails
- def once()
- times(1)
- self
- end
-
- # :call-seq: never() -> expectation
- #
- # Modifies expectation so that the expected method must never be called.
- # object = mock()
- # object.expects(:expected_method).never
- # object.expected_method
- # # => verify fails
- #
- # object = mock()
- # object.expects(:expected_method).never
- # object.expected_method
- # # => verify succeeds
- def never
- times(0)
- self
- end
-
- # :call-seq: at_least(minimum_number_of_times) -> expectation
- #
- # Modifies expectation so that the expected method must be called at least a +minimum_number_of_times+.
- # object = mock()
- # object.expects(:expected_method).at_least(2)
- # 3.times { object.expected_method }
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).at_least(2)
- # object.expected_method
- # # => verify fails
- def at_least(minimum_number_of_times)
- times(Range.at_least(minimum_number_of_times))
- self
- end
-
- # :call-seq: at_least_once() -> expectation
- #
- # Modifies expectation so that the expected method must be called at least once.
- # object = mock()
- # object.expects(:expected_method).at_least_once
- # object.expected_method
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).at_least_once
- # # => verify fails
- def at_least_once()
- at_least(1)
- self
- end
-
- # :call-seq: at_most(maximum_number_of_times) -> expectation
- #
- # Modifies expectation so that the expected method must be called at most a +maximum_number_of_times+.
- # object = mock()
- # object.expects(:expected_method).at_most(2)
- # 2.times { object.expected_method }
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).at_most(2)
- # 3.times { object.expected_method }
- # # => verify fails
- def at_most(maximum_number_of_times)
- times(Range.at_most(maximum_number_of_times))
- self
- end
-
- # :call-seq: at_most_once() -> expectation
- #
- # Modifies expectation so that the expected method must be called at most once.
- # object = mock()
- # object.expects(:expected_method).at_most_once
- # object.expected_method
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).at_most_once
- # 2.times { object.expected_method }
- # # => verify fails
- def at_most_once()
- at_most(1)
- self
- end
-
- # :call-seq: with(*arguments, ¶meter_block) -> expectation
- #
- # Modifies expectation so that the expected method must be called with specified +arguments+.
- # object = mock()
- # object.expects(:expected_method).with(:param1, :param2)
- # object.expected_method(:param1, :param2)
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).with(:param1, :param2)
- # object.expected_method(:param3)
- # # => verify fails
- # May be used with parameter matchers in Mocha::ParameterMatchers.
- #
- # If a +parameter_block+ is given, the block is called with the parameters passed to the expected method.
- # The expectation is matched if the block evaluates to +true+.
- # object = mock()
- # object.expects(:expected_method).with() { |value| value % 4 == 0 }
- # object.expected_method(16)
- # # => verify succeeds
- #
- # object = mock()
- # object.expects(:expected_method).with() { |value| value % 4 == 0 }
- # object.expected_method(17)
- # # => verify fails
- def with(*arguments, ¶meter_block)
- @parameters, @parameter_block = arguments, parameter_block
- class << @parameters; def to_s; join(', '); end; end
- self
- end
-
- # :call-seq: yields(*parameters) -> expectation
- #
- # Modifies expectation so that when the expected method is called, it yields with the specified +parameters+.
- # object = mock()
- # object.expects(:expected_method).yields('result')
- # yielded_value = nil
- # object.expected_method { |value| yielded_value = value }
- # yielded_value # => 'result'
- # May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
- # object = mock()
- # object.stubs(:expected_method).yields(1).then.yields(2)
- # yielded_values_from_first_invocation = []
- # yielded_values_from_second_invocation = []
- # object.expected_method { |value| yielded_values_from_first_invocation << value } # first invocation
- # object.expected_method { |value| yielded_values_from_second_invocation << value } # second invocation
- # yielded_values_from_first_invocation # => [1]
- # yielded_values_from_second_invocation # => [2]
- def yields(*parameters)
- @yield_parameters.add(*parameters)
- self
- end
-
- # :call-seq: multiple_yields(*parameter_groups) -> expectation
- #
- # Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified +parameter_groups+.
- # object = mock()
- # object.expects(:expected_method).multiple_yields(['result_1', 'result_2'], ['result_3'])
- # yielded_values = []
- # object.expected_method { |*values| yielded_values << values }
- # yielded_values # => [['result_1', 'result_2'], ['result_3]]
- # May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
- # object = mock()
- # object.stubs(:expected_method).multiple_yields([1, 2], [3]).then.multiple_yields([4], [5, 6])
- # yielded_values_from_first_invocation = []
- # yielded_values_from_second_invocation = []
- # object.expected_method { |*values| yielded_values_from_first_invocation << values } # first invocation
- # object.expected_method { |*values| yielded_values_from_second_invocation << values } # second invocation
- # yielded_values_from_first_invocation # => [[1, 2], [3]]
- # yielded_values_from_second_invocation # => [[4], [5, 6]]
- def multiple_yields(*parameter_groups)
- @yield_parameters.multiple_add(*parameter_groups)
- self
- end
-
- # :call-seq: returns(value) -> expectation
- # :call-seq: returns(*values) -> expectation
- #
- # Modifies expectation so that when the expected method is called, it returns the specified +value+.
- # object = mock()
- # object.stubs(:stubbed_method).returns('result')
- # object.stubbed_method # => 'result'
- # object.stubbed_method # => 'result'
- # If multiple +values+ are given, these are returned in turn on consecutive calls to the method.
- # object = mock()
- # object.stubs(:stubbed_method).returns(1, 2)
- # object.stubbed_method # => 1
- # object.stubbed_method # => 2
- # May be called multiple times on the same expectation. Also see Expectation#then.
- # object = mock()
- # object.stubs(:expected_method).returns(1, 2).then.returns(3)
- # object.expected_method # => 1
- # object.expected_method # => 2
- # object.expected_method # => 3
- # May be called in conjunction with Expectation#raises on the same expectation.
- # object = mock()
- # object.stubs(:expected_method).returns(1, 2).then.raises(Exception)
- # object.expected_method # => 1
- # object.expected_method # => 2
- # object.expected_method # => raises exception of class Exception1
- # If +value+ is a +Proc+, then the expected method will return the result of calling <tt>Proc#call</tt>.
- #
- # This usage is _deprecated_.
- # Use explicit multiple return values and/or multiple expectations instead.
- #
- # A +Proc+ instance will be treated the same as any other value in a future release.
- # object = mock()
- # object.stubs(:stubbed_method).returns(lambda { rand(100) })
- # object.stubbed_method # => 41
- # object.stubbed_method # => 77
- def returns(*values)
- @return_values += ReturnValues.build(*values)
- self
- end
-
- # :call-seq: raises(exception = RuntimeError, message = nil) -> expectation
- #
- # Modifies expectation so that when the expected method is called, it raises the specified +exception+ with the specified +message+.
- # object = mock()
- # object.expects(:expected_method).raises(Exception, 'message')
- # object.expected_method # => raises exception of class Exception and with message 'message'
- # May be called multiple times on the same expectation. Also see Expectation#then.
- # object = mock()
- # object.stubs(:expected_method).raises(Exception1).then.raises(Exception2)
- # object.expected_method # => raises exception of class Exception1
- # object.expected_method # => raises exception of class Exception2
- # May be called in conjunction with Expectation#returns on the same expectation.
- # object = mock()
- # object.stubs(:expected_method).raises(Exception).then.returns(2, 3)
- # object.expected_method # => raises exception of class Exception1
- # object.expected_method # => 2
- # object.expected_method # => 3
- def raises(exception = RuntimeError, message = nil)
- @return_values += ReturnValues.new(ExceptionRaiser.new(exception, message))
- self
- end
-
- # :call-seq: then() -> expectation
- #
- # Syntactic sugar to improve readability. Has no effect on state of the expectation.
- # object = mock()
- # object.stubs(:expected_method).returns(1, 2).then.raises(Exception).then.returns(4)
- # object.expected_method # => 1
- # object.expected_method # => 2
- # object.expected_method # => raises exception of class Exception
- # object.expected_method # => 4
- def then
- self
- end
-
- # :stopdoc:
-
- def invoke
- @invoked_count += 1
- if block_given? then
- @yield_parameters.next_invocation.each do |yield_parameters|
- yield(*yield_parameters)
- end
- end
- @return_values.next
- end
-
- def verify
- yield(self) if block_given?
- unless (@expected_count === @invoked_count) then
- error = ExpectationError.new(error_message(@expected_count, @invoked_count))
- error.set_backtrace(filtered_backtrace)
- raise error
- end
- end
-
- def mocha_lib_directory
- File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
- end
-
- def filtered_backtrace
- backtrace.reject { |location| Regexp.new(mocha_lib_directory).match(File.expand_path(location)) }
- end
-
- def method_signature
- return "#{method_name}" if @parameters.__is_a__(AlwaysEqual)
- "#{@method_name}(#{PrettyParameters.new(@parameters).pretty})"
- end
-
- def error_message(expected_count, actual_count)
- "#{@mock.mocha_inspect}.#{method_signature} - expected calls: #{expected_count.mocha_inspect}, actual calls: #{actual_count}"
- end
-
- # :startdoc:
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/expectation_error.rb b/test/lib/mocha/expectation_error.rb
deleted file mode 100644
index c01482e..0000000
--- a/test/lib/mocha/expectation_error.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-module Mocha
-
- class ExpectationError < StandardError
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/missing_expectation.rb b/test/lib/mocha/missing_expectation.rb
deleted file mode 100644
index f84227d..0000000
--- a/test/lib/mocha/missing_expectation.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'mocha/expectation'
-
-module Mocha # :nodoc:
-
- class MissingExpectation < Expectation # :nodoc:
-
- def initialize(mock, method_name)
- super
- @invoked_count = true
- end
-
- def verify
- msg = error_message(0, 1)
- similar_expectations_list = similar_expectations.collect { |expectation| expectation.method_signature }.join("\n")
- msg << "\nSimilar expectations:\n#{similar_expectations_list}" unless similar_expectations.empty?
- error = ExpectationError.new(msg)
- error.set_backtrace(filtered_backtrace)
- raise error if @invoked_count
- end
-
- def similar_expectations
- @mock.expectations.select { |expectation| expectation.method_name == self.method_name }
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/mock.rb b/test/lib/mocha/mock.rb
deleted file mode 100644
index 18c23fe..0000000
--- a/test/lib/mocha/mock.rb
+++ /dev/null
@@ -1,207 +0,0 @@
-require 'mocha/expectation'
-require 'mocha/stub'
-require 'mocha/missing_expectation'
-require 'mocha/metaclass'
-
-module Mocha # :nodoc:
-
- # Traditional mock object.
- #
- # Methods return an Expectation which can be further modified by methods on Expectation.
- class Mock
-
- # :stopdoc:
-
- def initialize(stub_everything = false, name = nil)
- @stub_everything = stub_everything
- @mock_name = name
- @expectations = []
- @responder = nil
- end
-
- attr_reader :stub_everything, :expectations
-
- # :startdoc:
-
- # :call-seq: expects(method_name) -> expectation
- # expects(method_names) -> last expectation
- #
- # Adds an expectation that a method identified by +method_name+ symbol must be called exactly once with any parameters.
- # Returns the new expectation which can be further modified by methods on Expectation.
- # object = mock()
- # object.expects(:method1)
- # object.method1
- # # no error raised
- #
- # object = mock()
- # object.expects(:method1)
- # # error raised, because method1 not called exactly once
- # If +method_names+ is a +Hash+, an expectation will be set up for each entry using the key as +method_name+ and value as +return_value+.
- # object = mock()
- # object.expects(:method1 => :result1, :method2 => :result2)
- #
- # # exactly equivalent to
- #
- # object = mock()
- # object.expects(:method1).returns(:result1)
- # object.expects(:method2).returns(:result2)
- #
- # Aliased by <tt>\_\_expects\_\_</tt>
- def expects(method_name_or_hash, backtrace = nil)
- if method_name_or_hash.is_a?(Hash) then
- method_name_or_hash.each do |method_name, return_value|
- add_expectation(Expectation.new(self, method_name, backtrace).returns(return_value))
- end
- else
- add_expectation(Expectation.new(self, method_name_or_hash, backtrace))
- end
- end
-
- # :call-seq: stubs(method_name) -> expectation
- # stubs(method_names) -> last expectation
- #
- # Adds an expectation that a method identified by +method_name+ symbol may be called any number of times with any parameters.
- # Returns the new expectation which can be further modified by methods on Expectation.
- # object = mock()
- # object.stubs(:method1)
- # object.method1
- # object.method1
- # # no error raised
- # If +method_names+ is a +Hash+, an expectation will be set up for each entry using the key as +method_name+ and value as +return_value+.
- # object = mock()
- # object.stubs(:method1 => :result1, :method2 => :result2)
- #
- # # exactly equivalent to
- #
- # object = mock()
- # object.stubs(:method1).returns(:result1)
- # object.stubs(:method2).returns(:result2)
- #
- # Aliased by <tt>\_\_stubs\_\_</tt>
- def stubs(method_name_or_hash, backtrace = nil)
- if method_name_or_hash.is_a?(Hash) then
- method_name_or_hash.each do |method_name, return_value|
- add_expectation(Stub.new(self, method_name, backtrace).returns(return_value))
- end
- else
- add_expectation(Stub.new(self, method_name_or_hash, backtrace))
- end
- end
-
- # :call-seq: responds_like(responder) -> mock
- #
- # Constrains the +mock+ so that it can only expect or stub methods to which +responder+ responds. The constraint is only applied at method invocation time.
- #
- # A +NoMethodError+ will be raised if the +responder+ does not <tt>respond_to?</tt> a method invocation (even if the method has been expected or stubbed).
- #
- # The +mock+ will delegate its <tt>respond_to?</tt> method to the +responder+.
- # class Sheep
- # def chew(grass); end
- # def self.number_of_legs; end
- # end
- #
- # sheep = mock('sheep')
- # sheep.expects(:chew)
- # sheep.expects(:foo)
- # sheep.respond_to?(:chew) # => true
- # sheep.respond_to?(:foo) # => true
- # sheep.chew
- # sheep.foo
- # # no error raised
- #
- # sheep = mock('sheep')
- # sheep.responds_like(Sheep.new)
- # sheep.expects(:chew)
- # sheep.expects(:foo)
- # sheep.respond_to?(:chew) # => true
- # sheep.respond_to?(:foo) # => false
- # sheep.chew
- # sheep.foo # => raises NoMethodError exception
- #
- # sheep_class = mock('sheep_class')
- # sheep_class.responds_like(Sheep)
- # sheep_class.stubs(:number_of_legs).returns(4)
- # sheep_class.expects(:foo)
- # sheep_class.respond_to?(:number_of_legs) # => true
- # sheep_class.respond_to?(:foo) # => false
- # assert_equal 4, sheep_class.number_of_legs
- # sheep_class.foo # => raises NoMethodError exception
- #
- # Aliased by +quacks_like+
- def responds_like(object)
- @responder = object
- self
- end
-
- # :stopdoc:
-
- alias_method :__expects__, :expects
-
- alias_method :__stubs__, :stubs
-
- alias_method :quacks_like, :responds_like
-
- def add_expectation(expectation)
- @expectations << expectation
- method_name = expectation.method_name
- self.__metaclass__.send(:undef_method, method_name) if self.__metaclass__.method_defined?(method_name)
- expectation
- end
-
- def method_missing(symbol, *arguments, &block)
- if @responder and not @responder.respond_to?(symbol)
- raise NoMethodError, "undefined method `#{symbol}' for #{self.mocha_inspect} which responds like #{@responder.mocha_inspect}"
- end
- matching_expectation = matching_expectation(symbol, *arguments)
- if matching_expectation then
- matching_expectation.invoke(&block)
- elsif stub_everything then
- return
- else
- begin
- super_method_missing(symbol, *arguments, &block)
- rescue NoMethodError
- unexpected_method_called(symbol, *arguments)
- end
- end
- end
-
- def respond_to?(symbol)
- if @responder then
- @responder.respond_to?(symbol)
- else
- @expectations.any? { |expectation| expectation.method_name == symbol }
- end
- end
-
- def super_method_missing(symbol, *arguments, &block)
- raise NoMethodError
- end
-
- def unexpected_method_called(symbol, *arguments)
- MissingExpectation.new(self, symbol).with(*arguments).verify
- end
-
- def matching_expectation(symbol, *arguments)
- @expectations.reverse.detect { |expectation| expectation.match?(symbol, *arguments) }
- end
-
- def verify(&block)
- @expectations.each { |expectation| expectation.verify(&block) }
- end
-
- def mocha_inspect
- address = self.__id__ * 2
- address += 0x100000000 if address < 0
- @mock_name ? "#<Mock:#{@mock_name}>" : "#<Mock:0x#{'%x' % address}>"
- end
-
- def inspect
- mocha_inspect
- end
-
- # :startdoc:
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers.rb b/test/lib/mocha/parameter_matchers.rb
deleted file mode 100644
index 193f77d..0000000
--- a/test/lib/mocha/parameter_matchers.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-module Mocha
-
- # Used as parameters for Expectation#with to restrict the parameter values which will match the expectation.
- module ParameterMatchers; end
-
-end
-
-
-Dir[File.expand_path(File.join(File.dirname(__FILE__), 'parameter_matchers', "*.rb"))].each { |lib| require lib }
diff --git a/test/lib/mocha/parameter_matchers/all_of.rb b/test/lib/mocha/parameter_matchers/all_of.rb
deleted file mode 100644
index 343d9ee..0000000
--- a/test/lib/mocha/parameter_matchers/all_of.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: all_of -> parameter_matcher
- #
- # Matches if all +matchers+ match.
- # object = mock()
- # object.expects(:method_1).with(all_of(includes(1), includes(3)))
- # object.method_1([1, 3])
- # # no error raised
- #
- # object = mock()
- # object.expects(:method_1).with(all_of(includes(1), includes(3)))
- # object.method_1([1, 2])
- # # error raised, because method_1 was not called with object including 1 and 3
- def all_of(*matchers)
- AllOf.new(*matchers)
- end
-
- class AllOf # :nodoc:
-
- def initialize(*matchers)
- @matchers = matchers
- end
-
- def ==(parameter)
- @matchers.all? { |matcher| matcher == parameter }
- end
-
- def mocha_inspect
- "all_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
- end
-
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/any_of.rb b/test/lib/mocha/parameter_matchers/any_of.rb
deleted file mode 100644
index a1f8807..0000000
--- a/test/lib/mocha/parameter_matchers/any_of.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: any_of -> parameter_matcher
- #
- # Matches if any +matchers+ match.
- # object = mock()
- # object.expects(:method_1).with(any_of(1, 3))
- # object.method_1(1)
- # # no error raised
- #
- # object = mock()
- # object.expects(:method_1).with(any_of(1, 3))
- # object.method_1(3)
- # # no error raised
- #
- # object = mock()
- # object.expects(:method_1).with(any_of(1, 3))
- # object.method_1(2)
- # # error raised, because method_1 was not called with 1 or 3
- def any_of(*matchers)
- AnyOf.new(*matchers)
- end
-
- class AnyOf # :nodoc:
-
- def initialize(*matchers)
- @matchers = matchers
- end
-
- def ==(parameter)
- @matchers.any? { |matcher| matcher == parameter }
- end
-
- def mocha_inspect
- "any_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
- end
-
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/anything.rb b/test/lib/mocha/parameter_matchers/anything.rb
deleted file mode 100644
index 57d0eea..0000000
--- a/test/lib/mocha/parameter_matchers/anything.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: anything -> parameter_matcher
- #
- # Matches any object.
- # object = mock()
- # object.expects(:method_1).with(anything)
- # object.method_1('foo')
- # # no error raised
- def anything
- Anything.new
- end
-
- class Anything # :nodoc:
-
- def ==(parameter)
- return true
- end
-
- def mocha_inspect
- "anything"
- end
-
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_entry.rb b/test/lib/mocha/parameter_matchers/has_entry.rb
deleted file mode 100644
index 3d7cac4..0000000
--- a/test/lib/mocha/parameter_matchers/has_entry.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: has_entry(key, value) -> parameter_matcher
- #
- # Matches +Hash+ containing entry with +key+ and +value+.
- # object = mock()
- # object.expects(:method_1).with(has_entry('key_1', 1))
- # object.method_1('key_1' => 1, 'key_2' => 2)
- # # no error raised
- #
- # object = mock()
- # object.expects(:method_1).with(has_entry('key_1', 1))
- # object.method_1('key_1' => 2, 'key_2' => 1)
- # # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
- def has_entry(key, value)
- HasEntry.new(key, value)
- end
-
- class HasEntry # :nodoc:
-
- def initialize(key, value)
- @key, @value = key, value
- end
-
- def ==(parameter)
- parameter[@key] == @value
- end
-
- def mocha_inspect
- "has_entry(#{@key.mocha_inspect}, #{@value.mocha_inspect})"
- end
-
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_key.rb b/test/lib/mocha/parameter_matchers/has_key.rb
deleted file mode 100644
index 5a1fcd2..0000000
--- a/test/lib/mocha/parameter_matchers/has_key.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: has_key(key) -> parameter_matcher
- #
- # Matches +Hash+ containing +key+.
- # object = mock()
- # object.expects(:method_1).with(has_key('key_1'))
- # object.method_1('key_1' => 1, 'key_2' => 2)
- # # no error raised
- #
- # object = mock()
- # object.expects(:method_1).with(has_key('key_1'))
- # object.method_1('key_2' => 2)
- # # error raised, because method_1 was not called with Hash containing key: 'key_1'
- def has_key(key)
- HasKey.new(key)
- end
-
- class HasKey # :nodoc:
-
- def initialize(key)
- @key = key
- end
-
- def ==(parameter)
- parameter.keys.include?(@key)
- end
-
- def mocha_inspect
- "has_key(#{@key.mocha_inspect})"
- end
-
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_value.rb b/test/lib/mocha/parameter_matchers/has_value.rb
deleted file mode 100644
index 742f842..0000000
--- a/test/lib/mocha/parameter_matchers/has_value.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: has_value(value) -> parameter_matcher
- #
- # Matches +Hash+ containing +value+.
- # object = mock()
- # object.expects(:method_1).with(has_value(1))
- # object.method_1('key_1' => 1, 'key_2' => 2)
- # # no error raised
- #
- # object = mock()
- # object.expects(:method_1).with(has_value(1))
- # object.method_1('key_2' => 2)
- # # error raised, because method_1 was not called with Hash containing value: 1
- def has_value(value)
- HasValue.new(value)
- end
-
- class HasValue # :nodoc:
-
- def initialize(value)
- @value = value
- end
-
- def ==(parameter)
- parameter.values.include?(@value)
- end
-
- def mocha_inspect
- "has_value(#{@value.mocha_inspect})"
- end
-
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/includes.rb b/test/lib/mocha/parameter_matchers/includes.rb
deleted file mode 100644
index 0e4fbe9..0000000
--- a/test/lib/mocha/parameter_matchers/includes.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-module Mocha
-
- module ParameterMatchers
-
- # :call-seq: includes(item) -> parameter_matcher
- #
- # Matches any object that responds true to include?(item)
- # object = mock()
- # object.expects(:method_1).with(includes('foo'))
- # object.method_1(['foo', 'bar'])
- # # no error raised
- #
- # object.method_1(['baz'])
- # # error raised, because ['baz'] does not include 'foo'.
- def includes(item)
- Includes.new(item)
- end
-
- class Includes # :nodoc:
-
- def initialize(item)
- @item = item
- end
-
- def ==(parameter)
- return parameter.include?(@item)
- end
-
- def mocha_inspect
- "includes(#{@item.mocha_inspect})"
- end
-
- end
-
- end
-
-end
diff --git a/test/lib/mocha/pretty_parameters.rb b/test/lib/mocha/pretty_parameters.rb
deleted file mode 100644
index 6d3c165..0000000
--- a/test/lib/mocha/pretty_parameters.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'mocha/inspect'
-
-module Mocha
-
- class PrettyParameters
-
- def initialize(params)
- @params = params
- @params_string = params.mocha_inspect
- end
-
- def pretty
- remove_outer_array_braces!
- remove_outer_hash_braces!
- @params_string
- end
-
- def remove_outer_array_braces!
- @params_string = @params_string.gsub(/^\[|\]$/, '')
- end
-
- def remove_outer_hash_braces!
- @params_string = @params_string.gsub(/^\{|\}$/, '') if @params.size == 1
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/return_values.rb b/test/lib/mocha/return_values.rb
deleted file mode 100644
index ea0fbbd..0000000
--- a/test/lib/mocha/return_values.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'mocha/single_return_value'
-
-module Mocha # :nodoc:
-
- class ReturnValues # :nodoc:
-
- def self.build(*values)
- new(*values.map { |value| SingleReturnValue.new(value) })
- end
-
- attr_accessor :values
-
- def initialize(*values)
- @values = values
- end
-
- def next
- case @values.size
- when 0: nil
- when 1: @values.first.evaluate
- else @values.shift.evaluate
- end
- end
-
- def +(other)
- self.class.new(*(@values + other.values))
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/yield_parameters.rb b/test/lib/mocha/yield_parameters.rb
deleted file mode 100644
index b1623bf..0000000
--- a/test/lib/mocha/yield_parameters.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'mocha/no_yields'
-require 'mocha/single_yield'
-require 'mocha/multiple_yields'
-
-module Mocha # :nodoc:
-
- class YieldParameters # :nodoc:
-
- def initialize
- @parameter_groups = []
- end
-
- def next_invocation
- case @parameter_groups.size
- when 0: NoYields.new
- when 1: @parameter_groups.first
- else @parameter_groups.shift
- end
- end
-
- def add(*parameters)
- @parameter_groups << SingleYield.new(*parameters)
- end
-
- def multiple_add(*parameter_groups)
- @parameter_groups << MultipleYields.new(*parameter_groups)
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/test/lib/puppettest.rb b/test/lib/puppettest.rb
index 76ae96e..e276bdf 100755
--- a/test/lib/puppettest.rb
+++ b/test/lib/puppettest.rb
@@ -6,6 +6,17 @@ mainlib = File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
$LOAD_PATH.unshift(mainlib) unless $LOAD_PATH.include?(mainlib)
require 'puppet'
+
+# include any gems in vendor/gems
+Dir["#{mainlib}/../vendor/gems/**"].each do |path|
+ libpath = File.join(path, "lib")
+ if File.directory?(libpath)
+ $LOAD_PATH.unshift(libpath)
+ else
+ $LOAD_PATH.unshift(path)
+ end
+end
+
require 'mocha'
# Only load the test/unit class if we're not in the spec directory.
@@ -25,9 +36,9 @@ class Class
def publicize_methods(*methods)
saved_private_instance_methods = methods.empty? ? self.private_instance_methods : methods
- self.class_eval { public *saved_private_instance_methods }
+ self.class_eval { public(*saved_private_instance_methods) }
yield
- self.class_eval { private *saved_private_instance_methods }
+ self.class_eval { private(*saved_private_instance_methods) }
end
end
@@ -187,7 +198,7 @@ module PuppetTest
# If we're running under rake, then disable debugging and such.
#if rake? or ! Puppet[:debug]
- if defined?($puppet_debug) or ! rake?
+ #if defined?($puppet_debug) or ! rake?
if textmate?
Puppet[:color] = false
end
@@ -199,11 +210,11 @@ module PuppetTest
end
Puppet::Util::Log.level = :debug
#$VERBOSE = 1
- else
- Puppet::Util::Log.close
- Puppet::Util::Log.newdestination(@logs)
- Puppet[:httplog] = tempfile()
- end
+ #else
+ # Puppet::Util::Log.close
+ # Puppet::Util::Log.newdestination(@logs)
+ # Puppet[:httplog] = tempfile()
+ #end
Puppet[:ignoreschedules] = true
@@ -256,11 +267,7 @@ module PuppetTest
@tmpdir
end
- def teardown
- #@stop = Time.now
- #File.open("/tmp/test_times.log", ::File::WRONLY|::File::CREAT|::File::APPEND) { |f| f.puts "%0.4f %s %s" % [@stop - @start, @method_name, self.class] }
- @@cleaners.each { |cleaner| cleaner.call() }
-
+ def remove_tmp_files
@@tmpfiles.each { |file|
unless file =~ /tmp/
puts "Not deleting tmpfile %s" % file
@@ -272,6 +279,14 @@ module PuppetTest
end
}
@@tmpfiles.clear
+ end
+
+ def teardown
+ #@stop = Time.now
+ #File.open("/tmp/test_times.log", ::File::WRONLY|::File::CREAT|::File::APPEND) { |f| f.puts "%0.4f %s %s" % [@stop - @start, @method_name, self.class] }
+ @@cleaners.each { |cleaner| cleaner.call() }
+
+ remove_tmp_files
@@tmppids.each { |pid|
%x{kill -INT #{pid} 2>/dev/null}
@@ -306,7 +321,6 @@ module PuppetTest
rescue Timeout::Error
# just move on
end
- mocha_verify
end
def logstore
diff --git a/test/lib/puppettest/parsertesting.rb b/test/lib/puppettest/parsertesting.rb
index 6fd6018..1a08ecb 100644
--- a/test/lib/puppettest/parsertesting.rb
+++ b/test/lib/puppettest/parsertesting.rb
@@ -5,7 +5,7 @@ module PuppetTest::ParserTesting
include PuppetTest
AST = Puppet::Parser::AST
- Compile = Puppet::Parser::Compile
+ Compiler = Puppet::Parser::Compiler
# A fake class that we can use for testing evaluation.
class FakeAST
@@ -41,10 +41,10 @@ module PuppetTest::ParserTesting
)
end
- def mkcompile(parser = nil)
+ def mkcompiler(parser = nil)
parser ||= mkparser
node = mknode
- return Compile.new(node, parser)
+ return Compiler.new(node, parser)
end
def mknode(name = nil)
@@ -58,21 +58,21 @@ module PuppetTest::ParserTesting
Puppet::Parser::Interpreter.new
end
- def mkparser
- Puppet::Parser::Parser.new()
+ def mkparser(args = {})
+ Puppet::Parser::Parser.new(args)
end
def mkscope(hash = {})
hash[:parser] ||= mkparser
- compile ||= mkcompile(hash[:parser])
- compile.topscope.source = (hash[:parser].findclass("", "") || hash[:parser].newclass(""))
+ compiler ||= mkcompiler(hash[:parser])
+ compiler.topscope.source = (hash[:parser].findclass("", "") || hash[:parser].newclass(""))
- unless compile.topscope.source
+ unless compiler.topscope.source
raise "Could not find source for scope"
end
# Make the 'main' stuff
- compile.send(:evaluate_main)
- compile.topscope
+ compiler.send(:evaluate_main)
+ compiler.topscope
end
def classobj(name, hash = {})
diff --git a/test/lib/puppettest/support/resources.rb b/test/lib/puppettest/support/resources.rb
index 384f61c..255c555 100755
--- a/test/lib/puppettest/support/resources.rb
+++ b/test/lib/puppettest/support/resources.rb
@@ -18,7 +18,7 @@ module PuppetTest::Support::Resources
if resource.is_a?(String)
resource = tree_resource(resource)
end
- config.add_edge!(comp, resource)
+ config.add_edge(comp, resource)
config.add_resource resource unless config.resource(resource.ref)
end
return comp
diff --git a/test/network/client/master.rb b/test/network/client/master.rb
index 696d08b..4179657 100755
--- a/test/network/client/master.rb
+++ b/test/network/client/master.rb
@@ -211,6 +211,16 @@ end
"Lost value to hostname")
end
+ # Make sure that setting environment by fact takes precedence to configuration
+ def test_setenvironmentwithfact
+ name = "environment"
+ value = "test_environment"
+
+ Facter.stubs(:to_hash).returns(name => value)
+
+ assert_equal(value, Puppet::Network::Client.master.facts[name])
+ end
+
# Make sure we load all facts on startup.
def test_loadfacts
dirs = [tempfile(), tempfile()]
diff --git a/test/network/handler/fileserver.rb b/test/network/handler/fileserver.rb
index 233e705..a705dbf 100755
--- a/test/network/handler/fileserver.rb
+++ b/test/network/handler/fileserver.rb
@@ -109,13 +109,13 @@ class TestFileServer < Test::Unit::TestCase
# and verify different iterations of 'root' return the same value
list = nil
assert_nothing_raised {
- list = server.list("/test/", :ignore, true, false)
+ list = server.list("/test/", :manage, true, false)
}
assert(list =~ pattern)
assert_nothing_raised {
- list = server.list("/test", :ignore, true, false)
+ list = server.list("/test", :manage, true, false)
}
assert(list =~ pattern)
@@ -143,7 +143,7 @@ class TestFileServer < Test::Unit::TestCase
list = nil
sfile = "/test/tmpfile"
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false)
+ list = server.list(sfile, :manage, true, false)
}
assert_nothing_raised {
@@ -200,7 +200,7 @@ class TestFileServer < Test::Unit::TestCase
list = nil
sfile = "/test/"
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false)
+ list = server.list(sfile, :manage, true, false)
}
# create the new file
@@ -210,7 +210,7 @@ class TestFileServer < Test::Unit::TestCase
newlist = nil
assert_nothing_raised {
- newlist = server.list(sfile, :ignore, true, false)
+ newlist = server.list(sfile, :manage, true, false)
}
# verify the list has changed
@@ -239,12 +239,12 @@ class TestFileServer < Test::Unit::TestCase
list = nil
assert_nothing_raised {
- list = server.list("/root/" + testdir, :ignore, true, false)
+ list = server.list("/root/" + testdir, :manage, true, false)
}
assert(list =~ pattern)
assert_nothing_raised {
- list = server.list("/root" + testdir, :ignore, true, false)
+ list = server.list("/root" + testdir, :manage, true, false)
}
assert(list =~ pattern)
@@ -279,7 +279,7 @@ class TestFileServer < Test::Unit::TestCase
# get our list
list = nil
assert_nothing_raised {
- list = server.list("/test/with", :ignore, false, false)
+ list = server.list("/test/with", :manage, false, false)
}
# make sure we only got one line, since we're not recursing
@@ -288,7 +288,7 @@ class TestFileServer < Test::Unit::TestCase
# for each level of recursion, make sure we get the right list
[0, 1, 2].each { |num|
assert_nothing_raised {
- list = server.list("/test/with", :ignore, num, false)
+ list = server.list("/test/with", :manage, num, false)
}
count = 0
@@ -332,13 +332,13 @@ class TestFileServer < Test::Unit::TestCase
list = nil
# and then check a few dirs
assert_nothing_raised {
- list = server.list("/localhost/with", :ignore, false, false)
+ list = server.list("/localhost/with", :manage, false, false)
}
assert(list !~ /with/)
assert_nothing_raised {
- list = server.list("/localhost/with/some/sub", :ignore, true, false)
+ list = server.list("/localhost/with/some/sub", :manage, true, false)
}
assert(list !~ /sub/)
@@ -370,7 +370,7 @@ class TestFileServer < Test::Unit::TestCase
list = nil
assert_nothing_raised {
- list = server.list("/localhost/", :ignore, 1, false)
+ list = server.list("/localhost/", :manage, 1, false)
}
assert_instance_of(String, list, "Server returned %s instead of string")
list = list.split("\n")
@@ -402,7 +402,7 @@ class TestFileServer < Test::Unit::TestCase
list = nil
sfile = "/test/"
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false)
+ list = server.list(sfile, :manage, true, false)
}
# and describe each file in the list
@@ -492,7 +492,7 @@ class TestFileServer < Test::Unit::TestCase
mounts.each { |mount, files|
mount = "/#{mount}/"
assert_nothing_raised {
- list = server.list(mount, :ignore, true, false)
+ list = server.list(mount, :manage, true, false)
}
assert_nothing_raised {
@@ -544,12 +544,12 @@ class TestFileServer < Test::Unit::TestCase
assert_raise(Puppet::AuthorizationError,
"Host %s, ip %s, allowed %s" %
[host, ip, mount]) {
- list = server.list(mount, :ignore, true, false, host, ip)
+ list = server.list(mount, :manage, true, false, host, ip)
}
when :allow:
assert_nothing_raised("Host %s, ip %s, denied %s" %
[host, ip, mount]) {
- list = server.list(mount, :ignore, true, false, host, ip)
+ list = server.list(mount, :manage, true, false, host, ip)
}
end
}
@@ -602,7 +602,7 @@ class TestFileServer < Test::Unit::TestCase
assert_raise(Puppet::Network::Handler::FileServerError,
"Invalid mount was mounted") {
- server.list(mount, :ignore)
+ server.list(mount, :manage)
}
}
@@ -654,13 +654,13 @@ class TestFileServer < Test::Unit::TestCase
list = nil
assert_nothing_raised {
- list = server.list("/thing/", :ignore, false, false,
+ list = server.list("/thing/", :manage, false, false,
"test1.domain.com", "127.0.0.1")
}
assert(list != "", "List returned nothing in rereard test")
assert_raise(Puppet::AuthorizationError, "List allowed invalid host") {
- list = server.list("/thing/", :ignore, false, false,
+ list = server.list("/thing/", :manage, false, false,
"test2.domain.com", "127.0.0.1")
}
@@ -675,12 +675,12 @@ class TestFileServer < Test::Unit::TestCase
}
assert_raise(Puppet::AuthorizationError, "List allowed invalid host") {
- list = server.list("/thing/", :ignore, false, false,
+ list = server.list("/thing/", :manage, false, false,
"test1.domain.com", "127.0.0.1")
}
assert_nothing_raised {
- list = server.list("/thing/", :ignore, false, false,
+ list = server.list("/thing/", :manage, false, false,
"test2.domain.com", "127.0.0.1")
}
@@ -735,7 +735,7 @@ class TestFileServer < Test::Unit::TestCase
# Then not
results = {}
assert_nothing_raised {
- server.describe("/mount/link", :ignore).split("\t").zip(
+ server.describe("/mount/link", :manage).split("\t").zip(
Puppet::Network::Handler.fileserver::CHECKPARAMS
).each { |v,p| results[p] = v }
}
@@ -801,28 +801,28 @@ allow *
list = nil
sfile = "/host/file.txt"
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false, client1, ip)
+ list = server.list(sfile, :manage, true, false, client1, ip)
}
assert_equal("/\tfile", list)
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false, client2, ip)
+ list = server.list(sfile, :manage, true, false, client2, ip)
}
assert_equal("", list)
sfile = "/fqdn/file.txt"
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false, client1, ip)
+ list = server.list(sfile, :manage, true, false, client1, ip)
}
assert_equal("", list)
assert_nothing_raised {
- list = server.list(sfile, :ignore, true, false, client2, ip)
+ list = server.list(sfile, :manage, true, false, client2, ip)
}
assert_equal("/\tfile", list)
# check describe
sfile = "/host/file.txt"
assert_nothing_raised {
- list = server.describe(sfile, :ignore, client1, ip).split("\t")
+ list = server.describe(sfile, :manage, client1, ip).split("\t")
}
assert_equal(5, list.size)
assert_equal("file", list[1])
@@ -830,18 +830,18 @@ allow *
assert_equal("{md5}#{md5}", list[4])
assert_nothing_raised {
- list = server.describe(sfile, :ignore, client2, ip).split("\t")
+ list = server.describe(sfile, :manage, client2, ip).split("\t")
}
assert_equal([], list)
sfile = "/fqdn/file.txt"
assert_nothing_raised {
- list = server.describe(sfile, :ignore, client1, ip).split("\t")
+ list = server.describe(sfile, :manage, client1, ip).split("\t")
}
assert_equal([], list)
assert_nothing_raised {
- list = server.describe(sfile, :ignore, client2, ip).split("\t")
+ list = server.describe(sfile, :manage, client2, ip).split("\t")
}
assert_equal(5, list.size)
assert_equal("file", list[1])
@@ -851,23 +851,23 @@ allow *
# Check retrieve
sfile = "/host/file.txt"
assert_nothing_raised {
- list = server.retrieve(sfile, :ignore, client1, ip).chomp
+ list = server.retrieve(sfile, :manage, client1, ip).chomp
}
assert_equal(contents[client1_hostdir].chomp, list)
assert_nothing_raised {
- list = server.retrieve(sfile, :ignore, client2, ip).chomp
+ list = server.retrieve(sfile, :manage, client2, ip).chomp
}
assert_equal("", list)
sfile = "/fqdn/file.txt"
assert_nothing_raised {
- list = server.retrieve(sfile, :ignore, client1, ip).chomp
+ list = server.retrieve(sfile, :manage, client1, ip).chomp
}
assert_equal("", list)
assert_nothing_raised {
- list = server.retrieve(sfile, :ignore, client2, ip).chomp
+ list = server.retrieve(sfile, :manage, client2, ip).chomp
}
assert_equal(contents[client2_fqdndir].chomp, list)
end
@@ -945,12 +945,14 @@ allow *
# Now, check that they use Facter info
Puppet.notice "The following messages are normal"
client = nil
- local = Facter["hostname"].value
- domain = Facter["domain"].value
- fqdn = [local, domain].join(".")
- {"%h" => local, # Short name
- "%H" => fqdn, # Full name
- "%d" => domain, # domain
+ Facter.stubs(:value).with(:ipaddress).returns("127.0.0.1")
+ Facter.stubs(:value).with { |v| v.to_s == "hostname" }.returns("myhost")
+ Facter.stubs(:value).with { |v| v.to_s == "domain" }.returns("mydomain.com")
+ Facter.stubs(:value).with(:domain).returns("mydomain.com")
+
+ {"%h" => "myhost", # Short name
+ "%H" => "myhost.mydomain.com", # Full name
+ "%d" => "mydomain.com", # domain
"%%" => "%", # escape
"%o" => "%o" # other
}.each do |pat, repl|
@@ -993,18 +995,18 @@ allow *
ret = nil
assert_nothing_raised do
- ret = server.list("/name", :ignore, false, false, host, ip)
+ ret = server.list("/name", :manage, false, false, host, ip)
end
assert_equal("/\tfile", ret)
assert_nothing_raised do
- ret = server.describe("/name", :ignore, host, ip)
+ ret = server.describe("/name", :manage, host, ip)
end
- assert(ret =~ /\tfile\t/, "Did not get valid a description")
+ assert(ret =~ /\tfile\t/, "Did not get valid a description (#{ret.inspect})")
assert_nothing_raised do
- ret = server.retrieve("/name", :ignore, host, ip)
+ ret = server.retrieve("/name", :manage, host, ip)
end
assert_equal(ret, File.read(file))
@@ -1050,7 +1052,7 @@ allow *
mount = "/#{mod.name}/"
list = nil
assert_nothing_raised {
- list = server.list(mount, :ignore, true, false)
+ list = server.list(mount, :manage, true, false)
}
list = list.split("\n")
if mod.name == "green"
@@ -1063,7 +1065,7 @@ allow *
end
assert_nothing_raised("Host 'allow' denied #{mount}") {
- server.list(mount, :ignore, true, false,
+ server.list(mount, :manage, true, false,
'allow.example.com', "192.168.0.1")
}
end
@@ -1106,7 +1108,7 @@ allow *
list = nil
mount = "/#{mod.name}/"
assert_nothing_raised {
- list = server.list(mount, :ignore, true, false)
+ list = server.list(mount, :manage, true, false)
}
assert_nothing_raised {
@@ -1121,11 +1123,11 @@ allow *
# now let's check that things are being correctly forbidden
assert_raise(Puppet::AuthorizationError,
"Host 'deny' allowed #{mount}") {
- server.list(mount, :ignore, true, false,
+ server.list(mount, :manage, true, false,
'deny.example.com', "192.168.1.1")
}
assert_nothing_raised("Host 'allow' denied #{mount}") {
- server.list(mount, :ignore, true, false,
+ server.list(mount, :manage, true, false,
'allow.example.com', "192.168.0.1")
}
end
diff --git a/test/network/server/webrick.rb b/test/network/server/webrick.rb
index d3408c1..fe6d69a 100755
--- a/test/network/server/webrick.rb
+++ b/test/network/server/webrick.rb
@@ -95,7 +95,7 @@ class TestWebrickServer < Test::Unit::TestCase
# the client starts its connection immediately, thus throwing
# the error.
assert_raise(OpenSSL::SSL::SSLError) {
- client = Puppet::Network::Client.status.new(:Server => "localhost", :Port => @@port)
+ Puppet::Network::HttpPool.http_instance("localhost", @@port).start
}
end
diff --git a/test/other/dsl.rb b/test/other/dsl.rb
index b4dd065..45b5198 100755
--- a/test/other/dsl.rb
+++ b/test/other/dsl.rb
@@ -12,7 +12,7 @@ class TestDSL < Test::Unit::TestCase
def teardown
super
- Puppet::Aspect.clear
+ Puppet::DSL::Aspect.clear
end
def test_aspect
@@ -22,7 +22,7 @@ class TestDSL < Test::Unit::TestCase
end
end
- assert_equal(a, Puppet::Aspect[:yaytest])
+ assert_equal(a, Puppet::DSL::Aspect[:yaytest])
# Now make a child aspect
b = nil
@@ -154,8 +154,7 @@ class TestDSL < Test::Unit::TestCase
resource = nil
assert_nothing_raised do
- resource = a.newresource filetype, path,
- :content => "yay", :mode => "640"
+ resource = a.newresource filetype, path, :content => "yay", :mode => "640"
end
assert_instance_of(Puppet::Parser::Resource, resource)
diff --git a/test/other/transactions.rb b/test/other/transactions.rb
index 79971a2..ce2d0d5 100755
--- a/test/other/transactions.rb
+++ b/test/other/transactions.rb
@@ -6,10 +6,12 @@ require 'puppet'
require 'puppettest'
require 'mocha'
require 'puppettest/support/resources'
+require 'puppettest/support/utils'
class TestTransactions < Test::Unit::TestCase
include PuppetTest::FileTesting
include PuppetTest::Support::Resources
+ include PuppetTest::Support::Utils
class Fakeprop <Puppet::Property
attr_accessor :path, :is, :should, :name
def should_to_s(value)
@@ -348,12 +350,12 @@ class TestTransactions < Test::Unit::TestCase
fcomp = Puppet::Type.type(:component).create(:name => "file")
config.add_resource fcomp
config.add_resource file
- config.add_edge!(fcomp, file)
+ config.add_edge(fcomp, file)
ecomp = Puppet::Type.type(:component).create(:name => "exec")
config.add_resource ecomp
config.add_resource exec
- config.add_edge!(ecomp, exec)
+ config.add_edge(ecomp, exec)
# 'subscribe' expects an array of arrays
#component[:require] = [[file.class.name,file.name]]
@@ -828,10 +830,10 @@ class TestTransactions < Test::Unit::TestCase
c = trigger.new(:c)
nope = Puppet::Relationship.new(a, b)
yep = Puppet::Relationship.new(a, c, {:callback => :refresh})
- graph.add_edge!(nope)
+ graph.add_edge(nope)
# And a triggering one.
- graph.add_edge!(yep)
+ graph.add_edge(yep)
# Create our transaction
trans = Puppet::Transaction.new(graph)
diff --git a/test/rails/ast.rb b/test/rails/ast.rb
index e51fa6c..1deaec0 100755
--- a/test/rails/ast.rb
+++ b/test/rails/ast.rb
@@ -44,12 +44,12 @@ class TestRailsAST < PuppetTest::TestCase
# And if it is, make sure we throw an error.
if bad
assert_raise(Puppet::ParseError, "Evaluated '#{string}'") do
- str, code = query.evaluate :scope => @scope
+ str, code = query.evaluate @scope
end
next
else
assert_nothing_raised("Could not evaluate '#{string}'") do
- str, code = query.evaluate :scope => @scope
+ str, code = query.evaluate @scope
end
end
assert_nothing_raised("Could not find resource") do
diff --git a/test/rails/configuration.rb b/test/rails/configuration.rb
index 9e2ddfe..a878d13 100755
--- a/test/rails/configuration.rb
+++ b/test/rails/configuration.rb
@@ -24,7 +24,7 @@ class ConfigurationRailsTests < PuppetTest::TestCase
# We need to make sure finished objects are stored in the db.
def test_finish_before_store
railsinit
- compile = mkcompile
+ compile = mkcompiler
parser = compile.parser
node = parser.newnode [compile.node.name], :code => AST::ASTArray.new(:children => [
diff --git a/test/rails/railsparameter.rb b/test/rails/railsparameter.rb
index d83115b..7c99ac3 100755
--- a/test/rails/railsparameter.rb
+++ b/test/rails/railsparameter.rb
@@ -25,6 +25,8 @@ class TestRailsParameter < Test::Unit::TestCase
source = parser.newclass "myclass"
host = Puppet::Rails::Host.new(:name => "myhost")
+
+ host.save
resource = host.resources.create(
:title => "/tmp/to_resource",
diff --git a/test/rails/railsresource.rb b/test/rails/railsresource.rb
index 5805847..3df5001 100755
--- a/test/rails/railsresource.rb
+++ b/test/rails/railsresource.rb
@@ -29,6 +29,7 @@ class TestRailsResource < Test::Unit::TestCase
def mktest_resource
# We need a host for resources
host = Puppet::Rails::Host.new(:name => "myhost")
+ host.save
# Now build a resource
resource = host.resources.create(
diff --git a/test/ral/manager/type.rb b/test/ral/manager/type.rb
index 6a04468..324550a 100755
--- a/test/ral/manager/type.rb
+++ b/test/ral/manager/type.rb
@@ -574,8 +574,8 @@ class TestType < Test::Unit::TestCase
assert_equal(greater, type.defaultprovider)
end
- # Make sure that we can have multiple isomorphic objects with the same name,
- # but not with non-isomorphic objects.
+ # Make sure that we can have multiple non-isomorphic objects with the same name,
+ # but not with isomorphic objects.
def test_isomorphic_names
# First do execs, since they're not isomorphic.
echo = Puppet::Util.binary "echo"
@@ -708,7 +708,7 @@ class TestType < Test::Unit::TestCase
res = type.create(hash)
config.add_resource res
if parent
- config.add_edge!(parent, res)
+ config.add_edge(parent, res)
end
res
end
@@ -741,7 +741,7 @@ class TestType < Test::Unit::TestCase
newcomp = Puppet::Type.newcomponent :type => "yay", :name => "Good[bad]"
config.add_resource newcomp
- config.add_edge! comp, newcomp
+ config.add_edge comp, newcomp
exec = mk.call(6, :parent => newcomp)
assert_equal("//Good[bad]/Exec[exec6]", exec.path)
end
diff --git a/test/ral/providers/cron/crontab.rb b/test/ral/providers/cron/crontab.rb
index 2da4b1b..1ff1e34 100755
--- a/test/ral/providers/cron/crontab.rb
+++ b/test/ral/providers/cron/crontab.rb
@@ -344,7 +344,9 @@ class TestCronParsedProvider < Test::Unit::TestCase
end
end
- # Make sure we can create a cron in an empty tab
+ # Make sure we can create a cron in an empty tab.
+ # LAK:FIXME This actually modifies the user's crontab,
+ # which is pretty heinous.
def test_mkcron_if_empty
setme
@provider.filetype = @oldfiletype
diff --git a/test/ral/providers/package.rb b/test/ral/providers/package.rb
index 90c8621..f2d28d0 100755
--- a/test/ral/providers/package.rb
+++ b/test/ral/providers/package.rb
@@ -46,7 +46,7 @@ class TestPackageProvider < Test::Unit::TestCase
end
facts = {}
Facter.to_hash.each do |fact, value|
- facts[fact.downcase.intern] = value.downcase.intern
+ facts[fact.to_s.downcase.intern] = value.to_s.downcase.intern
end
list.find_all { |hash| # First find the matching providers
hash.include?(:provider) and providers.include?(hash[:provider])
diff --git a/test/ral/types/basic.rb b/test/ral/type/basic.rb
similarity index 96%
rename from test/ral/types/basic.rb
rename to test/ral/type/basic.rb
index 7bbadc5..3c5faee 100755
--- a/test/ral/types/basic.rb
+++ b/test/ral/type/basic.rb
@@ -36,8 +36,8 @@ class TestBasic < Test::Unit::TestCase
)
}
@config = mk_catalog(@component, @configfile, @command)
- @config.add_edge! @component, @configfile
- @config.add_edge! @component, @command
+ @config.add_edge @component, @configfile
+ @config.add_edge @component, @command
end
def teardown
diff --git a/test/ral/types/cron.rb b/test/ral/type/cron.rb
similarity index 100%
rename from test/ral/types/cron.rb
rename to test/ral/type/cron.rb
diff --git a/test/ral/types/exec.rb b/test/ral/type/exec.rb
similarity index 95%
rename from test/ral/types/exec.rb
rename to test/ral/type/exec.rb
index f718f94..e2a3dd9 100755
--- a/test/ral/types/exec.rb
+++ b/test/ral/type/exec.rb
@@ -394,8 +394,8 @@ class TestExec < Test::Unit::TestCase
assert_apply(exec)
assert_nothing_raised {
- exec[:command] = "echo logoutput is warning"
- exec[:logoutput] = "warning"
+ exec[:command] = "echo logoutput is on_failure"
+ exec[:logoutput] = "on_failure"
}
assert_apply(exec)
@@ -587,6 +587,46 @@ and stuff"
assert_equal("A B\n", output)
end
+ def test_environmentparam
+ exec = Puppet::Type.newexec(
+ :command => "echo $environmenttest",
+ :path => ENV["PATH"],
+ :environment => "environmenttest=yayness"
+ )
+
+ assert(exec, "Could not make exec")
+
+ output = status = nil
+ assert_nothing_raised {
+ output, status = exec.run("echo $environmenttest")
+ }
+
+ assert_equal("yayness\n", output)
+
+ # Now check whether we can do multiline settings
+ assert_nothing_raised do
+ exec[:environment] = "environmenttest=a list of things
+and stuff"
+ end
+
+ output = status = nil
+ assert_nothing_raised {
+ output, status = exec.run('echo "$environmenttest"')
+ }
+ assert_equal("a list of things\nand stuff\n", output)
+
+ # Now test arrays
+ assert_nothing_raised do
+ exec[:environment] = ["funtest=A", "yaytest=B"]
+ end
+
+ output = status = nil
+ assert_nothing_raised {
+ output, status = exec.run('echo "$funtest" "$yaytest"')
+ }
+ assert_equal("A B\n", output)
+ end
+
def test_timeout
exec = Puppet::Type.type(:exec).create(:command => "sleep 1", :path => ENV["PATH"], :timeout => "0.2")
time = Time.now
diff --git a/test/ral/types/file.rb b/test/ral/type/file.rb
similarity index 95%
rename from test/ral/types/file.rb
rename to test/ral/type/file.rb
index a3a0c57..5cf989a 100755
--- a/test/ral/types/file.rb
+++ b/test/ral/type/file.rb
@@ -9,9 +9,7 @@ require 'fileutils'
class TestFile < Test::Unit::TestCase
include PuppetTest::Support::Utils
include PuppetTest::FileTesting
- # hmmm
- # this is complicated, because we store references to the created
- # objects in a central store
+
def mkfile(hash)
file = nil
assert_nothing_raised {
@@ -21,8 +19,6 @@ class TestFile < Test::Unit::TestCase
end
def mktestfile
- # because luke's home directory is on nfs, it can't be used for testing
- # as root
tmpfile = tempfile()
File.open(tmpfile, "w") { |f| f.puts rand(100) }
@@tmpfiles.push tmpfile
@@ -181,7 +177,7 @@ class TestFile < Test::Unit::TestCase
assert_equal(inituser, File.stat(file).uid)
obj.delete(:owner)
- obj[:links] = :ignore
+ obj[:links] = :follow
# And then test 'group'
group = nonrootgroup
@@ -189,12 +185,6 @@ class TestFile < Test::Unit::TestCase
initgroup = File.stat(file).gid
obj[:group] = group.name
- assert_events([:file_changed], obj)
- assert_equal(initgroup, File.stat(file).gid)
- assert_equal(group.gid, File.lstat(link).gid)
- File.chown(nil, initgroup, file)
- File.lchown(nil, initgroup, link)
-
obj[:links] = :follow
assert_events([:file_changed], obj)
assert_equal(group.gid, File.stat(file).gid)
@@ -407,8 +397,7 @@ class TestFile < Test::Unit::TestCase
assert(events)
- assert(! events.include?(:file_changed),
- "File incorrectly changed")
+ assert(! events.include?(:file_changed), "File incorrectly changed")
assert_events([], file)
# We have to sleep because the time resolution of the time-based
@@ -1046,66 +1035,6 @@ class TestFile < Test::Unit::TestCase
"directory mode is incorrect")
end
- def test_followlinks
- File.umask(0022)
-
- basedir = tempfile()
- Dir.mkdir(basedir)
- file = File.join(basedir, "file")
- link = File.join(basedir, "link")
-
- File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
- File.symlink(file, link)
-
- obj = nil
- assert_nothing_raised {
- obj = Puppet.type(:file).create(
- :path => link,
- :mode => "755"
- )
- }
- obj.retrieve
-
- assert_events([], obj)
-
- # Assert that we default to not following links
- assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
-
- # Assert that we can manage the link directly, but modes still don't change
- obj[:links] = :manage
- assert_events([], obj)
-
- assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
-
- obj[:links] = :follow
- assert_events([:file_changed], obj)
-
- assert_equal("%o" % 0755, "%o" % (File.stat(file).mode & 007777))
-
- # Now verify that content and checksum don't update, either
- obj.delete(:mode)
- obj[:checksum] = "md5"
- obj[:links] = :ignore
-
- assert_events([], obj)
- File.open(file, "w") { |f| f.puts "more text" }
- assert_events([], obj)
- obj[:links] = :follow
- assert_events([], obj)
- File.open(file, "w") { |f| f.puts "even more text" }
- assert_events([:file_changed], obj)
-
- obj.delete(:checksum)
- obj[:content] = "this is some content"
- obj[:links] = :ignore
-
- assert_events([], obj)
- File.open(file, "w") { |f| f.puts "more text" }
- assert_events([], obj)
- obj[:links] = :follow
- assert_events([:file_changed], obj)
- end
-
# If both 'ensure' and 'content' are used, make sure that all of the other
# properties are handled correctly.
def test_contentwithmode
@@ -1292,6 +1221,7 @@ class TestFile < Test::Unit::TestCase
:title => "localfile",
:path => localfile,
:content => "rahtest",
+ :ensure => :file,
:backup => false
)
@@ -1304,8 +1234,8 @@ class TestFile < Test::Unit::TestCase
config.apply
assert(FileTest.exists?(dsourcefile), "File did not get copied")
- assert(FileTest.exists?(localfile), "File did not get created")
- assert(FileTest.exists?(purgee), "File got prematurely purged")
+ assert(FileTest.exists?(localfile), "Local file did not get created")
+ assert(FileTest.exists?(purgee), "Purge target got prematurely purged")
assert_nothing_raised { destobj[:purge] = true }
config.apply
@@ -1387,8 +1317,7 @@ class TestFile < Test::Unit::TestCase
File.symlink(dir, link)
File.open(file, "w") { |f| f.puts "" }
assert_equal(dir, File.readlink(link))
- obj = Puppet::Type.newfile :path => link, :ensure => :link,
- :target => file, :recurse => false, :backup => "main"
+ obj = Puppet::Type.newfile :path => link, :ensure => :link, :target => file, :recurse => false, :backup => "main"
assert_apply(obj)
@@ -1817,5 +1746,31 @@ class TestFile < Test::Unit::TestCase
changes = obj.evaluate
assert(changes.empty?, "Missing file with no ensure resulted in changes")
end
-end
+ def test_root_dir_is_named_correctly
+ obj = Puppet::Type.newfile(:path => '/', :mode => 0755)
+ assert_equal("/", obj.title, "/ directory was changed to empty string")
+ end
+
+ # #1010 and #1037 -- write should fail if the written checksum does not
+ # match the file we thought we were writing.
+ def test_write_validates_checksum
+ file = tempfile
+ inst = Puppet::Type.newfile(:path => file, :content => "something")
+
+ tmpfile = file + ".puppettmp"
+
+ wh = mock 'writehandle', :print => nil
+ rh = mock 'readhandle'
+ rh.expects(:read).with(512).times(2).returns("other").then.returns(nil)
+ File.expects(:open).with { |*args| args[0] == tmpfile and args[1] != "r" }.yields(wh)
+ File.expects(:open).with { |*args| args[0] == tmpfile and args[1] == "r" }.yields(rh)
+
+ File.stubs(:rename)
+ FileTest.stubs(:exist?).returns(true)
+ FileTest.stubs(:file?).returns(true)
+
+ inst.expects(:fail)
+ inst.write("something", :whatever)
+ end
+end
diff --git a/test/ral/types/file/target.rb b/test/ral/type/file/target.rb
similarity index 100%
rename from test/ral/types/file/target.rb
rename to test/ral/type/file/target.rb
diff --git a/test/ral/types/filebucket.rb b/test/ral/type/filebucket.rb
similarity index 100%
rename from test/ral/types/filebucket.rb
rename to test/ral/type/filebucket.rb
diff --git a/test/ral/types/fileignoresource.rb b/test/ral/type/fileignoresource.rb
similarity index 100%
rename from test/ral/types/fileignoresource.rb
rename to test/ral/type/fileignoresource.rb
diff --git a/test/ral/types/filesources.rb b/test/ral/type/filesources.rb
similarity index 97%
rename from test/ral/types/filesources.rb
rename to test/ral/type/filesources.rb
index 02bf8a5..a7bb6fe 100755
--- a/test/ral/types/filesources.rb
+++ b/test/ral/type/filesources.rb
@@ -84,8 +84,7 @@ class TestFileSources < Test::Unit::TestCase
source = tempfile()
dest = tempfile()
- file = Puppet::Type.newfile :path => dest, :source => source,
- :title => "copier"
+ file = Puppet::Type.newfile :path => dest, :source => source, :title => "copier"
property = file.property(:source)
@@ -124,17 +123,10 @@ class TestFileSources < Test::Unit::TestCase
File.open(target, "w") { |f| f.puts "yay" }
File.symlink(target, source)
- file[:links] = :ignore
- assert_nil(property.describe(source),
- "Links were not ignored")
-
file[:links] = :manage
- # We can't manage links at this point
- assert_raise(Puppet::Network::Handler::FileServerError) do
- property.describe(source)
- end
+ assert_equal("link", property.describe(source)[:type])
- # And then make sure links get followed, otherwise
+ # And then make sure links get followed
file[:links] = :follow
assert_equal("file", property.describe(source)[:type])
end
@@ -753,29 +745,18 @@ class TestFileSources < Test::Unit::TestCase
assert_nothing_raised {
file = Puppet.type(:file).create(
:name => dest,
- :source => link
+ :source => link,
+ :links => :follow
)
}
- # Default to skipping links
- assert_events([], file)
- assert(! FileTest.exists?(dest), "Created link")
-
- # Now follow the links
- file[:links] = :follow
assert_events([:file_created], file)
assert(FileTest.file?(dest), "Destination is not a file")
# Now copy the links
- #assert_raise(Puppet::Network::Handler::FileServerError) {
- trans = nil
- assert_nothing_raised {
- file[:links] = :manage
- comp = mk_catalog(file)
- trans = comp.apply
- }
-
- assert(trans.failed?(file), "Object did not fail to copy links")
+ file[:links] = :manage
+ assert_events([:link_created], file)
+ assert(FileTest.symlink?(dest), "Destination is not a link")
end
def test_changes
diff --git a/test/ral/types/group.rb b/test/ral/type/group.rb
similarity index 100%
rename from test/ral/types/group.rb
rename to test/ral/type/group.rb
diff --git a/test/ral/types/host.rb b/test/ral/type/host.rb
similarity index 93%
rename from test/ral/types/host.rb
rename to test/ral/type/host.rb
index 088f93c..a5d645b 100755
--- a/test/ral/types/host.rb
+++ b/test/ral/type/host.rb
@@ -138,8 +138,24 @@ class TestHost < Test::Unit::TestCase
host[:ensure] = :absent
assert_events([:host_removed], host)
end
+
+ def test_invalid_ipaddress
+ host = mkhost()
+
+ assert_raise(Puppet::Error) {
+ host[:ip] = "abc.def.ghi.jkl"
+ }
+ end
+
+ def test_invalid_hostname
+ host = mkhost()
+
+ assert_raise(Puppet::Error) {
+ host[:name] = "!invalid.hostname.$$$"
+ }
end
+ end
def test_aliasisproperty
assert_equal(:property, @hosttype.attrtype(:alias))
end
diff --git a/test/ral/types/mailalias.rb b/test/ral/type/mailalias.rb
similarity index 100%
rename from test/ral/types/mailalias.rb
rename to test/ral/type/mailalias.rb
diff --git a/test/ral/types/parameter.rb b/test/ral/type/parameter.rb
similarity index 100%
rename from test/ral/types/parameter.rb
rename to test/ral/type/parameter.rb
diff --git a/test/ral/types/port.rb b/test/ral/type/port.rb
similarity index 100%
rename from test/ral/types/port.rb
rename to test/ral/type/port.rb
diff --git a/test/ral/types/property.rb b/test/ral/type/property.rb
similarity index 100%
rename from test/ral/types/property.rb
rename to test/ral/type/property.rb
diff --git a/test/ral/types/resources.rb b/test/ral/type/resources.rb
similarity index 100%
rename from test/ral/types/resources.rb
rename to test/ral/type/resources.rb
diff --git a/test/ral/types/service.rb b/test/ral/type/service.rb
similarity index 100%
rename from test/ral/types/service.rb
rename to test/ral/type/service.rb
diff --git a/test/ral/types/sshkey.rb b/test/ral/type/sshkey.rb
similarity index 100%
rename from test/ral/types/sshkey.rb
rename to test/ral/type/sshkey.rb
diff --git a/test/ral/types/tidy.rb b/test/ral/type/tidy.rb
similarity index 100%
rename from test/ral/types/tidy.rb
rename to test/ral/type/tidy.rb
index 60fad65..17f98df 100755
--- a/test/ral/types/tidy.rb
+++ b/test/ral/type/tidy.rb
@@ -4,6 +4,7 @@ require File.dirname(__FILE__) + '/../../lib/puppettest'
require 'puppettest'
require 'puppettest/support/utils'
+require 'puppet/type/tidy'
class TestTidy < Test::Unit::TestCase
include PuppetTest::Support::Utils
diff --git a/test/ral/types/user.rb b/test/ral/type/user.rb
similarity index 100%
rename from test/ral/types/user.rb
rename to test/ral/type/user.rb
diff --git a/test/ral/types/yumrepo.rb b/test/ral/type/yumrepo.rb
similarity index 100%
rename from test/ral/types/yumrepo.rb
rename to test/ral/type/yumrepo.rb
diff --git a/test/ral/types/zone.rb b/test/ral/type/zone.rb
similarity index 100%
rename from test/ral/types/zone.rb
rename to test/ral/type/zone.rb
diff --git a/test/test b/test/test
new file mode 100755
index 0000000..a8efd50
--- /dev/null
+++ b/test/test
@@ -0,0 +1,241 @@
+#!/usr/bin/env ruby
+
+#
+# = Synopsis
+#
+# Run unit tests, usually with the goal of resolving some conflict
+# between tests.
+#
+# = Usage
+#
+# test [-d|--debug] [-f|--files] [-h|--help] [-n method] [-v|--verbose] <file> [file] ...
+#
+# = Description
+#
+# This script is useful for running a specific subset of unit tests, especially
+# when attempting to find a conflict between tests. By default, it will take
+# the first argument you pass it and run that test or test directory with each
+# test directory in turn, looking for a failure. If any tests fail, then
+# the script will drill into that test directory, looking for the specific conflict.
+#
+# In this way, when you have deduced you have two conflicting unit tests (tests which
+# pass in isolation but fail when run together), you can tell this script where
+# the failure is and leave it alone to find the conflict.
+#
+# This script is different from the Rakefile because it will run all tests in
+# a single process, whereas if you ask the Rakefile to run multiple tests, it will
+# run them in separate processes thus making it impossible to find conflicts.
+#
+# = Examples
+#
+# Attempt to resolve a conflict between a single test suite that could be anywhere:
+#
+# ./test ral/providers/user.rb
+#
+# Determine whether two individual files conflict:
+#
+# ./test --files language/functions.rb ral/providers/provider.rb
+#
+# Run the same test, but only run a specific unit test:
+#
+# ./test -d -n test_search --files language/functions.rb ral/providers/provider.rb
+#
+# = Options
+#
+# debug::
+# Enable full debugging.
+#
+# files::
+# Specify exactly which files to test.
+#
+# help::
+# Print this help message
+#
+# n::
+# Specify a single unit test to run. You can still specify as many files
+# as you want.
+#
+# verbose::
+# Print extra information.
+#
+# = Example
+#
+# puppet -l /tmp/script.log script.pp
+#
+# = Author
+#
+# Luke Kanies
+#
+# = Copyright
+#
+# Copyright (c) 2005 Reductive Labs, LLC
+# Licensed under the GNU Public License
+
+require 'find'
+require 'getoptlong'
+include Find
+
+result = GetoptLong.new(
+ [ "--debug", "-d", GetoptLong::NO_ARGUMENT ],
+ [ "--verbose", "-v", GetoptLong::NO_ARGUMENT ],
+ [ "-n", GetoptLong::REQUIRED_ARGUMENT ],
+ [ "--files", "-f", GetoptLong::NO_ARGUMENT ],
+ [ "--help", "-h", GetoptLong::NO_ARGUMENT ]
+)
+
+usage = "USAGE: %s [--help] suite" % $0
+
+$options = {}
+keep = []
+
+result.each { |opt,arg|
+ case opt
+ when "--verbose"
+ $options[:verbose] = true
+ when "--files"
+ $options[:files] = true
+ when "--debug"
+ $options[:debug] = true
+ $options[:verbose] = true
+ when "--help"
+ puts usage
+ exit
+ else
+ keep << opt
+ keep << arg if arg
+ end
+}
+
+def dirs
+ Dir.glob("*").find_all { |d| FileTest.directory?(d) }.reject { |d|
+ ["lib", "data"].include?(d)
+ }
+end
+
+def rake(*args)
+ print "trying %s..." % args.join(" ")
+ output = %x{rake %s} % args.join(" ")
+
+ if $?.exitstatus == 0
+ puts "succeeded"
+ return true
+ else
+ puts "failed"
+ return false
+ end
+end
+
+def resolve(dir)
+ dirs = dirs()
+
+ # If the passed dir is a subdir or file, put the basedir last
+ if dir.include?(File::SEPARATOR)
+ basedir = dir.split(File::SEPARATOR)[0]
+ if dirs.include?(basedir)
+ dirs.delete(basedir)
+ dirs << basedir
+ end
+ end
+
+ failed = nil
+ dirs.each do |d|
+ next if d == dir
+ unless run([d, dir])
+ failed = d
+ break
+ end
+ end
+ puts "%s failed" % failed
+
+ files = ruby_files(failed)
+
+ files.each do |file|
+ unless run([file, dir])
+ puts file
+ exit(0)
+ end
+ end
+
+ exit(1)
+end
+
+def ruby_files(dir)
+ files = []
+ # First collect the entire file list.
+ begin
+ find(dir) { |f| files << f if f =~ /\.rb$/ }
+ rescue => detail
+ puts "could not find on %s: %s" % [dir.inspect, detail]
+ end
+ files
+end
+
+def run(files, flags = nil)
+ args = %w{ruby}
+ args << "-Ilib:../lib"
+ args << "lib/rake/puppet_test_loader.rb"
+ if flags
+ args += flags
+ end
+ args += ARGV
+
+ print files.join(" ") + "... "
+ $stdout.flush
+
+ files.each do |file|
+ case File.stat(file).ftype
+ when "file": args << file
+ when "directory": args += ruby_files(file)
+ else
+ $stderr.puts "Skipping %s; can't handle %s" %
+ [file, File.stat(file).ftype]
+ end
+ end
+ args = args.join(" ")
+ if $options[:verbose]
+ p args
+ end
+ output = %x{#{args} 2>&1}
+ if $options[:debug]
+ print output
+ end
+
+ if $?.exitstatus == 0
+ puts "succeeded"
+ return true
+ else
+ puts "failed"
+ puts output
+ return false
+ end
+end
+
+if $options[:files]
+ run(ARGV, keep)
+else
+ dir = ARGV.shift
+
+ unless dir
+ $stderr.puts usage
+ exit(1)
+ end
+ resolve(dir)
+end
+#
+#
+#files = []
+#
+#args.each do |test|
+# if FileTest.directory?(test)
+# files += ruby_files(test)
+# end
+#end
+
+## Now load all of our files.
+#files.each do |file|
+# load file unless file =~ /^-/
+#end
+#
+#runner = Test::Unit::AutoRunner.new(false)
+#runner.process_args
+#runner.run
diff --git a/test/util/autoload.rb b/test/util/autoload.rb
index 6babed7..de503ab 100755
--- a/test/util/autoload.rb
+++ b/test/util/autoload.rb
@@ -103,10 +103,10 @@ TestAutoload.newthing(:#{name.to_s})
assert(loader.send(:searchpath).include?(dir), "searchpath does not include the libdir")
end
- # This causes very strange behaviour in the tests. We need to make sure we
- # require the same path that a user would use, otherwise we'll result in
- # a reload of the
- def test_require_does_not_cause_reload
+ # This tests #1027, which was caused by using the unqualified
+ # path for requires, which was initially done so that the kernel
+ # would keep track of which files got loaded.
+ def test_require_uses_full_path
loadname = "testing"
loader = Puppet::Util::Autoload.new(self.class, loadname)
@@ -120,7 +120,26 @@ TestAutoload.newthing(:#{name.to_s})
Dir.expects(:glob).with("#{dir}/*.rb").returns(file)
- Kernel.expects(:require).with(File.join(loadname, subname))
+ Kernel.expects(:require).with(file)
loader.loadall
end
+
+ def test_searchpath_includes_plugin_dirs
+ moddir = "/what/ever"
+ libdir = "/other/dir"
+ Puppet.settings.stubs(:value).with(:modulepath).returns(moddir)
+ Puppet.settings.stubs(:value).with(:libdir).returns(libdir)
+
+ loadname = "testing"
+ loader = Puppet::Util::Autoload.new(self.class, loadname)
+
+ # Currently, include both plugins and libs.
+ paths = %w{plugins lib}.inject({}) { |hash, d| hash[d] = File.join(moddir, "testing", d); FileTest.stubs(:directory?).with(hash[d]).returns(true); hash }
+ Dir.expects(:glob).with("#{moddir}/*/{plugins,lib}").returns(paths.values)
+
+ searchpath = loader.searchpath
+ paths.each do |dir, path|
+ assert(searchpath.include?(path), "search path did not include path for %s" % dir)
+ end
+ end
end
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list