• Recent
    • Unsolved
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    Utilizing Postscripts (Rename, JoinDomain, Drivers, Snapins)

    Scheduled Pinned Locked Moved
    Tutorials
    14
    46
    31.7k
    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.
    • Lee RowlettL
      Lee Rowlett Developer
      last edited by

      Hi All,

      i haven’t got round to it until now but i thought i’d share how i used postscripts to give the community ideas of how it could be used and how potentially powerful postscripts really can be. i’ll try to notation anything that may not make sense and try not to fill this thread full of code! i’ll seperate each “file script” into a new post

      so under /images/postdownloadscripts i have the following files:
      fog.ad, fog.drivers, fog.postdownload, fog.snapins (rather than having a bulk of code just in fog.postdownload - keeps it nice and seperate)

      THE FOG.POSTDOWNLOAD (the script that directs everything i guess you could say)
      fog.postdownload contains:

      [CODE]if [ $osid == “5” -o $osid == “6” -o $osid == “7” ]; then #only handling Win7/8/8.1
      clearScreen;
      mkdir /ntfs &>/dev/null
      ntfs-3g -o force,rw $part /ntfs #mount image (remember this is mounting partition [U][B]after[/B][/U] new image is deployed)
      mkdir /fog &>/dev/null
      mount -o nolock,proto=tcp $storageip:/fog/ /fog #this is a share created on server under /fog which contains drivers, software etc… (just add /fog to exports but you could use existing location i.e. /images and if you do, do not need to do this mount as /images is still mounted at this point)
      dots “Mounting Device”;
      if [ “$?” = “0” ]; then
      echo “Done”;
      . ${postdownpath}fog.drivers # run fog.drivers script
      . ${postdownpath}fog.ad # then run fog.ad … you get the jist
      . ${postdownpath}fog.snapins
      umount /ntfs; # unmount when all is done 🙂
      else
      echo “Failed To Mount Device”;
      sleep 30;
      fi
      fi[/CODE]

      G Greg PlamondonG 2 Replies Last reply Reply Quote 0
      • Lee RowlettL
        Lee Rowlett Developer
        last edited by

        Always remove notation and you’ll see just how minimal lines of code it is 🙂
        fog.drivers
        [CODE]#!/bin/sh

        ceol=tput el;
        machine=dmidecode -s system-product-name; # Gets machine model
        machine=“${machine%”${machine##*[![:space:]]}“}” #Removes Trailing Space
        system64=“/ntfs/Windows/SysWOW64/regedit.exe”; # dirty way to determine if it’s 64bit or not
        if [ -f “$system64” ]; then
        setarch=“x64”
        else
        setarch=“x86”
        fi
        #############################################
        #this is not section necessary needed, it’s just to make the path “human readable”
        #rather than using osid for filepath
        if [ $osid == “5” ]; then
        osn=“Win7”
        elif [ $osid == “6” ]; then
        osn=“Win8”
        elif [ $osid == “7” ]; then
        osn=“Win8.1”
        fi
        #############################################
        dots “Preparing Drivers”;

        below creates local folder on imaged pc

        #this can be anywhere you want just remember
        #to make sure it matches throughout!
        mkdir /ntfs/Windows/DRV &>/dev/null;
        echo -n “In Progress”;

        #there’s 3 ways you could handle this,
        #driver cab file, extracted driver files or both
        #so on the server put extracted driver files to match below folder tree
        #i.e. Model Latitude E5410, Windows 7 x86 image would be:
        #/fog/Drivers/Win7/Latitude E5410/x86
        rsync -aqz “/fog/Drivers/$osn/${machine}/$setarch” /ntfs/Windows/DRV &>/dev/null;

        #if you wanted to use driver.cab use this line below.
        #i.e. /fog/Drivers/Win7/Latitude E5410/E5410-Win7-A07-KTT4G.CAB
        cabextract -d /ntfs/Windows/DRV “/fog/Drivers/$osn/${machine}”/*.CAB &>/dev/null;

        #if you wanted to mix both cab and extracted use these:
        rsync -aqz --exclude='.CAB’ “/fog/Drivers/$osn/${machine}/$setarch” /ntfs/Windows/DRV &>/dev/null;
        cabextract -d /ntfs/Windows/DRV “/fog/Drivers/$osn/${machine}”/
        .CAB &>/dev/null;

        #this next bit adds driver location on pc to devicepath in registry (so sysprep uses it to reference)

        remember to make devicepath= match the path you’ve used locally

        #also do not remove %SystemRoot%\inf
        #and to add more locations just use ; in between each location
        regfile=“/ntfs/Windows/System32/config/SOFTWARE”
        key=“\Microsoft\Windows\CurrentVersion\DevicePath”
        devpath=“%SystemRoot%\inf;%SystemRoot%\DRV”;
        reged -e “$regfile” &>/dev/null <<EOFREG
        ed $key
        $devpath
        q
        y
        EOFREG
        echo -e “\b\b\b\b\b\b\b\b\b\b\b${ceol}Done”; # this just removes “In Progress and replaces it with done :-)”[/CODE]

        1 Reply Last reply Reply Quote 0
        • Lee RowlettL
          Lee Rowlett Developer
          last edited by

          this will remove the 2 needed reboots to rename and join domain (if hostname early is not used)

          not much info needed on this pretty self explanatory, uses sed to manipulate unattend.xml to be unique to that machine setting the name and ad details.

          only prereq is that your unattend.xml MUST include:
          <JoinWorkgroup>Workgroup</JoinWorkgroup>
          <Credentials>
          <Password></Password>
          <Username></Username>
          </Credentials>
          <JoinDomain></JoinDomain>
          <MachineObjectOU></MachineObjectOU>

          and other prereq is your ad username should be the new way of just username rather than old domain\username

          nice thing also, it’s not static info and uses fog variables for name and ad details

          one more thing to add, if machine is not set to join ad in fog, it will not add ad details to unattend 🙂

          fog.ad
          [CODE]#!/bin/sh

          hostadpwd=“PasswordtojoinAD”; #only downside to this method- this is the plain ad password
          unattend=“/ntfs/Windows/Panther/unattend.xml”;
          if [ -f “$unattend” ]; then
          dots “Preparing Sysprep File”;
          rm -f /ntfs/Windows/System32/sysprep/unattend.xml;
          echo “Done”;
          dots “Writing Computer Name”;
          sed -i “/ComputerName/s/*/$hostname/g” $unattend
          echo “Done”;
          dots “ComputerName Set To”;
          echo $hostname
          dots “Set PC To Join The Domain”;
          if [ “$addomain” != “” ]; then
          sed -i “/<JoinWorkgroup>/d” $unattend
          sed -i -e “s|<Password></Password>|<Password>${hostadpwd}</Password>|g”
          -e “s|<Username></Username>|<Username>${addomain}\\${aduser}</Username>|g”
          -e “s|<MachineObjectOU></MachineObjectOU>|<MachineObjectOU>${adou}</MachineObjectOU>|g”
          -e “s|<JoinDomain></JoinDomain>|<JoinDomain>${addomain}</JoinDomain>|g” $unattend
          echo “Done”;
          else
          echo “Skipped”;
          fi
          fi[/CODE]

          Greg PlamondonG 1 Reply Last reply Reply Quote 0
          • Lee RowlettL
            Lee Rowlett Developer
            last edited by

            now this is completely up to you, whatever you want it to do … i use it so that it downloads needed data for unique snapins and i also use it to get switch from fog so that i’m only actually using one script for all our “builds” and the script knows what’s needed by that switch. that way i only ever have to maintain one “snapin”

            i.e. snapin 1 = myscirpt.exe with a switch of /DefaultBuild in my script catches switch so if /DefaultBuild set $somevariable to true then
            if $somevariable = true then
            install these pieces software, add these shortcuts etc etc etc

            a one snapin rules all type scenario 🙂

            [CODE]#!/bin/sh

            snpchk=wget -O - --post-data="mac=${mac}" "http://${web}service/snapcheck.php" 2>/dev/null #checks for snapintask
            if [ “$snpchk” == “1” ]; then
            setupcmd=“/ntfs/Windows/Setup/Scripts/SetupComplete.cmd”;
            mkdir /ntfs/Windows/Setup/Scripts
            #this line below pulls my latest build script from server
            cp /fog/CompleteBuild/CompleteBuild.exe /ntfs/Windows/Setup/Scripts/CompleteBuild.exe &>/dev/null
            #copies lastest setupcomplete.cmd from server
            #which only actually contains one line to execute
            #C:\Windows\Setup\Scripts\CompleteBuild.exe
            cp /fog/CompleteBuild/SetupComplete.cmd $setupcmd #above script
            sloc=“/ntfs/Windows/Setup/Scripts/Node.txt”; # this is just so my above script
            #knows which node to use to run software from (if needed) left in to give you
            #guys ideas…
            echo “$storageip” >> “$sloc”; # writes node ip to the text file
            #next line gets snapin name
            snapname=wget -O - --post-data="mac=${mac}&getSnapnames=1" "http://${web}service/snapcheck.php" 2>/dev/null
            #next gets snapin argument/switch
            snaparg=wget -O - --post-data="mac=${mac}&getSnapargs=1" "http://${web}service/snapcheck.php" 2>/dev/null
            #this next line adds the switch to the setupcomplete.cmd
            # so if switch was /DefaultBuild .cmd line would now look like:
            #C:\Windows\Setup\Scripts\CompleteBuild.exe /DefaultBuild
            #if switch empty just nothing gets added
            sed -i -e “s|$| ${snaparg}|g” $setupcmd

            #this is self explanatory - some of our builds rely on 24GB of map files
            #rather than adding them to the "general" image
            #as it's the select few machines
            #i get fog to add it for me after imaging
            #so if they ever change, just update on server, job done.
            if [ "$snapname" == "MAP Build" -o "$snapname" == "Example Build" -o "$snapname" == "Test Build" ]; then
                dots "Downloading Map Files";
                echo "In Progress";
                rsync -a --info=progress2 "/fog/SnapinData/Map Files" /ntfs
                echo " * Downloading Map Files Completed.";
            fi
            

            else
            echo “No Snapin Task Found - Snapin Setup Skipped”;
            fi[/CODE]

            1 Reply Last reply Reply Quote 0
            • Lee RowlettL
              Lee Rowlett Developer
              last edited by

              potentially this means for rename, ad, snapins you wouldn’t need to use fog client… although fog client would be there as a backup if anything failed and i would always recommend still utilizing the FOG Client especially the new one when it comes out, you’d be silly not to!!!

              1 Reply Last reply Reply Quote 0
              • C
                Corneliu Mahu
                last edited by

                Hi Lee,
                Can I add in this way the unattend.xml file to the postscripts? If yes, how?
                Thanks

                Corneliu

                1 Reply Last reply Reply Quote 0
                • Tom ElliottT
                  Tom Elliott
                  last edited by

                  [quote=“Corneliu Mahu, post: 40382, member: 27456”]Hi Lee,
                  Can I add in this way the unattend.xml file to the postscripts? If yes, how?
                  Thanks

                  Corneliu[/quote]

                  You can use these postscripts to alter your unattend file directly.

                  What you need to do is know what line needs to be changed to what and make the post scripts mount the partition containing the unattend file and make the adjustments as needed.

                  Please help us build the FOG community with everyone involved. It's not just about coding - way more we need people to test things, update documentation and most importantly work on uniting the community of people enjoying and working on FOG! Get in contact with me (chat bubble in the top right corner) if you want to join in.

                  Web GUI issue? Please check apache error (debian/ubuntu: /var/log/apache2/error.log, centos/fedora/rhel: /var/log/httpd/error_log) and php-fpm log (/var/log/php*-fpm.log)

                  Please support FOG if you like it: https://wiki.fogproject.org/wiki/index.php/Support_FOG

                  1 Reply Last reply Reply Quote 0
                  • JunkhackerJ
                    Junkhacker Developer
                    last edited by

                    I thought i would share my own Postdownloadscript. i have a tendency to forget to remove the fog.log file from an image before i upload it, so i made a script to delete it.
                    [CODE]#!/bin/bash
                    #deletes fog.log for Windows 7, 8, or 8.1
                    #Greg Grammon (Junkhacker)

                    #funcs.sh allows us to use the functions that are used in the rest of
                    #fog i.e. “dots” and use the vars already in place i.e. “$part” and “$osid”
                    . /usr/share/fog/lib/funcs.sh;
                    if [ “$osid” == “5” ] || [ “$osid” == “6” ] || [ “$osid” == “7” ]; then
                    mkdir /ntfs 2>/dev/null
                    dots “Mounting Windows File System”;
                    mount.ntfs-3g $part /ntfs 2>/tmp/mntfail
                    mntRet=“$?”;
                    if [ ! “$mntRet” = “0” ]; then
                    echo “Failed”;
                    echo “”;
                    echo -n " * ";
                    cat /tmp/mntfail
                    echo “”;
                    sleep 2;
                    else
                    echo “Done.”;
                    rm /ntfs/fog.log 2>/dev/null
                    echo “”;
                    echo “fog.log deleted”;
                    umount /ntfs
                    sleep 5;
                    fi
                    fi[/CODE]

                    signature:
                    Junkhacker
                    We are here to help you. If you are unresponsive to our questions, don't expect us to be responsive to yours.

                    1 Reply Last reply Reply Quote 0
                    • M
                      Mikael
                      last edited by

                      This is extremely interesting! Can you explain where in the download process the fog.postdownload script is triggered?
                      I have created those three scripts but I cannot notice anything happening when i run a normal download to a pc but the download process keep looping! it only stops when I remove the script files from the folder…

                      [url=“/_imported_xf_attachments/1/1791_fog.ad.txt?:”]fog.ad.txt[/url][url=“/_imported_xf_attachments/1/1792_fog.drivers.txt?:”]fog.drivers.txt[/url][url=“/_imported_xf_attachments/1/1793_fog.postdownload.txt?:”]fog.postdownload.txt[/url]

                      1 Reply Last reply Reply Quote 0
                      • Lee RowlettL
                        Lee Rowlett Developer
                        last edited by

                        fog.postdownload is triggered/executed by fog.download after the pc has pulled down the image

                        1 Reply Last reply Reply Quote 0
                        • Lee RowlettL
                          Lee Rowlett Developer
                          last edited by

                          your fog.postdownload is missing: #!/bin/sh

                          also you’ve changed path in fog.drivers to /images (sensible option using existing fileshare!)

                          but your fog.postdownload is still trying to mount /fog so you can hash out/remove that, i can’t remember without checking but /images is still mounted so don’t even need “remount” it.

                          1 Reply Last reply Reply Quote 0
                          • M
                            Mikael
                            last edited by

                            Thanks, I just saw that! Sorry. I will run some more tests now

                            1 Reply Last reply Reply Quote 0
                            • Lee RowlettL
                              Lee Rowlett Developer
                              last edited by

                              remove/hash these lines:

                              mkdir /fog &>/dev/null
                              mount -o nolock,proto=tcp $storageip:/fog/ /fog
                              dots “Mounting Device”;

                              1 Reply Last reply Reply Quote 0
                              • M
                                Mikael
                                last edited by

                                yeah, I was using the already mounted images folder for my drivers. I see now that those other lines are not in use either, thanks

                                1 Reply Last reply Reply Quote 0
                                • G
                                  gwhitfield
                                  last edited by gwhitfield

                                  I’m attempting to use this in our image deployment to push drivers and am having some trouble that is hopefully not difficult to overcome, I’m just not real script savvy. 😞 I have placed my drivers in the /images/Drivers folder and my fog.postdownload is as follows:

                                  
                                  #!/bin/sh
                                  if [ $osid == "5" -o $osid == "6" -o $osid == "7" ]; then #only handling Win7/8/8.1
                                      clearScreen;
                                      mkdir /ntfs &>/dev/null
                                      ntfs-3g -o force,rw $part /ntfs
                                      # mkdir /fog &>/dev/null
                                      # mount -o nolock,proto=tcp $storageip:/fog/ /fog 
                                      # dots "Mounting Device";
                                      if [ "$?" = "0" ]; then
                                          echo "Done";
                                          . ${postdownpath}fog.drivers 
                                        # . ${postdownpath}fog.ad 
                                        # . ${postdownpath}fog.snapins
                                          umount /ntfs; # unmount when all is done :-)
                                      else
                                          echo "Failed To Mount Device";
                                          sleep 30;
                                      fi
                                  fi
                                  

                                  The computer responds with :

                                  ntfs-3g: No mountpoint is specified

                                  gives lots of usage instructions and options then

                                  Failed to mount device

                                  then restarts after about 30 seconds.

                                  My fog.drivers file is as follows:

                                  #!/bin/sh
                                   
                                  ceol=`tput el`;
                                  machine=`dmidecode -s system-product-name`; # Gets machine model
                                  machine="${machine%"${machine##*[![:space:]]}"}" #Removes Trailing Space
                                  #system64="/ntfs/Windows/SysWOW64/regedit.exe"; # dirty way to determine if it's 64bit or not
                                  #if [ -f "$system64" ]; then
                                  #    setarch="x64"
                                  #else
                                  #    setarch="x86"
                                  #fi
                                  #############################################
                                  #this is not section necessary needed, it's just to make the path "human readable"
                                  #rather than using osid for filepath
                                  if [ $osid == "5" ]; then
                                      osn="Win7"
                                  elif [ $osid == "7" ]; then
                                      osn="Win8.1"
                                  elif [ $osid == "9" ]; then
                                      osn="Win10"
                                  fi
                                  #############################################
                                  dots "Preparing Drivers";
                                  # below creates local folder on imaged pc
                                  #this can be anywhere you want just remember
                                  #to make sure it matches throughout!
                                  mkdir /ntfs/Windows/DRV &>/dev/null;
                                  echo -n "In Progress";
                                   
                                  #there's 3 ways you could handle this,
                                  #driver cab file, extracted driver files or both
                                  #so on the server put extracted driver files to match below folder tree
                                  #i.e. Model Latitude E5410, Windows 7 x86 image would be:
                                  #/images/Drivers/Win7/Latitude E5410/x86
                                  rsync -aqz "/images/Drivers/$osn/${machine}/*.*" /ntfs/Windows/DRV &>/dev/null;
                                   
                                  #if you wanted to use driver.cab use this line below.
                                  #i.e. /images/Drivers/Win7/Latitude E5410/E5410-Win7-A07-KTT4G.CAB
                                  #cabextract -d /ntfs/Windows/DRV "/images/Drivers/$osn/${machine}"/*.CAB &>/dev/null;
                                   
                                  #if you wanted to mix both cab and extracted use these next two lines:
                                  # rsync -aqz --exclude='*.CAB' "/images/Drivers/$osn/${machine}/$setarch" /ntfs/Windows/DRV &>/dev/null;
                                  # cabextract -d /ntfs/Windows/DRV "/images/Drivers/$osn/${machine}"/*.CAB &>/dev/null;
                                   
                                  #this next bit adds driver location on pc to devicepath in registry (so sysprep uses it to reference)
                                  # remember to make devicepath= match the path you've used locally
                                  #also do not remove %SystemRoot%\inf
                                  #and to add more locations just use ; in between each location
                                  regfile="/ntfs/Windows/System32/config/SOFTWARE"
                                  key="\Microsoft\Windows\CurrentVersion\DevicePath"
                                  devpath="%SystemRoot%\inf;%SystemRoot%\DRV";
                                  reged -e "$regfile" &>/dev/null <<EOFREG
                                  ed $key
                                  $devpath
                                  q
                                  y
                                  EOFREG
                                  echo -e "\b\b\b\b\b\b\b\b\b\b\b${ceol}Done"; # this just removes "In Progress and replaces it with done :-)"
                                  

                                  Would you be able to assist?
                                  Thanks,
                                  Gregg W.

                                  1 Reply Last reply Reply Quote 0
                                  • Lee RowlettL
                                    Lee Rowlett Developer
                                    last edited by

                                    Hi Gregg,

                                    What version of fog are you using?

                                    G 1 Reply Last reply Reply Quote 1
                                    • G
                                      gwhitfield @Lee Rowlett
                                      last edited by

                                      @Lee-Rowlett Sorry,trunk version 7709 i believe

                                      1 Reply Last reply Reply Quote 1
                                      • Lee RowlettL
                                        Lee Rowlett Developer
                                        last edited by Lee Rowlett

                                        @gwhitfield as you’re using /images as your driver location you do not need to mount a share as it’s already mounted, so /fog mount is irrelevant to you. as you’re only doing one arch or having both drivers on the image, i’m assuming as you commented it out, make sure your folder layout for drivers matches this for example a Windows 7 build OptiPlex 7010 would be:
                                        “/images/Drivers/Win7/OptiPlex 7010” and all your drivers for the 7010 would be within that folder

                                        Try these and let me know how you get on 🙂

                                        fog.postdownload:

                                        #!/bin/bash
                                        case $osid in
                                            [5-7]|9)
                                        	clearScreen
                                        	getHardDisk
                                        	getPartitions $hd
                                        	if [[ ! -d /ntfs ]]; then
                                        	    mkdir -p /ntfs >/dev/null 2>&1
                                        	    [[ ! $? -eq 0 ]] && echo " * Failed to Mount Device"
                                        	fi
                                        	for part in $parts; do
                                        	    umount /ntfs >/dev/null 2>&1
                                        	    ntfs-3g -o remove_hiberfile,rw $part /ntfs >/dev/null 2>&1
                                        	    [[ ! $? -eq 0 ]] && continue
                                        	done
                                        	. ${postdownpath}fog.drivers
                                        	umount /fog /ntfs /images >/dev/null 2>&1
                                        	;;
                                        esac
                                        

                                        fog.drivers:

                                        #!/bin/bash
                                        ceol=`tput el`;
                                        machine=`dmidecode -s system-product-name`;
                                        machine="${machine%"${machine##*[![:space:]]}"}"
                                        if [ $osid == "5" ]; then
                                            osn="Win7"
                                        elif [ $osid == "7" ]; then
                                            osn="Win8.1"
                                        elif [ $osid == "9" ]; then
                                            osn="Win10"
                                        fi
                                        dots "Preparing Drivers";
                                        mkdir /ntfs/Windows/DRV &>/dev/null;
                                        echo -n "In Progress";
                                        rsync -aqz "/images/Drivers/$osn/${machine}" /ntfs/Windows/DRV &>/dev/null;
                                        regfile="/ntfs/Windows/System32/config/SOFTWARE"
                                        key="\Microsoft\Windows\CurrentVersion\DevicePath"
                                        devpath="%SystemRoot%\inf;%SystemRoot%\DRV";
                                        reged -e "$regfile" &>/dev/null <<EOFREG
                                        ed $key
                                        $devpath
                                        q
                                        y
                                        EOFREG
                                        echo -e "\b\b\b\b\b\b\b\b\b\b\b${ceol}Done";
                                        
                                        G 1 Reply Last reply Reply Quote 0
                                        • G
                                          gwhitfield @Lee Rowlett
                                          last edited by gwhitfield

                                          @Lee-Rowlett Seems like I’m very close. The image task completes and I get the following just before the machine restarts. Unfortunately no drivers are copied so the image fails to bootup since there’s no drivers in it:

                                          /images/postdownloadscripts/fog.postdownload: line 2: syntax error near unexpected token '$' in\r''
                                          
                                          'images/postdownloadscripts/fog.postdownload: line 2: 'case $osid in
                                          * Mounting directory ............................Done
                                          * Mounting directory ............................Done
                                          * Changing hostname .............................Done
                                          * Task complete
                                          * Updating Database..............................Done
                                          * Rebooting system as task is complete
                                          Reboot: Restarting system
                                          
                                          
                                          Lee RowlettL 1 Reply Last reply Reply Quote 0
                                          • Lee RowlettL
                                            Lee Rowlett Developer @gwhitfield
                                            last edited by Lee Rowlett

                                            can you send me both your fog.postdownload and fog.drivers file and i’ll take a look - (i mean physically send, not paste the code on here :-))

                                            G 2 Replies Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 1 / 3
                                            • First post
                                              Last post

                                            169

                                            Online

                                            12.0k

                                            Users

                                            17.3k

                                            Topics

                                            155.2k

                                            Posts
                                            Copyright © 2012-2024 FOG Project