Skip to content

Commit

Permalink
update oud_backup.sh, oud_export.sh and oud_status.sh
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan Oehrli committed Mar 14, 2018
1 parent f9a11ef commit cabccf2
Show file tree
Hide file tree
Showing 13 changed files with 422 additions and 261 deletions.
316 changes: 176 additions & 140 deletions build/oudbase_install.sh

Large diffs are not rendered by default.

Binary file modified build/oudbase_install.tgz
Binary file not shown.
35 changes: 26 additions & 9 deletions local/bin/oud_backup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ function Usage() {
DoMsg "INFO : Usage, ${SCRIPT_NAME} [-hv -i <OUD_INSTANCES> -t <TYPE> -m <MAILADDRESSES>]"
DoMsg "INFO : -h Usage (this message"
DoMsg "INFO : -v enable verbose mode"
DoMsg "INFO : -i <OUD_INSTANCES> List of OUD instances"
DoMsg "INFO : -t <TYPE> Backup Type FULL or INCREMENTAL"
DoMsg "INFO : -i <OUD_INSTANCES> List of OUD instances (default ALL)"
DoMsg "INFO : -t <TYPE> Backup Type FULL or INCREMENTAL (default FULL)"
DoMsg "INFO : -k <WEEKS> Number of weeks to keep old backups (default 4)"
DoMsg "INFO : -m <MAILADDRESSES> List of Mail Addresses"
DoMsg "INFO : Logfile : ${LOGFILE}"
if [ ${1} -gt 0 ]; then
Expand Down Expand Up @@ -158,18 +159,24 @@ fi

# usage and getopts
DoMsg "INFO : processing commandline parameter"
while getopts hvt:i:m:E: arg; do
while getopts hvt:k:i:m:E: arg; do
case $arg in
h) Usage 0;;
v) VERBOSE="TRUE";;
t) TYPE="${OPTARG}";;
k) KEEP="${OPTARG}";;
i) MyOUD_INSTANCES="${OPTARG}";;
m) MAILADDRESS=$(echo "${OPTARG}"|sed s/\,/\ /g);;
E) CleanAndQuit "${OPTARG}";;
?) Usage 2 $*;;
esac
done

# Set a minimal value for KEEP to 1 eg. 1 week
if [ ${KEEP} -lt 1 ]; then
KEEP=1
fi

if [ "$MyOUD_INSTANCES" = "" ]; then
# Load list of OUD Instances from oudtab
DoMsg "INFO : Load list of OUD instances"
Expand Down Expand Up @@ -213,13 +220,23 @@ DoMsg "INFO : Define backup set to be purged for week ${OLD_WEEKNO} as ${OLD_BAC

# Loop over OUD Instances
for oud_inst in ${OUD_INST_LIST}; do
# Load OUD environment
. "${OUDENV}" $oud_inst SILENT 2>&1 >/dev/null
if [ $? -ne 0 ]; then
DoMsg "ERROR: [$oud_inst] Can not source environment for ${oud_inst}. Skip backup for this instance"
continue
fi

# check directory type
if [ ! ${DIRECTORY_TYPE} == "OUD" ]; then
DoMsg "WARN : [$oud_inst] Instance $oud_inst is not of type OUD. Skip backup for this instance."
continue
fi
DoMsg "INFO : [$oud_inst] Check if $oud_inst is running"
if [ $(ps -ef | egrep -v "ps -ef|grep " | grep org.opends.server.core.DirectoryServer|grep -c $oud_inst ) -gt 0 ]; then
STATUS=$(get_status $oud_inst)
if [ "${STATUS^^}" == "UP" ]; then
INST_LOG_FILE="/tmp/$(basename ${SCRIPT_NAME} .sh)_${oud_inst}.log"
DoMsg "INFO : [$oud_inst] OUD Instance $oud_inst up, source environment."

# Load OUD environment
. "${OUDENV}" $oud_inst SILENT
DoMsg "INFO : [$oud_inst] OUD Instance $oud_inst up."

# create directory for a dedicated backup set
mkdir -p ${OUD_BACKUP_DIR}/${NEW_BACKUP_SET}
Expand Down Expand Up @@ -256,7 +273,7 @@ for oud_inst in ${OUD_INST_LIST}; do
fi
fi
else
DoMsg "INFO : [$oud_inst] OUD Instance $oud_inst down, no backup will be performed."
DoMsg "WARN : [$oud_inst] OUD Instance $oud_inst down, no backup will be performed."
fi
done

Expand Down
22 changes: 17 additions & 5 deletions local/bin/oud_export.sh
Original file line number Diff line number Diff line change
Expand Up @@ -202,12 +202,24 @@ DoMsg "INFO : Initiate export for OUD instances ${OUD_INST_LIST}"

# Loop over OUD Instances
for oud_inst in ${OUD_INST_LIST}; do
# Load OUD environment
. "${OUDENV}" $oud_inst SILENT 2>&1 >/dev/null
if [ $? -ne 0 ]; then
DoMsg "ERROR: [$oud_inst] Can not source environment for ${oud_inst}. Skip backup for this instance"
continue
fi

# check directory type
if [ ! ${DIRECTORY_TYPE} == "OUD" ]; then
DoMsg "WARN : [$oud_inst] Instance $oud_inst is not of type OUD. Skip backup for this instance."
continue
fi

DoMsg "INFO : [$oud_inst] Check if $oud_inst is running"
if [ $(ps -ef | egrep -v "ps -ef|grep " | grep org.opends.server.core.DirectoryServer|grep -c $oud_inst ) -gt 0 ]; then
DoMsg "INFO : [$oud_inst] OUD Instance $oud_inst up, source environment."

# Load OUD environment
. "${OUDENV}" $oud_inst SILENT
STATUS=$(get_status $oud_inst)
if [ "${STATUS^^}" == "UP" ]; then
INST_LOG_FILE="/tmp/$(basename ${SCRIPT_NAME} .sh)_${oud_inst}.log"
DoMsg "INFO : [$oud_inst] OUD Instance $oud_inst up."

# create directory
mkdir -p ${OUD_EXPORT_DIR}
Expand Down
133 changes: 76 additions & 57 deletions local/bin/oud_status.sh
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,13 @@ function CleanAndQuit() {
30) DoMsg "ERR : Exit Code ${1}. Some Export failed";;
40) DoMsg "ERR : Exit Code ${1}. Error not defined";;
41) DoMsg "ERR : Exit Code ${1}. Error ${2} running status command";;
42) DoMsg "ERR : Exit Code ${1}. Error ${2} running dsreplication command";;
42) DoMsg "ERR : Exit Code ${1}. Error ${2} running dsreplication command";;
44) DoMsg "ERR : Exit Code ${1}. unknown directory type ${2}, can not check status";;
43) DoMsg "ERR : Exit Code ${1}. Missing bind password file";;
50) DoMsg "ERR : Exit Code ${1}. OUD Instance ${2} not running";;
51) DoMsg "ERR : Exit Code ${1}. Connection Handler ${2} is not enabled on ${OUD_INSTANCE}";;
52) DoMsg "ERR : Exit Code ${1}. Error in Replication for OUD Instance ${OUD_INSTANCE}. Check replication log ${ORACLE_INSTANCE_BASE}/${OUD_INSTANCE}/OUD/logs for more information";;
53) DoMsg "ERR : Exit Code ${1}. Error OUDSM console ${2} is not available";;
99) DoMsg "INFO : Just wanna say hallo.";;
?) DoMsg "ERR : Exit Code ${1}. Unknown Error.";;
esac
Expand Down Expand Up @@ -207,74 +209,91 @@ else
CleanAndQuit 11 ${TMP_FILE} # Define a clean exit
fi

# Check if we have a bindPasswordFile
MybindDN=${MybindDN:-"cn=Directory Manager"}
MybindPasswordFile=${MybindPasswordFile:-"${PWD_FILE}"}
if [ ! -f "${MybindPasswordFile}" ]; then
CleanAndQuit 43 ${MyOUD_INSTANCE}
fi

DoMsg "INFO : Run status on OUD Instance ${MyOUD_INSTANCE}"
status --script-friendly --no-prompt --noPropertiesFile --bindDN "${MybindDN}" --bindPasswordFile ${MybindPasswordFile} --trustAll >${TMP_FILE} 2>&1
OUD_ERROR=$?

if [ ${DIRECTORY_TYPE} == "OUD" ]; then
DoMsg "INFO : Identify directory type ${DIRECTORY_TYPE}"
# Check if we have a bindPasswordFile
MybindDN=${MybindDN:-"cn=Directory Manager"}
MybindPasswordFile=${MybindPasswordFile:-"${PWD_FILE}"}
if [ ! -f "${MybindPasswordFile}" ]; then
CleanAndQuit 43 ${MyOUD_INSTANCE}
fi

# handle errors from OUD status
if [ ${OUD_ERROR} -gt 0 ]; then
CleanAndQuit 41 ${OUD_ERROR}
fi
DoMsg "INFO : Run status on OUD Instance ${MyOUD_INSTANCE}"
status --script-friendly --no-prompt --noPropertiesFile --bindDN "${MybindDN}" --bindPasswordFile ${MybindPasswordFile} --trustAll >${TMP_FILE} 2>&1
OUD_ERROR=$?

# adjust temp file
# and add a - at the end
sed -i 's/^$/-/' ${TMP_FILE}
# join Backend ID with multiple lines
sed -i '/OracleContext for$/{N;s/\n/ /;}' ${TMP_FILE}
# join Base DN with multiple lines
sed -i '/^Base DN:$/{N;s/\n/ /;}' ${TMP_FILE}
# handle errors from OUD status
if [ ${OUD_ERROR} -gt 0 ]; then
CleanAndQuit 41 ${OUD_ERROR}
fi

DoMsg "INFO : Process ${TMP_FILE} file"
# check Server Run Status
if [ $(grep -ic 'Server Run Status: Started' ${TMP_FILE}) -eq 0 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 50 ${OUD_INSTANCE}
fi
# adjust temp file
# and add a - at the end
sed -i 's/^$/-/' ${TMP_FILE}
# join Backend ID with multiple lines
sed -i '/OracleContext for$/{N;s/\n/ /;}' ${TMP_FILE}
# join Base DN with multiple lines
sed -i '/^Base DN:$/{N;s/\n/ /;}' ${TMP_FILE}

# check if connection handler are enabled
for i in LDAP LDAPS; do
DoMsg "INFO : Check connection handler ${i}"
AWK_OUT=$(awk 'BEGIN{RS="\n-\n";FS="\n";IGNORECASE=1; Error=51} $1 ~ /^Address/ && $2 ~ /\<'${i}'\>/ {if ($3 ~ /\<Enabled\>/) Error=0; } END{exit Error}' ${TMP_FILE} )
OUD_ERROR=$?
if [ ${OUD_ERROR} -eq 51 ]; then
DoMsg "INFO : Process ${TMP_FILE} file"
# check Server Run Status
if [ $(grep -ic 'Server Run Status: Started' ${TMP_FILE}) -eq 0 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 51 ${i}
CleanAndQuit 50 ${OUD_INSTANCE}
fi
done

if [ "${REPLICATION}" = "TRUE" ]; then
i="Replication"
DoMsg "INFO : Check connection handler ${i}"
AWK_OUT=$(awk 'BEGIN{RS="\n-\n";FS="\n";IGNORECASE=1; Error=51} $1 ~ /^Address/ && $2 ~ /\<'${i}'\>/ {if ($3 ~ /\<Enabled\>/) Error=0; } END{exit Error}' ${TMP_FILE} )
OUD_ERROR=$?
if [ ${OUD_ERROR} -eq 51 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 51 ${i}
fi
# check if connection handler are enabled
for i in LDAP LDAPS; do
DoMsg "INFO : Check connection handler ${i}"
AWK_OUT=$(awk 'BEGIN{RS="\n-\n";FS="\n";IGNORECASE=1; Error=51} $1 ~ /^Address/ && $2 ~ /\<'${i}'\>/ {if ($3 ~ /\<Enabled\>/) Error=0; } END{exit Error}' ${TMP_FILE} )
OUD_ERROR=$?
if [ ${OUD_ERROR} -eq 51 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 51 ${i}
fi
done

if [ "${REPLICATION}" = "TRUE" ]; then
i="Replication"
DoMsg "INFO : Check connection handler ${i}"
AWK_OUT=$(awk 'BEGIN{RS="\n-\n";FS="\n";IGNORECASE=1; Error=51} $1 ~ /^Address/ && $2 ~ /\<'${i}'\>/ {if ($3 ~ /\<Enabled\>/) Error=0; } END{exit Error}' ${TMP_FILE} )
OUD_ERROR=$?
if [ ${OUD_ERROR} -eq 51 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 51 ${i}
fi

# check if there are errors in replications
DoMsg "INFO : Run dsreplication status on OUD Instance ${MyOUD_INSTANCE}"
dsreplication status --no-prompt --noPropertiesFile --port $PORT_ADMIN --trustAll --bindDN "${MybindDN}" --adminPasswordFile ${MybindPasswordFile} >${TMP_FILE} 2>&1
OUD_ERROR=$?
# handle errors from OUD dsreplication
if [ ${OUD_ERROR} -gt 0 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 42 ${OUD_ERROR}
# check if there are errors in replications
DoMsg "INFO : Run dsreplication status on OUD Instance ${MyOUD_INSTANCE}"
dsreplication status --no-prompt --noPropertiesFile --port $PORT_ADMIN --trustAll --bindDN "${MybindDN}" --adminPasswordFile ${MybindPasswordFile} >${TMP_FILE} 2>&1
OUD_ERROR=$?
# handle errors from OUD dsreplication
if [ ${OUD_ERROR} -gt 0 ]; then
cat ${TMP_FILE} >> ${LOGFILE}
CleanAndQuit 42 ${OUD_ERROR}
fi

CAT_OUT=$(cat ${TMP_FILE}|awk 'BEGIN{FS=":";Error=0} /${OUD_ROOT_DN}/ {if ($7 !~/\<Normal\>/ ) Error=52; } END{exit Error}' )
OUD_ERROR=$?
if [ ${OUD_ERROR} -eq 52 ]; then
CleanAndQuit 52 ${i}
fi
fi
elif [ ${DIRECTORY_TYPE} == "OUDSM" ]; then
DoMsg "INFO : Identify directory type ${DIRECTORY_TYPE}"
URL="http://$(hostname):$PORT/oudsm/"
DoMsg "INFO : Check status of OUDSM console ${URL}"

# run OUD status check
curl -sSf ${URL} 2>&1 >/dev/null

CAT_OUT=$(cat ${TMP_FILE}|awk 'BEGIN{FS=":";Error=0} /${OUD_ROOT_DN}/ {if ($7 !~/\<Normal\>/ ) Error=52; } END{exit Error}' )
# normalize output for docker....
OUD_ERROR=$?
if [ ${OUD_ERROR} -eq 52 ]; then
CleanAndQuit 52 ${i}
if [ ${OUD_ERROR} -gt 0 ]; then
CleanAndQuit 53 ${URL}
fi
else
CleanAndQuit 44 ${DIRECTORY_TYPE}
fi

CleanAndQuit 0
Expand Down
4 changes: 2 additions & 2 deletions local/bin/oudenv.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@
# - Set default values for environment variables if not yet defined.
# ---------------------------------------------------------------------------
export HOST=$(hostname)
SCRIPT_NAME="$(basename ${BASH_SOURCE[0]})" # Basename of the script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P)" # Absolute path of script
SCRIPT_FQN="${SCRIPT_DIR}/${SCRIPT_NAME}" # Full qualified script name

# default values for file and folder names
DEFAULT_OUD_ADMIN_BASE_NAME="admin"
Expand Down Expand Up @@ -558,6 +556,7 @@ if [ -f "${OUDTAB}" ]; then # check if the requested OUD Instance exists in oudt
else # print error and keep current setting
echo "ERROR: OUD Instance ${OUD_INSTANCE} does not exits in ${OUDTAB} or ${OUD_INSTANCE_BASE}"
export OUD_INSTANCE=${OUD_INSTANCE_LAST}
return 1
fi
else # check if the requested OUD Instance exists in oudbase
if [ -d "${OUD_INSTANCE_BASE}/${OUD_INSTANCE}/OUD" ]; then
Expand All @@ -569,6 +568,7 @@ else # check if the requested OUD Instance exists in oudbase
else # print error and keep current setting
echo "ERROR: OUD Instance ${OUD_INSTANCE} does not exits in ${OUD_INSTANCE_BASE}"
export OUD_INSTANCE=${OUD_INSTANCE_LAST}
return 1
fi
fi

Expand Down
18 changes: 10 additions & 8 deletions local/doc/.oudbase.sha
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
9b57f538d2e506b82ecc4610a9d774870ab27aa0 ?./bin/oud_status.sh
6e51ae9dc8edf03deffaf9d59d1f53ab56b50c9a ?./bin/oud_export.sh
1566fe6b4fe1f589e74ef73ee823119e61834629 ?./bin/oud_backup.sh
42ac111f043419f69f92d5e721774548bb13f7ec ?./bin/oudenv.sh
d8e1c7aef6cefb7bf1c11450fed02079200f435c ?./bin/oud_status.sh
7567ba087871591e7ed9a6ce09e2e673d74fdee7 ?./bin/oud_export.sh
4ea2d008073e122a0473e110303df4e8ebb494f0 ?./bin/oud_backup.sh
a8fe71736bd0154ad03b83217d60282cef9a0f2f ?./bin/oudenv.sh
65238ac85ba935bcec503b0cc9153cd083c1f904 ?./etc/oudenv_core.conf
f1b02bcf2c028f7b81a3a163f26e59b4b97ad598 ?./etc/oudenv.conf
6409db70688ed022dd232b5c241ae96270c3aa12 ?./etc/oudenv_custom.conf
98086472bf7b1ff1419d7961893dfe2ccd00fa8e ?./etc/oudtab
093a38896b4eb78f714c1515ee7a05d146f9658f ?./etc/oud._DEFAULT_.conf
8c1112a8541a51368a708ed903b9994e31492547 ?./templates/ldif/oud_pi_init.ldif
c6512b8fe981eb9a3619c7a32a2e3dddb82ffbce ?./templates/etc/wls_oudsm.service
bc61d6f4e8084b6a1971abb052c520a09ca4fb5c ?./templates/etc/wls_oudsm.service
65238ac85ba935bcec503b0cc9153cd083c1f904 ?./templates/etc/oudenv_core.conf
03fcc0fbc2cd3435e11b8a04767b087ea10dfc73 ?./templates/etc/install.rsp
e6383dd5c0c8c0ddfcd74417b16fa81670eb13ec ?./templates/etc/oudenv.conf
5e9de046f186d9930f145b5a5158116959104d2d ?./templates/etc/oraInst.loc
6409db70688ed022dd232b5c241ae96270c3aa12 ?./templates/etc/oudenv_custom.conf
98086472bf7b1ff1419d7961893dfe2ccd00fa8e ?./templates/etc/oudtab
093a38896b4eb78f714c1515ee7a05d146f9658f ?./templates/etc/oud._DEFAULT_.conf
662a503d3544babd4216f9a3e240f5f6fec45ba5 ?./templates/etc/oud_instance.service
d55e6bcb5f56bb02871e96b3f575c7a41b3ed4e1 ?./templates/etc/oud_instance.service
708fb4229f49cb2d605df26919200e79367f01d3 ?./templates/cron.d/oud
282053063fc527abfb2e5bfb40587da6fe6fe677 ?./templates/.bash_profile
8bb3660f47b71d8b1217412456730b7e9bf1aacd ?./templates/logrotate.d/oud
d23b5c2c78f43ca527046e328766b2fc164f767e ?./templates/logrotate.d/oudsm
1d913cd429b0162d0e2d23a1f50cb82c53198f44 ?./templates/logrotate.d/oud
1d913cd429b0162d0e2d23a1f50cb82c53198f44 ?./templates/logrotate.d/oudbase
37dc6999dbca4b8d1c859315761fc7193e6d65eb ?./templates/create/01_create_instance.sh
236ea7b2e908befa94fb63800d1dd526f650deee ?./templates/create/04_create_root_user.ldif
903ef2815f53b05b4c6c76de97f074da82e9f174 ?./templates/create/00_init_environment.sh
Expand All @@ -36,4 +38,4 @@ af0e2c2febcb5d903ee038cc47991d7967a088cd ?./templates/create/04_create_root_user
c0fc51fe0821269c5863b8beaced0ccecbeb8055 ?./templates/create/02_configure_instance.conf
8624bcdae55baeef00cd11d5dfcfa60f68710a02 ?./doc/LICENSE
3db97bdaacfb1fc28c27f93bceda238135caed1b ?./doc/README.md
8be10739591c8074326bf60f6a21f534766f2d60 ?./doc/.version
8c4c714ef92448b4f016373bb254911ab4b44847 ?./doc/.version
4 changes: 2 additions & 2 deletions local/doc/.version
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

OUD Base Release v1.1.0 (https://github.com/oehrlis/oudbase)
OUD Base Release v1.1.1 (https://github.com/oehrlis/oudbase)
------------------------------------------------------------

The following files of oudbase are changed/added (compared to v1.1.0):
The following files of oudbase are changed/added (compared to v1.1.1):
----------------------------------------------------------------------
8 changes: 4 additions & 4 deletions local/templates/etc/oud_instance.service
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ After=network.target
Type=simple
User=oud
Group=oud
Environment=OPENDS_JAVA_HOME="/usr/java/jdk1.8.0_144/"
ExecStart=/u01/instances/oud_cdse/OUD/bin/start-ds --quiet
ExecStop=/u01/instances/oud_cdse/OUD/bin/stop-ds --quiet
ExecReload=/u01/instances/oud_cdse/OUD/bin/stop-ds --restart --quiet
Environment=OPENDS_JAVA_HOME="/usr/java/jdk1.8.0_162/"
ExecStart=OUD_INSTANCE_HOME/OUD/bin/start-ds --quiet
ExecStop=OUD_INSTANCE_HOME/OUD/bin/stop-ds --quiet
ExecReload=OUD_INSTANCE_HOME/OUD/bin/stop-ds --restart --quiet
TimeoutSec=300
StandardOutput=syslog+console
StandardError=syslog+console
Expand Down
12 changes: 6 additions & 6 deletions local/templates/etc/wls_oudsm.service
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
# Author.....: Stefan Oehrli, stefan.oehrli at trivadis.com
# Date.......: 2017.09.07.
# Revision...: 1.0
# Purpose....: Unit file for ODSM domain
# Usage......: systemctl enable wls_odsm.service
# Purpose....: Unit file for OUDSM domain
# Usage......: systemctl enable wls_OUDSM.service
# Notes......:
# License....: GPL-3.0+
# This is a template file for a systemd service for Oracle Unified
Expand Down Expand Up @@ -37,17 +37,17 @@
# ---------------------------------------------------------------------------

[Unit]
Description=WLS ODSM Instance
Description=WLS OUDSM Instance
Wants=network.target
After=network.target

[Service]
Type=simple
User=oud
Group=oud
WorkingDirectory=/u00/app/oracle/user_projects/domains/ODSM_domain
ExecStart=/u00/app/oracle/user_projects/domains/ODSM_domain/startWebLogic.sh
ExecStop=/u00/app/oracle/user_projects/domains/ODSM_domain/bin/stopWebLogic.sh
WorkingDirectory=OUDSM_DOMAIN_HOME
ExecStart=OUDSM_DOMAIN_HOME/startWebLogic.sh
ExecStop=OUDSM_DOMAIN_HOME/bin/stopWebLogic.sh
TimeoutSec=300
StandardOutput=syslog+console
StandardError=syslog+console
Expand Down
Loading

0 comments on commit cabccf2

Please sign in to comment.