Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    [SOLVED] Yes, another script that runs manually and not through cron!

    General pfSense Questions
    2
    6
    1.0k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      k-bull
      last edited by

      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 $?
      
      
      1 Reply Last reply Reply Quote 0
      • jimpJ
        jimp Rebel Alliance Developer Netgate
        last edited by

        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.

        Remember: Upvote with the 👍 button for any user/post you find to be helpful, informative, or deserving of recognition!

        Need help fast? Netgate Global Support!

        Do not Chat/PM for help!

        1 Reply Last reply Reply Quote 0
        • K
          k-bull
          last edited by

          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,

          1 Reply Last reply Reply Quote 0
          • jimpJ
            jimp Rebel Alliance Developer Netgate
            last edited by

            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.

            Remember: Upvote with the 👍 button for any user/post you find to be helpful, informative, or deserving of recognition!

            Need help fast? Netgate Global Support!

            Do not Chat/PM for help!

            1 Reply Last reply Reply Quote 0
            • K
              k-bull
              last edited by

              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.

              1 Reply Last reply Reply Quote 0
              • K
                k-bull
                last edited by

                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,

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post
                Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.