[SOLVED] Yes, another script that runs manually and not through cron!
-
Hello Everyone,
I've been trying to run this godaddy dns updater script that was created by NaZar78 ( BIG Ups to him 8) ) through cron. And just like the subject says, I can run it manually with no errors. But when I setup a cron for it, it doesn't run. And yes I'm setting up the job through the cron gui/pakage and I chmod the file. So can someone please help me with this. I've been at it for a couple of months. Below is the script.
Thanks,
#!/bin/sh # GoDaddy.sh v1.1 by Nazar78 @ TeaNazaR.com # http://teanazar.com/2016/05/godaddy-ddns-updater/ ########################################### # Simple DDNS script to update GoDaddy's DNS. Just schedule every 5mins in crontab. # With options to run scripts/programs/commands on update failure/success. # # Requirements: # - curl CLI - On Debian, apt-get install curl # # History: # v1.0 - 20160513 - 1st release. # v1.1 - 20170130 - Improved compatibility. # # PS: Feel free to distribute but kindly retain the credits (-: ########################################### # Begin settings # Get the Production API key/secret from https://developer.godaddy.com/keys/. # Ensure it's for "Production" as first time it's created for "Test". Key=Production key goes here Secret=Production secret goes here # Domain to update. Domain=yourdomain.com # Advanced settings - change only if you know what you're doing :-) # Record type, as seen in the DNS setup page, default A. Type=A # Record name, as seen in the DNS setup page, default @. Name=@ # Time To Live in seconds, minimum default 600 (10mins). # If your public IP seldom changes, set it to 3600 (1hr) or more for DNS servers cache performance. TTL=600 # Writable path to last known Public IP record cached. Best to place in tmpfs. CachedIP=/tmp/current_ip # External URL to check for current Public IP, must contain only a single plain text IP. # Default http://api.ipify.org. CheckURL=http://api.ipify.org # Optional scripts/programs/commands to execute on successful update. Leave blank to disable. # This variable will be evaluated at runtime but will not be parsed for errors nor execution guaranteed. # Take note of the single quotes. If it's a script, ensure it's executable i.e. chmod 755 ./script. # Example: SuccessExec='/bin/echo "$(date): My public IP changed to ${PublicIP}!">>/var/log/GoDaddy.sh.log' SuccessExec='' # Optional scripts/programs/commands to execute on update failure. Leave blank to disable. # This variable will be evaluated at runtime but will not be parsed for errors nor execution guaranteed. # Take note of the single quotes. If it's a script, ensure it's executable i.e. chmod 755 ./script. # Example: FailedExec='/some/path/something-went-wrong.sh ${Update} && /some/path/email-script.sh ${PublicIP}' FailedExec='' # End settings Curl=$(which curl 2>/dev/null) [ "${Curl}" = "" ] && echo "Error: Unable to find 'curl CLI'." && exit 1 [ -z "${Key}" ] || [ -z "${Secret}" ] && echo "Error: Requires API 'Key/Secret' value." && exit 1 [ -z "${Domain}" ] && echo "Error: Requires 'Domain' value." && exit 1 [ -z "${Type}" ] && Type=A [ -z "${Name}" ] && Name=@ [ -z "${TTL}" ] && TTL=600 [ "${TTL}" -lt 600 ] && TTL=600 echo -n>>${CachedIP} 2>/dev/null [ $? -ne 0 ] && echo "Error: Can't write to ${CachedIP}." && exit 1 [ -z "${CheckURL}" ] && CheckURL=http://api.ipify.org echo -n "Checking current 'Public IP' from '${CheckURL}'..." PublicIP=$(${Curl} -kLs ${CheckURL}) if [ $? -eq 0 ] && [ "${PublicIP}" != "" ];then echo "${PublicIP}!" else echo "Fail! ${PublicIP}" eval ${FailedExec} exit 1 fi if [ "$(cat ${CachedIP} 2>/dev/null)" != "${PublicIP}" ];then echo -n "Checking '${Domain}' IP records from 'GoDaddy'..." Check=$(${Curl} -kLsH"Authorization: sso-key ${Key}:${Secret}" \ -H"Content-type: application/json" \ https://api.godaddy.com/v1/domains/${Domain}/records/${Type}/${Name} \ 2>/dev/null|sed -r 's/.+data":"(.+)","t.+/\1/g' 2>/dev/null) if [ $? -eq 0 ] && [ "${Check}" = "${PublicIP}" ];then echo -n ${Check}>${CachedIP} echo -e "unchanged!\nCurrent 'Public IP' matches 'GoDaddy' records. No update required!" else echo -en "changed!\nUpdating '${Domain}'..." Update=$(${Curl} -kLsXPUT -H"Authorization: sso-key ${Key}:${Secret}" \ -H"Content-type: application/json" \ https://api.godaddy.com/v1/domains/${Domain}/records/${Type}/${Name} \ -d "{\"data\":\"${PublicIP}\",\"ttl\":${TTL}}" 2>/dev/null) if [ $? -eq 0 ] && [ "${Update}" = "{}" ];then echo -n ${PublicIP}>${CachedIP} echo "Success!" eval ${SuccessExec} else echo "Fail! ${Update}" eval ${FailedExec} exit 1 fi fi else echo "Current 'Public IP' matches 'Cached IP' recorded. No update required!" fi exit $?
-
When run from cron, it has no environment. Most likely things are failing because you aren't using the full paths to any commands. Something like "which curl" won't help for multiple reasons.
Any shell command would need to have a full path given to the binary, or, alternately, set a PATH at the start of the script.
-
I would like to thank you for your response back.
I was under the impression that if you can run a script manually, it'll run under cron. I'm not a scripting person at all. Definitely not my forte. Is it possible if you or any one can get this script working in cron. Or please tell me what I need to do or change. I would greatly appreciate the help and every one else looking for a solution to update the dns in godaddy. Which I've seen is a lot.
Thanks,
-
When run from a shell you have a full/proper environment, cron is an entirely different beast. You can never be assured anything will run under cron the same as a shell.
Whoever wrote the script will need to fix it so that it has proper references to executables and such. I don't have the time to take that on, but someone else might.
-
OK,
I do hope someone else can help with this. In the mean time, I'll go back to Nazar78. Hopefully he can continue to help me out. Wish me luck.
Thanks again.
-
Help from Nazar78, I got it working. It ended up being the PATH in crontab. Ran "echo $PATH" on a terminal and added whatever was missing on the PATH in crontab. And worked
Thanks,