Netgate SG-1000 microFirewall

Author Topic: [SOLVED] Yes, another script that runs manually and not through cron!  (Read 335 times)

0 Members and 2 Guests are viewing this topic.

Offline k-bull

  • Newbie
  • *
  • Posts: 14
  • Karma: +0/-0
    • View Profile
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,

Code: [Select]

#!/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 $?

« Last Edit: January 04, 2018, 07:30:40 pm by k-bull »

Offline jimp

  • Administrator
  • Hero Member
  • *****
  • Posts: 21747
  • Karma: +1503/-26
    • View Profile
Re: Yes, another script that runs manually and not through cron!
« Reply #1 on: January 03, 2018, 01:54:49 pm »
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.
Need help fast? Commercial Support!

Co-Author of pfSense: The Definitive Guide. - Check the Doc Wiki for FAQs.

Do not PM for help!

Offline k-bull

  • Newbie
  • *
  • Posts: 14
  • Karma: +0/-0
    • View Profile
Re: Yes, another script that runs manually and not through cron!
« Reply #2 on: January 04, 2018, 12:26:46 pm »
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,

Offline jimp

  • Administrator
  • Hero Member
  • *****
  • Posts: 21747
  • Karma: +1503/-26
    • View Profile
Re: Yes, another script that runs manually and not through cron!
« Reply #3 on: January 04, 2018, 12:34:20 pm »
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.
Need help fast? Commercial Support!

Co-Author of pfSense: The Definitive Guide. - Check the Doc Wiki for FAQs.

Do not PM for help!

Offline k-bull

  • Newbie
  • *
  • Posts: 14
  • Karma: +0/-0
    • View Profile
Re: Yes, another script that runs manually and not through cron!
« Reply #4 on: January 04, 2018, 01:00:27 pm »
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.

Offline k-bull

  • Newbie
  • *
  • Posts: 14
  • Karma: +0/-0
    • View Profile
Re: Yes, another script that runs manually and not through cron!
« Reply #5 on: January 04, 2018, 07:27:19 pm »
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,