“So you’ve automated SAP HANA stuff huh? What tools do you use? Python? Chef? Puppet? Ansible? DSC/Powershell? “
No. I use Korn shell. ¯\_(ツ)_/¯
Me, Trying to Support Korn…
I find Korn shell is a lowest common denominator across many Linux/Unix systems, and also extremely simple to support. It does exactly what I need.
For me it’s readable, fairly self-explanatory, easily editable and dependable.
…and Failing?
But I do know what you’re saying:
there’s no built in version control it’s not easy to debug it’s definitely not very cool 🤓 you can’t easily do offline development my Grandad told me about something called Korn shell ?
Have you Considered
If you have no budget for tools, then you can start automating by using what you already have. Why not. Don’t wait for the right tool, start somewhere and only then will you understand what works for you and doesn’t work for you.
Sometimes it’s not about budget. There are companies out there that do not allow certain sets of utilities and tools to be installed on servers, because they can provide too much help to hackers. Guess what they do allow? Yep, Korn shell is allowed.
Let’s Get Started
Here’s a sample function to run some SQL in HANA by calling the hdbsql (delivered with the HANA client) and return the output:
#!/bin/ksh
function run_sql {
typeset -i l_inst="${1}"
typeset l_db="${2}"
typeset l_user="${3}"
typeset l_pw="${4}"
typeset l_col_sep="${5}"
typeset l_sql="${6}"
typeset l_output=""
typeset l_auth=""
typeset -i l_ret=0
# Check if PW is blank, then use hdbuserstore (-U).
if [[ -n "${l_pw}" && "${l_pw}" != " " ]] ; then
l_auth="-u ${l_user} -p ${l_pw}"
else l_auth="-U ${l_user}"
fi
l_output="$(hdbsql -quiet -x -z -a -C -j -i ${l_inst} ${l_auth} -d ${l_db} -F "${l_col_sep}"<<-EOF1 2>>/tmp/some-script.log
${l_sql};
quit
EOF1 )"
l_ret=$?
# For HANA 1.0 we need to trim the first 6 lines of output, because it doesn't understand "-quiet".
#if [[ "$(check_major_version)" -lt 2 ]] ; then
# l_output="$(print "${l_output}"| tail -n +7)"
#fi
print "${l_output}"
return $l_ret
}
To call the above function, we then just do (in the same script):
l_result="$(run_sql "10" "SystemDB" "SYSTEM" "SYSTEMPW" " " "ALTER SYSTEM ALTER CONFIGURATION ('global.ini', 'SYSTEM') SET ('persistence','log_mode')='overwrite' WITH RECONFIGURE")"
We are passing in the HANA instance number 10, you can use whatever your instance number is.
We can check the function return code (did the function return cleanly) like so:
if [[ $? -ne 0 ]] ; then
print "FAILED"
exit 1;
fi
Here’s what we’re passing in our call to hdbsql (you can find this output by calling “hdbsql –help ”):-i instance number of the database engine -d name of the database to connect -U use credentials from user store -u user name to connect -p password to connect -x run quietly (no messages, only query output) -quiet Do not print the welcome screen-F use as the field separator (default: ‘,’) -C suppress escape output format -j switch the page by page scroll output off -Q show each column on a separate line -a do not print any header for SELECT commands
If you wanted to return a value, then the “l_result ” variable would contain the output.
Ideally, the function we wrote would be put into a chunk of modular code that could be referenced time and again from other Korn shell scripts.
You would also be looking to create some sets of standard functions for logging of messages to help with debugging. You can make it as complex as you wish.
In the call to “run_sql” we pass a column separator. I usually like to use a “|” (pipe), then parse the returned values using the “awk” utility like so:
l_result="$(run_sql "10" "SystemDB" "SYSTEM" "SYSTEMPW" "|" "SELECT file_name,layer_name,section,key, value FROM SYS.M_INIFILE_CONTENTS WHERE layer_name='SYSTEM'")"
echo "${l_result}" | /bin/awk -F'|' '{ print $2" "$3" "$4 }'
When we execute the script we get the first 3 columns like so:
daemon.ini SYSTEM daemon
diserver.ini SYSTEM communication
global.ini SYSTEM auditing
configuration global.ini SYSTEM
backup global.ini SYSTEM
...
Obviously we don’t really embed the password in the script; it gets passed in. You can either pass it in using the command line parameter method (./myscript.ksh someparam ) or via the Linux environment variables (export myparam=something; ./myscript.ksh ). If you want you can even pipe it in (echo “myparam”| ./myscript.ksh ) and “read” it into a variable. You can also take a look at the “expect” utility to automate command line input. Also, take a look at the “hdbuserstore” utility to store credentials for automation scripts (remember to set appropriatly secure privs on these database users).
That’s all there is to it for you to get started using Korn shell to call HANA.
You may also be interested in: