Initial commit
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2e3f724
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+
+# Statsd
+
+## Sample pillar
+
+statsd:
+  server:
+    enabled: true
+    bind_port: 8125
+    backends:
+    - type: graphite
+      host: metrics1.domain.com
+      port: 2003
+
+## Read more
+
+* https://github.com/etsy/statsd/
+* https://github.com/mrtazz/statsd-amqp-backend
\ No newline at end of file
diff --git a/conf/default b/conf/default
new file mode 100644
index 0000000..8414d9b
--- /dev/null
+++ b/conf/default
@@ -0,0 +1,11 @@
+description "statsd"
+author "etsy"
+
+start on startup
+stop on shutdown
+
+script
+    chdir /srv/statsd
+
+    exec sudo -u statsd /srv/statsd/scripts/start
+end script
diff --git a/conf/init b/conf/init
new file mode 100644
index 0000000..b7b7320
--- /dev/null
+++ b/conf/init
@@ -0,0 +1,158 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: statsd
+# Required-Start: $network $local_fs
+# Required-Stop:
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+### END INIT INFO
+
+# Do NOT "set -e"
+
+PATH=$PATH:/usr/local/bin:/usr/bin:/bin
+NODE_BIN=$(which nodejs||which node)
+
+if [ ! -x "$NODE_BIN" ]; then
+  echo "Can't find executable nodejs or node in PATH=$PATH"
+  exit 1
+fi
+
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
+DESC="StatsD"
+NAME=statsd
+DAEMON=$NODE_BIN
+DAEMON_ARGS="/srv/statsd/stats.js /etc/statsd/localConfig.js 2>&1 >> /var/log/statsd/statsd.log "
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+CHDIR="/srv/statsd"
+
+# Exit if the package is not installed
+# [ -x "$DAEMON" ] || exit 0
+
+# Read configuration variable file if it is present
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+# Load the VERBOSE setting and other rcS variables
+. /lib/init/vars.sh
+
+# Define LSB log_* functions.
+# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
+. /lib/lsb/init-functions
+
+#
+# Function that starts the daemon/service
+#
+do_start()
+{
+# Return
+# 0 if daemon has been started
+# 1 if daemon was already running
+# 2 if daemon could not be started
+start-stop-daemon --start --quiet -m --pidfile $PIDFILE --startas $DAEMON --background --test > /dev/null \
+|| return 1
+start-stop-daemon --start --quiet -m --pidfile $PIDFILE --startas $DAEMON --background --chdir $CHDIR -- \
+$DAEMON_ARGS > /dev/null 2> /var/log/$NAME-stderr.log \
+|| return 2
+# Add code here, if necessary, that waits for the process to be ready
+# to handle requests from services started subsequently which depend
+# on this one. As a last resort, sleep for some time.
+}
+
+#
+# Function that stops the daemon/service
+#
+do_stop()
+{
+# Return
+# 0 if daemon has been stopped
+# 1 if daemon was already stopped
+# 2 if daemon could not be stopped
+# other if a failure occurred
+start-stop-daemon --stop --quiet --retry=0/0/KILL/5 --pidfile $PIDFILE
+RETVAL="$?"
+[ "$RETVAL" = 2 ] && return 2
+# Wait for children to finish too if this is a daemon that forks
+# and if the daemon is only ever run from this initscript.
+# If the above conditions are not satisfied then add some other code
+# that waits for the process to drop all resources that could be
+# needed by services started subsequently. A last resort is to
+# sleep for some time.
+start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+[ "$?" = 2 ] && return 2
+# Many daemons don't delete their pidfiles when they exit.
+rm -f $PIDFILE
+return "$RETVAL"
+}
+
+#
+# Function that sends a SIGHUP to the daemon/service
+#
+do_reload() {
+#
+# If the daemon can reload its configuration without
+# restarting (for example, when it is sent a SIGHUP),
+# then implement that here.
+#
+start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+return 0
+}
+
+case "$1" in
+  start)
+[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+do_start
+case "$?" in
+0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+esac
+;;
+  stop)
+[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+do_stop
+case "$?" in
+0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+esac
+;;
+  #reload|force-reload)
+#
+# If do_reload() is not implemented then leave this commented out
+# and leave 'force-reload' as an alias for 'restart'.
+#
+#log_daemon_msg "Reloading $DESC" "$NAME"
+#do_reload
+#log_end_msg $?
+#;;
+  restart|force-reload)
+#
+# If the "reload" option is implemented then remove the
+# 'force-reload' alias
+#
+log_daemon_msg "Restarting $DESC" "$NAME"
+do_stop
+case "$?" in
+0|1)
+do_start
+case "$?" in
+0) log_end_msg 0 ;;
+1) log_end_msg 1 ;; # Old process is still running
+*) log_end_msg 1 ;; # Failed to start
+esac
+;;
+*)
+# Failed to stop
+log_end_msg 1
+;;
+esac
+;;
+  status)
+    status_of_proc $DAEMON "$NAME"
+    ;;
+  *)
+echo "Usage: $SCRIPTNAME {start|stop|restart|status|force-reload}" >&2
+exit 3
+;;
+esac
+
+:
diff --git a/conf/localConfig.js b/conf/localConfig.js
new file mode 100644
index 0000000..35236de
--- /dev/null
+++ b/conf/localConfig.js
@@ -0,0 +1,18 @@
+{

+	{%- for backend in pillar.statsd.backends %}

+	{%- if backend.type == 'graphite' %}

+	graphitePort: {{ backend.port }},

+	graphiteHost: "{{ backend.host }}",

+	{%- endif %}

+	{%- if backend.type == 'amqp' %}

+	amqpHost: '{{ backend.host }}',

+	amqpPort: {{ backend.port }},

+	amqpLogin: '{{ backend.user }}',

+	amqpPassword: '{{ backend.password }}',

+	amqpVhost: '{{ backend.virtual_host }}',

+	amqpQueue: '{{ backend.queue }}',

+	amqpDefaultExchange: '{{ backend.exchange }}',

+	{%- endif %}

+	{%- endfor %}

+	port: {{ pillar.statsd.bind_port }}

+}
\ No newline at end of file
diff --git a/conf/start b/conf/start
new file mode 100644
index 0000000..7cba342
--- /dev/null
+++ b/conf/start
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+PATH=$PATH:/usr/local/bin:/usr/bin:/bin
+NODE_BIN=$(which nodejs||which node)
+
+if [ ! -x "$NODE_BIN" ]; then
+echo "Can't find executable nodejs or node in PATH=$PATH"
+  exit 1
+fi
+
+$NODE_BIN /srv/statsd/stats.js /etc/statsd/localConfig.js 2>&1 >> /var/log/statsd/statsd.log
diff --git a/init.sls b/init.sls
new file mode 100644
index 0000000..7b69bdf
--- /dev/null
+++ b/init.sls
@@ -0,0 +1,6 @@
+
+include:
+{% if pillar.statsd.server is defined %}
+- statsd.server
+{% endif %}
+
diff --git a/server.sls b/server.sls
new file mode 100644
index 0000000..f18e4ec
--- /dev/null
+++ b/server.sls
@@ -0,0 +1,111 @@
+{%- if pillar.statsd.server.enabled %}
+
+include:
+- nodejs
+- git
+
+statsd_packages:
+  pkg:
+  - installed
+  - names:
+    - nodejs
+
+statsd_user:
+  user.present:
+  - name: statsd
+  - system: True
+  - home: /srv/statsd
+  - require:
+    git: https://github.com/etsy/statsd.git
+
+https://github.com/etsy/statsd.git:
+  git.latest:
+  - target: /srv/statsd
+
+/etc/init.d/statsd:
+  file:
+  - managed
+  - source: salt://statsd/conf/init
+  - user: root
+  - group: root
+  - mode: 744
+  - template: jinja
+
+statsd:
+  service.running:
+  - require:
+    - file: /etc/init.d/statsd
+  - watch:
+    - file: /etc/statsd/localConfig.js
+
+/etc/statsd/localConfig.js:
+  file:
+  - managed
+  - source: salt://statsd/conf/localConfig.js
+  - user: root
+  - group: root
+  - mode: 644
+  - template: jinja
+
+{#
+/etc/default/statsd:
+  file:
+  - managed
+  - source: salt://statsd/conf/default
+  - user: root
+  - group: root
+  - mode: 644
+  - template: jinja
+
+/srv/statsd/scripts:
+  file:
+  - directory
+  - user: statsd
+  - group: statsd
+  - mode: 770
+  - require:
+    - user: statsd
+    - git: https:://github.com/etsy/statsd.git
+
+/srv/statsd/scripts/start:
+  file:
+  - managed
+  - source: salt://statsd/conf/start
+  - user: root
+  - group: root
+  - mode: 744
+  - template: jinja
+  - require:
+    - file: /srv/statsd/scripts
+#}
+
+/var/log/statsd:
+  file:
+  - directory
+  - user: statsd
+  - group: statsd
+  - mode: 777
+  - require:
+    - user: statsd
+
+update-rc.d statsd defaults:
+  cmd.run:
+  - require:
+    - service: statsd
+
+{%- for backend in pillar.statsd.backends %}
+
+{%- if backend.type == 'amqp' %}
+#statsd_amqp_package:
+#  npm.installed:
+#  - name: statsd-amqp-backend
+
+install_package:
+  cmd.run:
+  - name: npm install statsd-amqp-backend
+
+{%- endif %}
+
+{%- endfor %}
+
+{%- endif %}
\ No newline at end of file