'***************************************************************************************************************
'*                                    INTEL DISCLOSURE And COPYRIGHT INFORMATION                              '*
'*                                                                                                            '*  
'*                THIS DOCUMENT AND ALL INFORMATION PROVIDED HEREIN, INCLUDING CODE, IS PROVIDED              '*  
'*                "AS IS" WITH NO WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY,           '*
'*                NONINFRINGEMENT, FITNESS FOR ANY PARTICULAR PURPOSE, OR ANY WARRANTY OTHERWISE              '* 
'*                ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.                                       '*
'*                Intel disclaims all liability, including liability for infringement of any proprietary      '*
'*                rights, relating to use of information or code in this document.   Recipient may use        '*
'*                this document and all information herein, including code, but all such use is and shall     '*
'*                be at recipient's sole risk and subject to the disclaimers and limitations of liability     '*
'*                herein.  No other license, express or implied, by estoppel or otherwise, to any             '*  
'*                intellectual property rights is granted herein.                                             '*  
'*                Copyright (c) Intel Corporation 2008. *Third-party brands and names are                     '*  
'*                the property of their respective owners.                                                    '*  
                                                                                                       
'***************************************************************************************************************
' File               :     VLAN_CreateVlan.VBS
' Version           :     1.0
'
'  Purpose :   Used to create a VLAN on an Adapter
'                   
'
'  Arguments : VLAN_CreateVlan.vbs <AdapterIndex VlanID> [target username password] [help]
'
'               <AdapterIndex> - Index of the adapter to use
'               <VlanID>       - Number to assign the new VLAN
'               <remote>     - the name of a remote computer; requires the following:
'               <username>   - user name
'               <password>   - password
'
'
'  Instructions for use:
'  =====================
'  1) Execute script by invoking "cscript VLAN_CreateVlan.vbs" from the command line with arguments listed above
'  2) The common script library vbslib.vbs must be located in the same directory
'
'***************************************************************************************************************
   Option Explicit
   'On Error Resume Next
   Include "VBSLIB.vbs"

     Const SCRIPT_NAME = "VLAN_CreateVlan.vbs"
     Const SCRIPT_DESCRIPTION = "Used to create a VLAN on an Adapter"

     'Global variables
     Dim internalAdapterIndex, AdapterIndex
     Dim VlanID
     Dim Target, Username, Password
     Dim WbemServices
     Dim sError
     
     ' Check command line is correct
     If ParseCommandLine(AdapterIndex, VlanID, Target, Username, Password) = false then 
          PrintScriptHelp
          Wscript.Quit 0
     End if

     ' Connect
     If WMIConnect(WbemServices, "root\Intelncs2", Target, Username, Password, sError) = false then
          Wscript.Echo "Failed to connect to WMI namespace. " & VbNewLine
          wscript.echo "Make sure Intel(R) Network Connections software is installed."
          Wscript.Quit 0
     End if    

     ' We subtract 1 since the user is going to give an index based on 
     ' a 1-indexed array and the adapter array is 0-indexed 
     internalAdapterIndex = adapterIndex - 1

     dim AdapterSet
     'Declare new instance of cAdapters class
     Set AdapterSet = new cAdapters
          
     'Enumerate adapters using the Wbem handle obtained above 
     If AdapterSet.Enumerate (WbemServices, sError) = False Then
          Wscript.Echo "Failed to enumerate adapters. " & sError
          Wscript.Quit 0
     End If     
          
     ' Verify the adapter specified is a valid index, bail if not
     if (internalAdapterIndex < 0) then
          wscript.echo "Invalid adapter index. Adapter index must be greater than 0"
          wscript.quit 0
     end if

     if  (internalAdapterIndex >= AdapterSet.AdapterCount) then
          wscript.echo "Adapter index not found: " & adapterIndex
          wscript.quit 0
     end if

     dim adapter : set adapter = AdapterSet.GetAdapterInstance(internalAdapterIndex)

     ' Check that an adapter was returned
     if IsNothing(adapter) then
          wscript.echo "Failed to get adapter instance"
          wscript.quit 0
     end if

     wscript.echo adapterIndex & ") " & adapter.Name & ":" & VbNewLine

     wscript.echo "   Attempting to create VLAN..." & VbNewLine
     if CreateVlanOnDevice(WbemServices, adapter.DeviceInstance, "", VlanID, sError) then
          wscript.echo "   Successfully called to Create VLAN" & VlanID
     else
          wscript.echo "   Failed to create VLAN: " & sError
     end if

     wscript.Quit 0
          

     
'===================================================
' Function       : ParseCommandLine
' Purpose        : Evaluates command line arguments passed to the script and determines If they are correct
' Arguments      :     
'               
'               AdapterIndex - Index of the adapter to use
'               VlanID  - Number to assign the new VLAN
'               sTarget - the name of a remote computer
'               sUserName - the user name for remote auThentication
'               sPassword - the password for remote auThentication
'
' Returns :      True (If the command line has the correct format), False otherwise
' Notes   :      User name can be in the form of either a user name or a Domain\argUserName
'                    'Help' will return false - the script does not need to do anything else
'===================================================
Function ParseCommandLine (byref AdapterIndex, byref VlanID, byref sTarget, byref sUserName, byref sPassword)

     Err.Clear
     On Error Resume Next
     
     'Capture command line arguments
     Dim cmd_args : Set cmd_args = wscript.Arguments
     
     'Check number of command line arguments and exit If it is not correct
     Select Case cmd_args.count
          Case 1 
               ' if the only command line arg is 'help' return false so the script help will be displayed
               If instr(LCase(cmd_args(0)), "help") >= 0 Then
                    ParseCommandLine = false
                    Exit Function
               End If                         
               
          Case 2
               if not IsNumeric(cmd_args(0)) then 
                    ParseCommandLine = false
                    Exit Function
               end if

               if not IsNumeric(cmd_args(1)) then 
                    if UCASE(cmd_args(1)) <> "UNTAGGED" then
                         ParseCommandLine = false
                         Exit Function
                    end if
               else
                    if cmd_args(1) < 1 or cmd_args(1) > 4094 then
                         ParseCommandLine = false
                         Exit Function
                    end if 
               end if
               
               AdapterIndex = cmd_args(0)
               VlanID = cmd_args(1)
               sTarget = "."
               sUserName = ""
               sPassword = ""
               
               ParseCommandLine = true
               Exit Function
               
          Case 5
               if not IsNumeric(cmd_args(0)) then 
                    ParseCommandLine = false
                    Exit Function
               end if

               if not IsNumeric(cmd_args(1)) then 
                    if UCASE(cmd_args(1)) <> "UNTAGGED" then
                         ParseCommandLine = false
                         Exit Function
                    end if     
               else
                    if cmd_args(1) < 1 or cmd_args(1) > 4094 then
                         ParseCommandLine = false
                         Exit Function
                    end if 
               end if
               
               AdapterIndex = cmd_args(0)
               VlanID = cmd_args(1)
               sTarget = cmd_args(2) 
               sUsername = cmd_args(3) 
               sPassword = cmd_args(4)                
               
               ParseCommandLine = true
               Exit Function               
     End Select
     
     'Return failure
     ParseCommandLine = False
     
End Function
     

'===================================================
'       Sub : PrintScriptHelp
'   Purpose :  Prints command line help for the user
'                   on how to use this script
'===================================================
Sub PrintScriptHelp
                
     Wscript.Echo  "Usage :" & VbNewLine & VbNewLine &_
                         "  " & SCRIPT_NAME & " <AdapterIndex VlanID> [target username password] [help]" & VbNewLine & VbNewLine &_
                         "  Required: " & VbNewLine &_
                         "    " & AdapterIndexString & VbNewLine &_
                         "                   " & AdapterGetIndexString & VbNewLine & VbNewLine &_
                         "    " & VlanIdString & VbNewLine &_
                         "             	   Valid IDs: 1-4094 or 'Untagged'" & VbNewLine & VbNewLine &_
                         OptionalCmdLineArgsString


End Sub
     
' DO NOT REMOVE THIS FUNCTION
Function Include(vbsFile)

     Dim fso, ts, buf, path
     Set fso = CreateObject("Scripting.FileSystemObject")

     path = fso.GetParentFolderName (WScript.ScriptFullName) & "\" & vbsFile

     If fso.FileExists(path) Then  
          set ts = fso.OpenTextFile(path)
          buf = ts.ReadAll()
          ts.Close()
          Executeglobal buf
     Else
          Wscript.Echo "Unable to open include file: " & path
          Wscript.Quit 0
     End If

End function
