#!/usr/bin/env bash # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # If this scripted is run out of /usr/bin or some other system bin directory # it should be linked to and not copied. Things like java jar files are found # relative to the canonical path of this script. # # use POSIX interface, symlink is followed automatically ZOOBIN="${BASH_SOURCE-$0}" ZOOBIN=`dirname ${ZOOBIN}` ZOOBINDIR=`cd ${ZOOBIN}; pwd` if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then . "$ZOOBINDIR"/../libexec/zkEnv.sh else . "$ZOOBINDIR"/zkEnv.sh fi usage() { # the configfile will be properly formatted as long as the # configfile path is less then 40 chars, otw the line will look a # bit weird, but otherwise it's fine printf "usage: $0 Optional parameters: -h Display this message --help Display this message --configfile=%-40s ZooKeeper config file --myid=# Set the myid to be used, if any (1-255) --force Force creation of the data/txnlog dirs " "$ZOOCFG" exit 1 } OPTS=$(getopt \ -n $0 \ -o 'h' \ -l 'help' \ -l 'configfile:' \ -l 'myid:' \ -l 'force' \ -- "$@") if [ $? != 0 ] ; then usage exit 1 fi initialize() { if [ ! -e "$ZOOCFG" ]; then echo "Unable to find config file at $ZOOCFG" exit 1 fi ZOO_DATADIR=$(grep "^[[:space:]]*dataDir" "$ZOOCFG" | sed -e 's/.*=//') ZOO_DATALOGDIR=$(grep "^[[:space:]]*dataLogDir" "$ZOOCFG" | sed -e 's/.*=//') if [ -z "$ZOO_DATADIR" ]; then echo "Unable to determine dataDir from $ZOOCFG" exit 1 fi if [ $FORCE ]; then echo "Force enabled, data/txnlog directories will be re-initialized" else # we create if version-2 exists (ie real data), not the # parent. See comments in following section for more insight if [ -d "$ZOO_DATADIR/version-2" ]; then echo "ZooKeeper data directory already exists at $ZOO_DATADIR (or use --force to force re-initialization)" exit 1 fi if [ -n "$ZOO_DATALOGDIR" ] && [ -d "$ZOO_DATALOGDIR/version-2" ]; then echo "ZooKeeper txnlog directory already exists at $ZOO_DATALOGDIR (or use --force to force re-initialization)" exit 1 fi fi # remove the child files that we're (not) interested in, not the # parent. this allows for parent to be installed separately, and # permissions to be set based on overarching requirements. by # default we'll use the permissions of the user running this # script for the files contained by the parent. note also by using # -p the parent(s) will be created if it doesn't already exist rm -rf "$ZOO_DATADIR/myid" 2>/dev/null >/dev/null rm -rf "$ZOO_DATADIR/version-2" 2>/dev/null >/dev/null mkdir -p "$ZOO_DATADIR/version-2" if [ -n "$ZOO_DATALOGDIR" ]; then rm -rf "$ZOO_DATALOGDIR/myid" 2>/dev/null >/dev/null rm -rf "$ZOO_DATALOGDIR/version-2" 2>/dev/null >/dev/null mkdir -p "$ZOO_DATALOGDIR/version-2" fi if [ $MYID ]; then echo "Using myid of $MYID" echo $MYID > "$ZOO_DATADIR/myid" else echo "No myid provided, be sure to specify it in $ZOO_DATADIR/myid if using non-standalone" fi } eval set -- "${OPTS}" while true; do case "$1" in --configfile) ZOOCFG=$2; shift 2 ;; --myid) MYID=$2; shift 2 ;; --force) FORCE=1; shift 1 ;; -h) usage ;; --help) usage ;; --) initialize break ;; *) echo "Unknown option: $1" usage exit 1 ;; esac done