SOLVED Automatic hardware detection & driver installs in FOG

  • I built a script with FOG .33 that copied drivers from a central store as a part of the imaging process based on the BIOS model identifier.

    I’ve finally had some time to play with FOG 1.2, and I’m making the following adjustments to my script:

    -I’m using the postdownloadscripts folder to add the scripts required without having to edit the init.xz file
    -I’ve changed the script from using the BIOS model # to using lspci & lsusb to enumerate the PCI & USB devices detected on the machine and then pull those specific drivers.

    What this means, is that we can develop a community driver library over rsync that allows people to build universal images where FOG does the work of installing the correct driver.


    Attached are the two script files. Machinedrivers is called from DriverInstall. Rename to .sh make executable.


  • @Tom-Elliott as it is in the fog.postdownload script, i think it is the system receiving the image

  • Senior Developer

    I mean where are you checking the variable being set?

    Are you checking directly on the fog server with echo $postdownloadscript or are you checking on the system receiving the image?

  • @Tom-Elliott it is the postdownloadscript location variable in fog.postdownload

  • Senior Developer

    @giejo63 where are you check the variable? Is it on the server or the system downloading the image?

  • @cml i will try that. Maybe it comes from a windows machine.
    Do you konw why i can’t use the ${postdownloadpath} variable ? (my fog server is a ubuntu 14.04)

  • Moderator


    Did you by chance transfer the file from a windows machine? If so you may need to convert line endings.

    dos2unix /images/postdownloadscripts/

  • Debugging 🙂 i found 2 problems:

    • ${postdownloadpath} variable is not recognized

    • when i put the full path /images/postdownloadscripts/, i have an error which says that /bin/bash^M: bad interpreter. -> i dont have any ^M at the end of the line.

    Any ideas for the variable and bad interpreter ??
    Thanks in advance

  • @MRCUR Still no luck for me
    image is correctly deployed but fog.postdownload doesn’t seem to run…
    i don’t know why …

  • Feeling pretty discouraged at the moment 😞

    My postdownloadscript works perfectly unless I use variables, at which point it no longer works. You can see a few of the things I’ve attempted and commented out. Even using ${postdownloadpath} doesn’t seem to work - I can only call my postdownload script if I specify the absolute path. My cabs are in /images/drivers/Win7/. So for the Optiplex 9020M, the location is /images/drivers/Win7/Optiplex 9020M/*.CAB - I’ve also tried Optiplex9020M - still doesn’t work. I’m on Rev 3606, Debian 7

    The only things in /images/postdownloadscripts are fog.postdownload and Permissions on both are 777

    Contents of fog.postdownload:

    ## This file serves as a starting point to call your custom postimaging scripts.
    ## <SCRIPTNAME> should be changed to the script you're planning to use.
    ## Syntax of post download scripts are
    #. ${postdownpath}<SCRIPTNAME>
    #. ${postdownloadpath}
    . /images/postdownloadscripts/

    Contents of

    #This script was adapted from Lee Rowlett's fog.drivers postdownload script ($
    #This script assumes your image has been modified to look in C:\Windows\Drivers in addition to the default location for Windows drivers ($
    #Make sure this script is called from your fog.postdownload file by adding ${postdownloadpath}/ to the /images/postdownloadscripts/fog.postdownload fi$
    mkdir /ntfs &>/dev/null; #Create new directory called ntfs and supress any system or error messages
    mount.ntfs-3g /dev/sda2 /ntfs; #Mount the NTFS Windows OS partition to the new ntfs directory
    machine=`dmidecode -s system-product-name`; #Get the model name of the computer being imaged
    #machine=$(dmidecode -s system-product-name)
    #machine=$(echo $machine | tr -d ' ') #Remove the trailing spaces from the model info
    #Get the OS version info and set it equal to the osn variable for later use
    #if [ $osid == "5" ]; then
    #elif [ $osid == "6" ]; then
    #elif [ $osid == "7" ]; then
    mkdir /ntfs/Windows/Drivers &>/dev/null; #Create the C:\Windows\Drivers directory and supress any system or error messages
    echo -e "Extracting Drivers..."; #Tell the user that FOG is extracting the drivers within C:\Windows\Drivers
    #cabextract -d /ntfs/Windows/Drivers "/images/drivers/$osn/Optiplex9020M/9020M-Win7-A04-JG7GH.CAB" &>/dev/null;
    cabextract -d /ntfs/Windows/Drivers "/images/drivers/$osn/$machine"/*.CAB &>/dev/null
    echo -e "DONE!"; #Tell the user that FOG has finished copying the drivers and finish the imaging process
  • Testers

    @giejo63 I’m running into the same issues. I have a sysprepped Win 7 image that has the C:\drivers location set to look for drivers. I have the drivers on the FOG server in /images/drivers and the scripts are executable. The postdownload file is set to run the script, and I have SetupComplete.cmd on the image set as described in Andrew’s wiki page.

    Anyone have some ideas?

  • @Tom-Elliott said:

    @ArchFan I don’t think so. Not on the server. The client/host during imaging or in the init process itself, yes, the server no.

    Gotcha - I’ve had some other issues getting it to work as intended, so it probably wasn’t an issue after all. Thanks Tom

  • Senior Developer

    @ArchFan I don’t think so. Not on the server. The client/host during imaging or in the init process itself, yes, the server no.

  • @cml said:

    Under: /images/postdownloadscripts/

    Just make sure you call the script from fog.postdownload


    Shouldn’t entering echo ${postdownloadpath}/ on the server output /images/postdownloadscripts/, or no? I was having some issues at first and ended up putting the absolute path to rule that out as an issue

  • Moderator

    Under: /images/postdownloadscripts/

    Just make sure you call the script from fog.postdownload


  • @Lee-Rowlett said:


    ceol=tput el;
    machine=dmidecode -s system-product-name;
    machine="${machine%"${machine##[![:space:]]}"}" #Removes Trailing Space
    if [ $osid == “5” ]; then
    elif [ $osid == “6” ]; then
    elif [ $osid == “7” ]; then
    dots “Downloading Drivers”;
    mkdir /ntfs/Windows/DRV &>/dev/null;
    echo -n “In Progress”;
    cabextract -d /ntfs/Windows/DRV “/fog/Drivers/$osn/${machine}”/
    .CAB &>/dev/null;
    echo -e “\b\b\b\b\b\b\b\b\b\b\b${ceol}Done”;
    reged -e “$regfile” &>/dev/null <<EOFREG
    ed $key

    code above will do what you want - change the paths to match your environment or wherever you want to store the cabs but using code example above. you’d put a copy of the cab into /fog/Drivers/Win7/OptiPlex 7010 for example then it will extract the cab and drivers will be installed during sysprep… shouldn’t need any postscripts

    @Lee-Rowlett - Where is it this script is supposed to be placed on the server and its name?

  • Hi,
    My postdownloadscript is executable (chmod a+x) i’ve modified fog.postdownload but after image deployment (successfully) it doesn’t seem to run fog.postdownlad and .
    So nothing is put inside c:\Drivers (i ve put some drivers)

    Any ideas ?

  • @Tom-Elliott said: machinedrivers driverinstall

    It works 👍
    Thanks a lot ! 🙂

  • Senior Developer

  • @Tom-Elliott said:

    @giejo63 give me a few minutes and I’ll host the files for you.

    Thanks in advance !!