summaryrefslogtreecommitdiff
path: root/init.d.BSD/hostid.in
diff options
context:
space:
mode:
Diffstat (limited to 'init.d.BSD/hostid.in')
-rw-r--r--init.d.BSD/hostid.in78
1 files changed, 78 insertions, 0 deletions
diff --git a/init.d.BSD/hostid.in b/init.d.BSD/hostid.in
new file mode 100644
index 0000000..7d093a4
--- /dev/null
+++ b/init.d.BSD/hostid.in
@@ -0,0 +1,78 @@
+#!/sbin/runscript
+# Copyright 2007-2008 Roy Marples <roy@marples.name>
+# All rights reserved. Released under the 2-clause BSD license.
+
+extra_commands="reset"
+hostid_file=${hostid_file:-/etc/hostid}
+
+depend()
+{
+ need root
+ before devd net
+ keyword nojail noprefix
+}
+
+_set()
+{
+ local id=0
+
+ if [ -n "$1" ]; then
+ id=$(echo "$1" | md5)
+ id="0x${id%????????????????????????}"
+ fi
+ ebegin "Setting Host ID: ${id}"
+ sysctl -w kern.hostid="${id}" >/dev/null
+ eend $? || return 1
+
+ if sysctl -n kern.hostuuid >/dev/null 2>&1; then
+ [ -n "$1" ] && id=$1
+ ebegin "Setting Host UUID: ${id}"
+ sysctl kern.hostuuid="${id}" >/dev/null
+ eend $? || return 1
+ fi
+
+}
+
+# First we check to see if there is a system UUID
+# If so then we use that and erase the hostid file,
+# otherwise we generate a random UUID.
+reset()
+{
+ local uuid=$(kenv smbios.system.uuid 2>/dev/null)
+ local x="[0-9a-f]"
+ local y="${x}${x}${x}${x}"
+ case "${uuid}" in
+ ${y}${y}-${y}-${y}-${y}-${y}${y}${y});;
+ *) uuid=;;
+ esac
+
+ if [ -n "${uuid}" ]; then
+ rm -f "${hostid_file}"
+ else
+ uuid=$(uuidgen)
+ if [ -z "${uuid}" ]; then
+ eerror "Unable to generate a UUID"
+ return 1
+ fi
+ if ! echo "${uuid}" > "${hostid_file}"; then
+ eerror "Failed to store UUID in \`${hostid_file}'"
+ return 1
+ fi
+ fi
+
+ _set "${uuid}"
+}
+
+start()
+{
+ if [ -r "${hostid_file}" ]; then
+ _set $(cat "${hostid_file}")
+ else
+ reset
+ fi
+}
+
+stop()
+{
+ _set
+}