diff --git a/jobs/arbitrator/spec b/jobs/arbitrator/spec index 93ca6f85..030a29ef 100644 --- a/jobs/arbitrator/spec +++ b/jobs/arbitrator/spec @@ -10,7 +10,7 @@ templates: packages: - mariadb - galera-healthcheck -- common +- cf-mysql-common properties: cf_mysql.mysql.admin_username: diff --git a/jobs/arbitrator/templates/galera-healthcheck_ctl.erb b/jobs/arbitrator/templates/galera-healthcheck_ctl.erb index 2bca3c15..ee9e1ebf 100755 --- a/jobs/arbitrator/templates/galera-healthcheck_ctl.erb +++ b/jobs/arbitrator/templates/galera-healthcheck_ctl.erb @@ -9,7 +9,7 @@ pidfile=$run_dir/galera-healthcheck.pid export GOROOT=/var/vcap/packages/golang export PATH=$GOROOT/bin:$PWD/bin:$PATH -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh case $1 in diff --git a/jobs/arbitrator/templates/garbd_ctl.erb b/jobs/arbitrator/templates/garbd_ctl.erb index 44501025..cea67b6d 100644 --- a/jobs/arbitrator/templates/garbd_ctl.erb +++ b/jobs/arbitrator/templates/garbd_ctl.erb @@ -6,7 +6,7 @@ log_dir=/var/vcap/sys/log/garbd package_dir=/var/vcap/packages/mariadb pidfile=$run_dir/garbd.pid -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh case $1 in diff --git a/jobs/cf-mysql-broker/monit b/jobs/cf-mysql-broker/monit index f7d681bc..5211ea4a 100644 --- a/jobs/cf-mysql-broker/monit +++ b/jobs/cf-mysql-broker/monit @@ -4,14 +4,14 @@ check process cf-mysql-broker stop program "/var/vcap/jobs/cf-mysql-broker/bin/cf-mysql-broker_ctl stop" with timeout 60 seconds group vcap -check process route-registrar - with pidfile /var/vcap/sys/run/route-registrar/route-registrar.pid +check process cf-mysql-route-registrar + with pidfile /var/vcap/sys/run/cf-mysql-broker/route-registrar.pid start program "/var/vcap/jobs/cf-mysql-broker/bin/route-registrar_ctl start" stop program "/var/vcap/jobs/cf-mysql-broker/bin/route-registrar_ctl stop" group vcap check process quota-enforcer - with pidfile /var/vcap/sys/run/quota-enforcer/quota-enforcer.pid + with pidfile /var/vcap/sys/run/cf-mysql-broker/quota-enforcer.pid start program "/var/vcap/jobs/cf-mysql-broker/bin/quota-enforcer_ctl start" with timeout 60 seconds stop program "/var/vcap/jobs/cf-mysql-broker/bin/quota-enforcer_ctl stop" with timeout 60 seconds group vcap diff --git a/jobs/cf-mysql-broker/spec b/jobs/cf-mysql-broker/spec index 20e39da0..06a0df0d 100644 --- a/jobs/cf-mysql-broker/spec +++ b/jobs/cf-mysql-broker/spec @@ -17,10 +17,10 @@ packages: - ruby - mysqlclient - cf-mysql-broker -- common +- cf-mysql-common - mariadb - syslog_aggregator -- route-registrar +- cf-mysql-route-registrar - quota-enforcer properties: @@ -54,7 +54,7 @@ properties: description: 'Host (DNS) or IP address used by the broker and bound applications to reach the service' cf_mysql.external_host: description: 'Host used to register a route for the broker with the router in cf-release via NATS. By registering the broker with Cloud Foundry using this route, and using the router for load balancing, the broker can be horizontally scaled. Domain is typically the same as system domain in cf-release.' - + cf_mysql.mysql.port: description: 'Port used by the broker and bound applications to reach the service' default: 3306 @@ -86,6 +86,9 @@ properties: cf_mysql.broker.ssl_enabled: description: 'Determines use of https in dashboard url and in callback uri for calls to UAA' default: true - + cf_mysql.broker.nginx.port: + default: 80 + description: "Port for nginx" + network_name: description: "The name of the network (needed for the syslog aggregator)" diff --git a/jobs/cf-mysql-broker/templates/healthcheck.sh.erb b/jobs/cf-mysql-broker/templates/healthcheck.sh.erb index 232cda28..a8ba75e2 100755 --- a/jobs/cf-mysql-broker/templates/healthcheck.sh.erb +++ b/jobs/cf-mysql-broker/templates/healthcheck.sh.erb @@ -1,6 +1,6 @@ #!/bin/bash -lsof -i :80 2>&1 >> /dev/null +lsof -i :<%= p('cf_mysql.broker.nginx.port') %> 2>&1 >> /dev/null EXIT_CODE=$? if [[ $EXIT_CODE -eq 0 ]]; then echo 1 diff --git a/jobs/cf-mysql-broker/templates/quota-enforcer_ctl.erb b/jobs/cf-mysql-broker/templates/quota-enforcer_ctl.erb index 01cc8628..b677f5ac 100755 --- a/jobs/cf-mysql-broker/templates/quota-enforcer_ctl.erb +++ b/jobs/cf-mysql-broker/templates/quota-enforcer_ctl.erb @@ -3,12 +3,12 @@ set -e job_dir=/var/vcap/jobs/cf-mysql-broker -run_dir=/var/vcap/sys/run/quota-enforcer -log_dir=/var/vcap/sys/log/quota-enforcer +run_dir=/var/vcap/sys/run/cf-mysql-broker +log_dir=/var/vcap/sys/log/cf-mysql-broker package_dir=/var/vcap/packages/quota-enforcer pidfile=$run_dir/quota-enforcer.pid -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh case $1 in diff --git a/jobs/cf-mysql-broker/templates/registrar_settings.yml.erb b/jobs/cf-mysql-broker/templates/registrar_settings.yml.erb index 5490f222..672894f5 100644 --- a/jobs/cf-mysql-broker/templates/registrar_settings.yml.erb +++ b/jobs/cf-mysql-broker/templates/registrar_settings.yml.erb @@ -7,7 +7,7 @@ message_bus_servers: host: <%= spec.networks.send(p('network_name')).ip %> routes: - name: "broker_<%= index %>" - port: 80 + port: <%= p('cf_mysql.broker.nginx.port') %> uris: - <%= p('cf_mysql.external_host') %> registration_interval: 10 diff --git a/jobs/cf-mysql-broker/templates/route-registrar_ctl.erb b/jobs/cf-mysql-broker/templates/route-registrar_ctl.erb index 574349ff..ee0cb3e4 100644 --- a/jobs/cf-mysql-broker/templates/route-registrar_ctl.erb +++ b/jobs/cf-mysql-broker/templates/route-registrar_ctl.erb @@ -4,13 +4,13 @@ set -u # report the usage of uninitialized variables JOB_NAME=route-registrar -RUN_DIR=/var/vcap/sys/run/route-registrar -LOG_DIR=/var/vcap/sys/log/route-registrar +RUN_DIR=/var/vcap/sys/run/cf-mysql-broker +LOG_DIR=/var/vcap/sys/log/cf-mysql-broker PIDFILE=$RUN_DIR/route-registrar.pid CONFIG_FILE=/var/vcap/jobs/cf-mysql-broker/config/registrar_settings.yml -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh export HOME=/var/vcap @@ -23,7 +23,7 @@ start) pid_guard $PIDFILE $JOB_NAME - /var/vcap/packages/route-registrar/bin/route-registrar \ + /var/vcap/packages/cf-mysql-route-registrar/bin/route-registrar \ -pidfile=$PIDFILE \ -configPath=$CONFIG_FILE \ >>$LOG_DIR/route-registrar.stdout.log 2>>$LOG_DIR/route-registrar.stderr.log& diff --git a/jobs/cf-mysql-broker/templates/unicorn.conf.rb.erb b/jobs/cf-mysql-broker/templates/unicorn.conf.rb.erb index c2c761e4..8055325d 100644 --- a/jobs/cf-mysql-broker/templates/unicorn.conf.rb.erb +++ b/jobs/cf-mysql-broker/templates/unicorn.conf.rb.erb @@ -6,7 +6,7 @@ worker_processes 4 working_directory '/var/vcap/packages/cf-mysql-broker' -listen 80, :tcp_nopush => true +listen <%= p('cf_mysql.broker.nginx.port') %>, :tcp_nopush => true pid '/var/vcap/sys/run/cf-mysql-broker/unicorn.pid' diff --git a/jobs/mysql/spec b/jobs/mysql/spec index 0a7872d4..2cd4f3d5 100644 --- a/jobs/mysql/spec +++ b/jobs/mysql/spec @@ -20,7 +20,7 @@ packages: - galera-healthcheck - gra-log-purger - golang -- common +- cf-mysql-common - syslog_aggregator properties: @@ -43,6 +43,9 @@ properties: cf_mysql.mysql.port: description: 'Port the mysql server should bind to' default: 3306 + cf_mysql.mysql.galera_port: + description: 'Port which garbd listens on' + default: 4567 cf_mysql.mysql.healthcheck_port: description: 'Port used by healthcheck process to listen on' default: 9200 diff --git a/jobs/mysql/templates/galera-healthcheck_ctl.erb b/jobs/mysql/templates/galera-healthcheck_ctl.erb index f141be0b..a2ff2c5a 100755 --- a/jobs/mysql/templates/galera-healthcheck_ctl.erb +++ b/jobs/mysql/templates/galera-healthcheck_ctl.erb @@ -9,7 +9,7 @@ pidfile=$run_dir/galera-healthcheck.pid export GOROOT=/var/vcap/packages/golang export PATH=$GOROOT/bin:$PWD/bin:$PATH -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh case $1 in diff --git a/jobs/mysql/templates/gra-log-purger_ctl.erb b/jobs/mysql/templates/gra-log-purger_ctl.erb index 0ea61672..940fccd1 100644 --- a/jobs/mysql/templates/gra-log-purger_ctl.erb +++ b/jobs/mysql/templates/gra-log-purger_ctl.erb @@ -12,7 +12,7 @@ pidfile=$run_dir/gra-log-purger.pid executable_name=gra-log-purger-executable -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh case $1 in diff --git a/jobs/mysql/templates/mariadb_ctl.erb b/jobs/mysql/templates/mariadb_ctl.erb index a61e72a3..8fbd1cef 100755 --- a/jobs/mysql/templates/mariadb_ctl.erb +++ b/jobs/mysql/templates/mariadb_ctl.erb @@ -16,7 +16,7 @@ RUN_DIR=/var/vcap/sys/run/$MY_NAME PIDFILE=$RUN_DIR/$MY_NAME.pid TMP_DIR=/var/vcap/data/mysql/tmp -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh # add mysql to path if [ ! -f /usr/local/bin/mysql ]; then @@ -53,7 +53,7 @@ case $1 in log "start script: checking for existing instance of $MY_NAME" set +e - $(source /var/vcap/packages/common/utils.sh; pid_guard $PIDFILE $MY_NAME) + $(source /var/vcap/packages/cf-mysql-common/utils.sh; pid_guard $PIDFILE $MY_NAME) pg_exit_code=$? log "start script: pg_exit_code: $pg_exit_code" if [ $pg_exit_code -eq 1 ]; then diff --git a/jobs/mysql/templates/my.cnf.erb b/jobs/mysql/templates/my.cnf.erb index 8574ba4a..b4a94f55 100644 --- a/jobs/mysql/templates/my.cnf.erb +++ b/jobs/mysql/templates/my.cnf.erb @@ -28,7 +28,7 @@ nice = 0 wsrep_provider=/var/vcap/packages/mariadb/lib/plugin/libgalera_smm.so wsrep_provider_options="gcache.size=<%= p('cf_mysql.mysql.gcache_size') %>M;pc.recovery=TRUE" wsrep_cluster_address="gcomm://<%= cluster_ips.join(",") %>" -wsrep_node_address='<%= spec.networks.send(p('network_name')).ip %>' +wsrep_node_address='<%= spec.networks.send(p('network_name')).ip %>:<%= p('cf_mysql.mysql.galera_port') %>' wsrep_node_name='mysql/<%= index %>' wsrep_cluster_name='cf-mariadb-galera-cluster' wsrep_sst_method=xtrabackup-v2 diff --git a/jobs/proxy/monit b/jobs/proxy/monit index 6c748bc9..467f5ab0 100644 --- a/jobs/proxy/monit +++ b/jobs/proxy/monit @@ -5,8 +5,8 @@ check process switchboard group vcap <% if p("cf_mysql.standalone") == false %> -check process route-registrar - with pidfile /var/vcap/sys/run/route-registrar/route-registrar.pid +check process cf-mysql-route-registrar + with pidfile /var/vcap/sys/run/cf-mysql-broker/route-registrar.pid start program "/var/vcap/jobs/proxy/bin/route-registrar_ctl start" stop program "/var/vcap/jobs/proxy/bin/route-registrar_ctl stop" group vcap diff --git a/jobs/proxy/spec b/jobs/proxy/spec index 1910e8d4..edd7188a 100644 --- a/jobs/proxy/spec +++ b/jobs/proxy/spec @@ -11,9 +11,9 @@ templates: packages: - switchboard - golang -- common +- cf-mysql-common - syslog_aggregator -- route-registrar +- cf-mysql-route-registrar properties: diff --git a/jobs/proxy/templates/route-registrar_ctl.erb b/jobs/proxy/templates/route-registrar_ctl.erb index 6fb2ae87..ebe8fee8 100644 --- a/jobs/proxy/templates/route-registrar_ctl.erb +++ b/jobs/proxy/templates/route-registrar_ctl.erb @@ -4,13 +4,13 @@ set -u # report the usage of uninitialized variables JOB_NAME=route-registrar -RUN_DIR=/var/vcap/sys/run/route-registrar -LOG_DIR=/var/vcap/sys/log/route-registrar +RUN_DIR=/var/vcap/sys/run/cf-mysql-broker +LOG_DIR=/var/vcap/sys/log/cf-mysql-broker PIDFILE=$RUN_DIR/route-registrar.pid CONFIG_FILE=/var/vcap/jobs/proxy/config/route-registrar.yml -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh export HOME=/var/vcap @@ -23,7 +23,7 @@ start) pid_guard $PIDFILE $JOB_NAME - /var/vcap/packages/route-registrar/bin/route-registrar \ + /var/vcap/packages/cf-mysql-route-registrar/bin/route-registrar \ -pidfile=$PIDFILE \ -configPath=$CONFIG_FILE \ >>$LOG_DIR/route-registrar.stdout.log 2>>$LOG_DIR/route-registrar.stderr.log& diff --git a/jobs/proxy/templates/switchboard_ctl.erb b/jobs/proxy/templates/switchboard_ctl.erb index 2a0299b9..7d9735f9 100644 --- a/jobs/proxy/templates/switchboard_ctl.erb +++ b/jobs/proxy/templates/switchboard_ctl.erb @@ -9,7 +9,7 @@ pidfile=$run_dir/switchboard.pid export GOROOT=/var/vcap/packages/golang export PATH=$GOROOT/bin:$PWD/bin:$PATH -source /var/vcap/packages/common/utils.sh +source /var/vcap/packages/cf-mysql-common/utils.sh case $1 in diff --git a/packages/cf-mysql-common/packaging b/packages/cf-mysql-common/packaging new file mode 100644 index 00000000..26a0dece --- /dev/null +++ b/packages/cf-mysql-common/packaging @@ -0,0 +1,3 @@ +set -e + +cp -a cf-mysql-common/* ${BOSH_INSTALL_TARGET} diff --git a/packages/cf-mysql-common/spec b/packages/cf-mysql-common/spec new file mode 100644 index 00000000..8d6b8c23 --- /dev/null +++ b/packages/cf-mysql-common/spec @@ -0,0 +1,4 @@ +--- +name: cf-mysql-common +files: +- cf-mysql-common/utils.sh diff --git a/packages/route-registrar/packaging b/packages/cf-mysql-route-registrar/packaging similarity index 100% rename from packages/route-registrar/packaging rename to packages/cf-mysql-route-registrar/packaging diff --git a/packages/route-registrar/spec b/packages/cf-mysql-route-registrar/spec similarity index 98% rename from packages/route-registrar/spec rename to packages/cf-mysql-route-registrar/spec index 9e0a5505..50be4c05 100644 --- a/packages/route-registrar/spec +++ b/packages/cf-mysql-route-registrar/spec @@ -1,5 +1,5 @@ --- -name: route-registrar +name: cf-mysql-route-registrar dependencies: - golang files: diff --git a/packages/common b/packages/common deleted file mode 120000 index be7e9283..00000000 --- a/packages/common +++ /dev/null @@ -1 +0,0 @@ -../shared/packages/common \ No newline at end of file diff --git a/scripts/sync-package-specs b/scripts/sync-package-specs index c13b5920..b8693caa 100755 --- a/scripts/sync-package-specs +++ b/scripts/sync-package-specs @@ -39,7 +39,7 @@ sync_package switchboard -app github.com/cloudfoundry-incubator/switchboard/... sync_package quota-enforcer -app github.com/pivotal-cf-experimental/cf-mysql-quota-enforcer/... & sync_package bootstrap -app github.com/cloudfoundry-incubator/cf-mysql-bootstrap/... & GOPATH=$GOPATH/src/github.com/cloudfoundry-incubator/route-registrar/Godeps/_workspace:$GOPATH \ -sync_package route-registrar -app github.com/cloudfoundry-incubator/route-registrar/... & +sync_package cf-mysql-route-registrar -app github.com/cloudfoundry-incubator/route-registrar/... & sync_package acceptance-tests \ -test github.com/cloudfoundry-incubator/cf-mysql-acceptance-tests/... \ diff --git a/scripts/sync-submodule-config b/scripts/sync-submodule-config index da3abf50..75cd41cb 100755 --- a/scripts/sync-submodule-config +++ b/scripts/sync-submodule-config @@ -22,6 +22,6 @@ go install github.com/vito/gosub echo github.com/cloudfoundry-incubator/route-registrar # uses Godeps echo broker-registrar # non-go project echo cf-mysql-broker # non-go project - echo common # non-go project + echo cf-mysql-common # non-go project echo syslog_aggregator # non-go project } | xargs gosub sync diff --git a/src/cf-mysql-common/services/utils.sh b/src/cf-mysql-common/services/utils.sh new file mode 100644 index 00000000..851ed6fe --- /dev/null +++ b/src/cf-mysql-common/services/utils.sh @@ -0,0 +1,84 @@ +source /var/vcap/packages/cf-mysql-common/utils.sh + +RUN_DIR=/var/vcap/sys/run/warden +ROOT_TGZ=/var/vcap/stemcell_base.tar.gz +LOOP_DEVICE_COUNT=1024 + +if [ -z $SERVICE_NAME ] +then + LOG_DIR=/var/vcap/sys/log/warden + PIDFILE=$RUN_DIR/warden.pid + ROOT_DIR=/var/vcap/data/warden/rootfs +else + LOG_DIR=/var/vcap/sys/log/${SERVICE_NAME}/warden + PIDFILE=$RUN_DIR/${SERVICE_NAME}_warden.pid + ROOT_DIR=/var/vcap/data/${SERVICE_NAME}/warden/rootfs +fi + +setup_warden() { + use_loop_device=$1 + + mkdir -p $RUN_DIR + mkdir -p $LOG_DIR + + # Extract rootfs if needed + if [ ! -d $ROOT_DIR ] + then + # Extract to temporary path, then rename to target path. + # This makes sure that it is not possible that we end up with directory + # that contains a partially extracted archive. + mkdir -p $(dirname $ROOT_DIR) + TMP=$(mktemp --tmpdir=$(dirname $ROOT_DIR) -d) + chmod 755 $TMP + tar -C $TMP -zxf $ROOT_TGZ + mv $TMP $ROOT_DIR + fi + + # Create loop devices for disk quota + if [ ! -z ${use_loop_device} ] && [ ${use_loop_device} = 'true' ] + then + for i in $(seq 0 $(expr $LOOP_DEVICE_COUNT - 1)); do + file=/dev/loop${i} + if [ ! -b ${file} ]; then + mknod -m0660 ${file} b 7 ${i} + chown root.disk ${file} + fi + done + fi +} + +start_warden() { + cd $PKG_DIR/warden + + export PATH=/var/vcap/packages/ruby_next/bin:$PATH + + nohup /var/vcap/packages/ruby/bin/bundle exec \ + rake warden:start[$JOB_DIR/config/warden.yml] \ + >>$LOG_DIR/warden.stdout.log \ + 2>>$LOG_DIR/warden.stderr.log & + + warden_start_flag=false + warden_start_timeout=20 + countdown=$(( $warden_start_timeout * 2)) + + for i in `seq 1 $countdown`; do + warden_pid=`sudo netstat -pan | grep LISTENING | grep $SOCKET_FILE | awk '{print $9}' | cut -d / -f 1` + if [ ! -z $warden_pid ] && [ -e /proc/$warden_pid ] + then + warden_start_flag=true + echo "warden is ready" + break + else + sleep 0.5 + echo -n . + fi + done + + if [ $warden_start_flag = true ]; then + pid_guard $PIDFILE "Warden" + echo $warden_pid > $PIDFILE + else + echo "warden start timeout" + exit 1 + fi +} diff --git a/src/cf-mysql-common/utils.sh b/src/cf-mysql-common/utils.sh new file mode 100644 index 00000000..773aceea --- /dev/null +++ b/src/cf-mysql-common/utils.sh @@ -0,0 +1,142 @@ + +SCRIPT=$(basename $0) +mkdir -p /var/vcap/sys/log/monit + +exec 1>> /var/vcap/sys/log/monit/$SCRIPT.log +exec 2>> /var/vcap/sys/log/monit/$SCRIPT.err.log + +pid_guard() { + pidfile=$1 + name=$2 + + if [ -f "$pidfile" ]; then + pid=$(head -1 "$pidfile") + + if [ -n "$pid" ] && [ -e /proc/$pid ]; then + echo "$name is already running, please stop it first" + exit 1 + fi + + echo "Removing stale pidfile..." + rm $pidfile + fi +} + +wait_pidfile() { + pidfile=$1 + try_kill=$2 + timeout=${3:-0} + force=${4:-0} + countdown=$(( $timeout * 10 )) + + if [ -f "$pidfile" ]; then + pid=$(head -1 "$pidfile") + + if [ -z "$pid" ]; then + echo "Unable to get pid from $pidfile" + exit 1 + fi + + if [ -e /proc/$pid ]; then + if [ "$try_kill" = "1" ]; then + echo "Killing $pidfile: $pid " + kill $pid + fi + while [ -e /proc/$pid ]; do + sleep 0.1 + [ "$countdown" != '0' -a $(( $countdown % 10 )) = '0' ] && echo -n . + if [ $timeout -gt 0 ]; then + if [ $countdown -eq 0 ]; then + if [ "$force" = "1" ]; then + echo -ne "\nKill timed out, using kill -9 on $pid... " + kill -9 $pid + sleep 0.5 + fi + break + else + countdown=$(( $countdown - 1 )) + fi + fi + done + if [ -e /proc/$pid ]; then + echo "Timed Out" + else + echo "Stopped" + fi + else + echo "Process $pid is not running" + fi + + rm -f $pidfile + else + echo "Pidfile $pidfile doesn't exist" + fi +} + +kill_and_wait() { + pidfile=$1 + # Monit default timeout for start/stop is 30s + # Append 'with timeout {n} seconds' to monit start/stop program configs + timeout=${2:-25} + force=${3:-1} + + wait_pidfile $pidfile 1 $timeout $force +} + +check_mount() { + opts=$1 + exports=$2 + mount_point=$3 + + if grep -qs $mount_point /proc/mounts; then + echo "Found NFS mount $mount_point" + else + echo "Mounting NFS..." + mount $opts $exports $mount_point + if [ $? != 0 ]; then + echo "Cannot mount NFS from $exports to $mount_point, exiting..." + exit 1 + fi + fi +} + +# Check the syntax of a sudoers file. +check_sudoers() { + /usr/sbin/visudo -c -f "$1" +} + +# Check the syntax of a sudoers file and if it's ok install it. +install_sudoers() { + src="$1" + dest="$2" + + check_sudoers "$src" + + if [ $? -eq 0 ]; then + chown root:root "$src" + chmod 0440 "$src" + cp -p "$src" "$dest" + else + echo "Syntax error in sudoers file $src" + exit 1 + fi +} + +# Add a line to a file if it is not already there. +file_must_include() { + file="$1" + line="$2" + + # Protect against empty $file so it doesn't wait for input on stdin. + if [ -n "$file" ]; then + grep --quiet "$line" "$file" || echo "$line" >> "$file" + else + echo 'File name is required' + exit 1 + fi +} + +log(){ + message=$1 + echo "$(date +"%Y-%m-%d %H:%M:%S") ----- $message" +} diff --git a/src/common b/src/common deleted file mode 120000 index bbc3ba80..00000000 --- a/src/common +++ /dev/null @@ -1 +0,0 @@ -../shared/src/common \ No newline at end of file