mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 13:22:36 +00:00 
			
		
		
		
	code drop for windows postscript/postbootscript support. The postscript/postbootscript should be set in node/osimage.postscript/postbootscript and copy to /install/winpostscripts before running nodeset
This commit is contained in:
		@@ -523,6 +523,14 @@ sub mkinstall
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #copy precreated mypostscript from /tftpboot/mypostscript to /install/mypostscript
 | 
			
		||||
        if (-r "$tftpdir/mypostscripts/mypostscript.$node") {
 | 
			
		||||
            if (! -d "$installroot/mypostscripts") {
 | 
			
		||||
                mkpath ("$installroot/mypostscripts");
 | 
			
		||||
            }
 | 
			
		||||
            copy ("$tftpdir/mypostscripts/mypostscript.$node", "$installroot/mypostscripts/mypostscript.$node");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (-f "$::XCATROOT/share/xcat/netboot/detectefi.exe" and not -f "$installroot/utils/detectefi.exe") {
 | 
			
		||||
            mkpath("$installroot/utils/");
 | 
			
		||||
            copy("$::XCATROOT/share/xcat/netboot/detectefi.exe","$installroot/utils/detectefi.exe");
 | 
			
		||||
@@ -560,11 +568,13 @@ sub mkinstall
 | 
			
		||||
        # generate the auto running command file for windows deployment
 | 
			
		||||
        open($shandle,">","$installroot/autoinst/$node.cmd");
 | 
			
		||||
        if ($partcfg) {
 | 
			
		||||
            print $shandle "set PARTCFG=\"$partcfg\n";
 | 
			
		||||
            print $shandle "set PARTCFG=\"$partcfg\r\n";
 | 
			
		||||
        }
 | 
			
		||||
        if ($installto) {
 | 
			
		||||
            print $shandle "set INSTALLTO=$installto\n";
 | 
			
		||||
            print $shandle "set INSTALLTO=$installto\r\n";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        print $shandle 'for /f "tokens=2 delims= " %%i in ('."'net use ^| find ".'"install"'."') do set instdrv=%%i\r\n";
 | 
			
		||||
        print $shandle "%instdrv%\\utils\\windows\\fixupunattend.vbs %instdrv%\\autoinst\\$node.xml x:\\unattend.xml\r\n";
 | 
			
		||||
        
 | 
			
		||||
@@ -578,6 +588,24 @@ sub mkinstall
 | 
			
		||||
        } else {
 | 
			
		||||
            print $shandle "%instdrv%\\$os\\$arch\\setup /unattend:x:\\unattend.xml /noreboot\r\n";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #check the existence of necessary files
 | 
			
		||||
        print $shandle "IF NOT EXIST %instdrv%\\mypostscripts\\mypostscript.$node GOTO:SKIPPOST\r\n";
 | 
			
		||||
        print $shandle "IF NOT EXIST %instdrv%\\winpostscripts\\xcatwinpost.vbs GOTO:SKIPPOST\r\n";
 | 
			
		||||
        print $shandle "IF NOT EXIST %instdrv%\\winpostscripts\\runpost.vbs GOTO:SKIPPOST\r\n";
 | 
			
		||||
        #crate c:\xcatpost
 | 
			
		||||
        print $shandle "mkdir c:\\xcatpost\r\n";
 | 
			
		||||
        #generate c:\xcatpost\xcatenv to pass env variables for later using
 | 
			
		||||
        print $shandle "set NODENAME=$node\r\n";
 | 
			
		||||
        print $shandle "echo NODENAME=$node>>c:\\xcatpost\\xcatenv\r\n";
 | 
			
		||||
        #copy postscripts to c:\xcatpost
 | 
			
		||||
        print $shandle "copy %instdrv%\\winpostscripts\\* c:\\xcatpost\\\r\n";
 | 
			
		||||
        print $shandle "copy %instdrv%\\mypostscripts\\mypostscript.$node c:\\xcatpost\\\r\n";
 | 
			
		||||
        print $shandle ":SKIPPOST\r\n";
 | 
			
		||||
        #### test part
 | 
			
		||||
        #print $shandle "start /max cmd\r\n";
 | 
			
		||||
        #print $shandle "pause\r\n";
 | 
			
		||||
 | 
			
		||||
        #print $shandle "i:\\postscripts\
 | 
			
		||||
        print $shandle 'reg load HKLM\csystem c:\windows\system32\config\system'."\r\n"; #copy installer DUID to system before boot
 | 
			
		||||
        print $shandle 'reg copy HKLM\system\CurrentControlSet\services\TCPIP6\parameters HKLM\csystem\ControlSet001\services\TCPIP6\parameters /f'."\r\n";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								xCAT/winpostscripts/runpost.vbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								xCAT/winpostscripts/runpost.vbs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
Dim myshell, filesys 
 | 
			
		||||
Dim args, pname, pargs, cmdname
 | 
			
		||||
Dim logname, loghandler, fline, output
 | 
			
		||||
 | 
			
		||||
'Ingore the error box to avoid the stop of postscript running
 | 
			
		||||
On Error Resume Next
 | 
			
		||||
 | 
			
		||||
'WScript.echo "get in runpost"
 | 
			
		||||
 | 
			
		||||
logname = "c:\xcatpost\xcat.log"
 | 
			
		||||
 | 
			
		||||
'Initialize the shell and fs objects
 | 
			
		||||
Set myshell = WScript.createObject("WScript.Shell")
 | 
			
		||||
Set filesys = CreateObject("Scripting.FileSystemObject")
 | 
			
		||||
 | 
			
		||||
'Open the log file for writting
 | 
			
		||||
Set loghandler = filesys.OpenTextFile(logname, 8, True)
 | 
			
		||||
 | 
			
		||||
' Get script name and arguments
 | 
			
		||||
Set args = WScript.Arguments
 | 
			
		||||
If args.Count <= 0 Then
 | 
			
		||||
    loghandler.Close
 | 
			
		||||
    WScript.Quit
 | 
			
		||||
ElseIf args.Count = 1 Then
 | 
			
		||||
    pname = args(0)
 | 
			
		||||
    pargs = ""
 | 
			
		||||
ElseIf args.Count > 1 Then
 | 
			
		||||
    pname = args(0)
 | 
			
		||||
    For i = 1 to args.Count - 1
 | 
			
		||||
       pargs = pargs & " " & args(i)
 | 
			
		||||
    Next
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
If Not filesys.FileExists("c:\xcatpost\" & pname) Then
 | 
			
		||||
    loghandler.WriteLine "Cannot find file: c:\xcatpost\" & pname 
 | 
			
		||||
    loghandler.Close
 | 
			
		||||
    WScript.Quit
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
cmdname = "cmd /c "
 | 
			
		||||
if Right(pname, 4) = ".bat" Or Right(pname, 4) = ".cmd" Then
 | 
			
		||||
    cmdname = cmdname & "call "
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
cmdname = cmdname & " c:\xcatpost\" & pname & " " & pargs
 | 
			
		||||
 | 
			
		||||
loghandler.WriteLine "=========================================="
 | 
			
		||||
loghandler.WriteLine now
 | 
			
		||||
loghandler.WriteLine "Run script: " & pname & " " & pargs
 | 
			
		||||
 | 
			
		||||
'Run command
 | 
			
		||||
'WScript.echo cmdname
 | 
			
		||||
Set output = myshell.Exec(cmdname)
 | 
			
		||||
 | 
			
		||||
' Handle the output from the script
 | 
			
		||||
Do While Not output.StdOut.AtEndOfStream
 | 
			
		||||
      fline = output.StdOut.ReadLine()
 | 
			
		||||
      loghandler.WriteLine fline
 | 
			
		||||
Loop
 | 
			
		||||
 | 
			
		||||
loghandler.WriteLine "The return code is: " & output.ExitCode
 | 
			
		||||
loghandler.WriteLine ""
 | 
			
		||||
 | 
			
		||||
loghandler.Close
 | 
			
		||||
							
								
								
									
										122
									
								
								xCAT/winpostscripts/xcatwinpost.vbs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								xCAT/winpostscripts/xcatwinpost.vbs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
			
		||||
'This script is used to run postscripts for Windows compute node
 | 
			
		||||
Dim filesys, myshell
 | 
			
		||||
Dim nodename, origpostscript, mypostscript, mypostbootscript
 | 
			
		||||
Dim output, tmpstr, startpoint
 | 
			
		||||
Dim fileread, filewrite, filewritepost, filewritepostboot, fline
 | 
			
		||||
Dim flagwp, flagwpb
 | 
			
		||||
Dim logname,loghandler
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
'Ingore the error box to avoid the stop of postscript running
 | 
			
		||||
On Error Resume Next
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
logname = "c:\xcatpost\xcat.log"
 | 
			
		||||
 | 
			
		||||
'Initialize the shell and fs objects
 | 
			
		||||
Set myshell = WScript.createObject("WScript.Shell")
 | 
			
		||||
Set filesys = CreateObject("Scripting.FileSystemObject")
 | 
			
		||||
 | 
			
		||||
'Open the log file for writting
 | 
			
		||||
Set loghandler = filesys.OpenTextFile(logname, 8, True)
 | 
			
		||||
loghandler.WriteLine "=========================================="
 | 
			
		||||
loghandler.WriteLine now
 | 
			
		||||
loghandler.WriteLine "Get in xcatwinpost.vbs"
 | 
			
		||||
 | 
			
		||||
'Read envrironment variables from c:\xcatpost\xcatenv
 | 
			
		||||
Set fileread = filesys.OpenTextFile("c:\xcatpost\xcatenv",1)
 | 
			
		||||
Do Until fileread.AtEndOfStream
 | 
			
		||||
    fline = fileread.ReadLine
 | 
			
		||||
    strpoint = InStr(fline, "NODENAME=")
 | 
			
		||||
    If strpoint Then
 | 
			
		||||
        nodename = Mid(fline, strpoint+9)
 | 
			
		||||
    End If
 | 
			
		||||
Loop
 | 
			
		||||
loghandler.WriteLine "The nodename is: " & nodename
 | 
			
		||||
 | 
			
		||||
'Get the postscripts from xCAT management
 | 
			
		||||
origpostscript = "c:\xcatpost\mypostscript." & nodename
 | 
			
		||||
mypostscript = "c:\xcatpost\mypostscript.cmd"
 | 
			
		||||
mypostbootscript = "c:\xcatpost\mypostbootscript.cmd"
 | 
			
		||||
 | 
			
		||||
' Debug
 | 
			
		||||
'WScript.echo "orig mypostscript"& origpostscript
 | 
			
		||||
 | 
			
		||||
'Check the existence of mypostscript file
 | 
			
		||||
If NOT filesys.FileExists(origpostscript) Then
 | 
			
		||||
   loghandler.WriteLine "Cannot find the original mypostscript: " & origpostscript
 | 
			
		||||
   loghandler.Close
 | 
			
		||||
   'WScript.echo "QUIT"
 | 
			
		||||
   WScript.quit [1]
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
'Create mypostscript and mypostbootscript from original postscript which was copied from xCAT MN
 | 
			
		||||
Set fileread = filesys.OpenTextFile(origpostscript, 1)
 | 
			
		||||
 | 
			
		||||
Set filewritepost = filesys.OpenTextFile(mypostscript, 2, True)
 | 
			
		||||
Set filewritepostboot = filesys.OpenTextFile(mypostbootscript, 2, True)
 | 
			
		||||
 | 
			
		||||
flagwp = 0
 | 
			
		||||
flagwpb = 0
 | 
			
		||||
Do Until fileread.AtEndOfStream
 | 
			
		||||
    fline = fileread.ReadLine
 | 
			
		||||
 | 
			
		||||
    If InStr(fline, "|") Then
 | 
			
		||||
        ' Ignore the char |
 | 
			
		||||
        ' Do nothing
 | 
			
		||||
    ElseIf InStr(fline, "osimage-postscripts-start-here") Or InStr(fline, "node-postscripts-start-here") Then
 | 
			
		||||
        flagwp = 1
 | 
			
		||||
    ElseIf InStr(fline, "osimage-postscripts-end-here") Or InStr(fline, "node-postscripts-end-here") Then
 | 
			
		||||
        flagwp = 0
 | 
			
		||||
    ElseIf InStr(fline, "osimage-postbootscripts-start-here") Or InStr(fline, "node-postbootscripts-start-here") Then
 | 
			
		||||
        flagwpb = 1
 | 
			
		||||
    ElseIf InStr(fline, "osimage-postbootscripts-end-here") Or InStr(fline, "node-postbootscripts-end-here") Then
 | 
			
		||||
        flagwpb = 0
 | 
			
		||||
    ElseIf InStr(fline, "=") Then
 | 
			
		||||
        ' Set the environment variables
 | 
			
		||||
        tmpstr = "Set "&fline
 | 
			
		||||
        ' Ignore the char '
 | 
			
		||||
        tmpstr = Replace(tmpstr, "'", "")
 | 
			
		||||
        filewritepost.WriteLine tmpstr
 | 
			
		||||
        filewritepostboot.WriteLine tmpstr
 | 
			
		||||
    ElseIf flagwp Then
 | 
			
		||||
        ' Run script with runpost.vbs
 | 
			
		||||
        fline = "c:\xcatpost\runpost.vbs " & fline
 | 
			
		||||
        filewritepost.WriteLine fline
 | 
			
		||||
    ElseIf flagwpb Then
 | 
			
		||||
        ' Run script with runpost.vbs
 | 
			
		||||
        fline = "c:\xcatpost\runpost.vbs " & fline
 | 
			
		||||
        filewritepostboot.WriteLine fline
 | 
			
		||||
    End If
 | 
			
		||||
Loop
 | 
			
		||||
 | 
			
		||||
fileread.Close
 | 
			
		||||
filewritepost.Close
 | 
			
		||||
filewritepostboot.Close
 | 
			
		||||
 | 
			
		||||
loghandler.WriteLine "mypostscript and mypostbootscript have been created"
 | 
			
		||||
 | 
			
		||||
'Generate the setup computed file which is used to initiate the running of postbootscripts
 | 
			
		||||
If NOT filesys.FolderExists("C:\Windows\Setup\Scripts\") Then
 | 
			
		||||
    filesys.CreateFolder("C:\Windows\Setup\Scripts\")
 | 
			
		||||
End If
 | 
			
		||||
 | 
			
		||||
'Open it with appending mode
 | 
			
		||||
set filewrite = filesys.OpenTextFile("C:\Windows\Setup\Scripts\SetupComplete.cmd", 8, True)
 | 
			
		||||
filewrite.WriteLine "cmd /c call " & mypostbootscript
 | 
			
		||||
filewrite.Close
 | 
			
		||||
 | 
			
		||||
loghandler.WriteLine "C:\Windows\Setup\Scripts\SetupComplete.cmd has been created."
 | 
			
		||||
 | 
			
		||||
loghandler.WriteLine "To run mypostscript"
 | 
			
		||||
loghandler.WriteLine ""
 | 
			
		||||
 | 
			
		||||
loghandler.Close
 | 
			
		||||
' Run mypostscript
 | 
			
		||||
Set myshell = WScript.createObject("WScript.Shell")
 | 
			
		||||
myshell.Run "cmd /c " & mypostscript, 0, True
 | 
			
		||||
'Do While Not output.StdOut.AtEndOfStream
 | 
			
		||||
'      fline = output.StdOut.ReadLine()
 | 
			
		||||
'      WScript.echo fline
 | 
			
		||||
'Loop
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user