Utilizing Postscripts (Rename, JoinDomain, Drivers, Snapins)
-
Always remove notation and you’ll see just how minimal lines of code it is
fog.drivers
[CODE]#!/bin/shceol=
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] -
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/shhostadpwd=“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] -
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 etca 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] -
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!!!
-
Hi Lee,
Can I add in this way the unattend.xml file to the postscripts? If yes, how?
ThanksCorneliu
-
[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?
ThanksCorneliu[/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.
-
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] -
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]
-
fog.postdownload is triggered/executed by fog.download after the pc has pulled down the image
-
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.
-
Thanks, I just saw that! Sorry. I will run some more tests now
-
remove/hash these lines:
mkdir /fog &>/dev/null
mount -o nolock,proto=tcp $storageip:/fog/ /fog
dots “Mounting Device”; -
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
-
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. -
Hi Gregg,
What version of fog are you using?
-
@Lee-Rowlett Sorry,trunk version 7709 i believe
-
@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 folderTry 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";
-
@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
-
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 :-))
-
@Lee-Rowlett Sure, here’s the goods:
Screenshot of folders in /images