#!/bin/bash 
#
# Init file for SSH Public Keys Download Client
#
# chkconfig: 345 98 02
# description: SSH Public Keys Download Client

# 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.


# Modify this line to specify the user (default is root)
user=root

SSHKEY_SERVER_IP=$(nslookup data-server | grep Server | awk '{print $2}')
logger -t "cloud" "Sending request to ssh key server at $SSHKEY_SERVER_IP"

publickey=$(wget -t 3 -T 20 -O - http://data-server/latest/public-keys 2>/dev/null)

if [ $? -eq 0 ]
then
     logger -t "cloud" "Got response from server at $SSHKEY_SERVER_IP"
     keys_received=1
else
     logger -t "cloud" "Could not find ssh key server IP in $DHCP_FILE"
fi

# did we find the keys anywhere?
if [ "$keys_received" == "0" ]
then
    logger -t "cloud" "Failed to get ssh keys from any server"
    exit 1
fi



# set ssh public key
homedir=$(grep ^$user /etc/passwd|awk -F ":" '{print $6}')
sshdir=$homedir/.ssh
authorized=$sshdir/authorized_keys


if [ ! -e $sshdir ]
then
    mkdir $sshdir
fi

if [ ! -e $authorized ]
then
    touch $authorized
fi

cat $authorized|grep -v "$publickey" > $authorized
echo "$publickey" >> $authorized


exit 0

