Mary
Mary

Reputation: 1

VBScript RegEx : Replace Content

I want to update the Unbound_DNS configuration file from a raw source but I can not get the desired result.

I would like to format each entry (each line):

address=/abc.com/0.0.0.0

To

local-zone: "abc.com" redirect
local-data: "abc.com 86400 IN A 0.0.0.0"

Here is what I did (thanks to hackoofr):

Option Explicit
Dim URL,Save2File,ws
If Not WScript.Arguments.Named.Exists("elevate") Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName _
    , """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1
    WScript.Quit
End If
URL = "https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt"
Set ws = CreateObject("wscript.Shell")
Save2File = ws.ExpandEnvironmentStrings("%Windir%\Temp\test")
Call Download(URL,Save2File)
'**********************************************************************************************
Sub Download(URL,Save2File)
    Dim File,Line,BS,ws,RegExp
    On Error Resume Next
    Set File = CreateObject("MSXML2.XMLHTTP")
    File.Open "GET",URL, False
    File.Send
    If err.number <> 0 then
        Line  = Line &  vbcrlf & "Error Getting File"
        Line  = Line &  vbcrlf & "Error " & err.number & "(0x" & hex(err.number) & ") " &  vbcrlf &_
        err.description
        Line  = Line &  vbcrlf & "Source " & err.source 
        MsgBox Line,vbCritical,"Error getting file"
        Err.clear
        wscript.quit
    End If
    If File.Status = 200 Then   
        '**********************************************************************************************
        ' Replace content for use with the file service.conf of soft Unbound_DNS
        '
        ' address=/abc.com/0.0.0.0      to      local-zone: "abc.com" redirect
        '                                       local-data: "abc.com 3600 IN A 0.0.0.0"
        '**********************************************************************************************
        Set RegExp = CreateObject("VBScript.RegExp")
        RegExp.IgnoreCase = True
        RegExp.Global = True
        RegExp.Pattern = "address=/(.*)/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})"       
        File.ResponseBody = RegExp.Replace(File.ResponseBody, "local-zone: \""$1\"" redirect $1" & ret & ">local-data: \""$1 3600 IN A $2\""")  
        Set RegExp = Nothing

        '**********************************************************************************************
        ' Write content 
        '**********************************************************************************************
        Set BS = CreateObject("ADODB.Stream")
        Set ws = CreateObject("wscript.Shell")
        BS.type = 1
        BS.open
        BS.Write File.ResponseBody
        BS.SaveToFile Save2File, 2

        '**********************************************************************************************
        ' Clean cache DNS
        '**********************************************************************************************
        wshShell.run("cmd /c psexec \\ -s ipconfig /flushdns >> & hostName,TRUE")
    ElseIf File.Status = 404 Then
        MsgBox "UpdateHostname.vbs : File Not Found : " & File.Status,vbCritical,"UpdateHostname.vbs : Error File Not Found"
    Else
        MsgBox "UpdateHostname.vbs : Unknown Error : " & File.Status,vbCritical,"UpdateHostname.vbs : Error getting file"
    End If
End Sub
'**********************************************************************************************

Thank you in advance for your help.

Edit 1: The content does not change. File.ResponseBody returns the content correctly, but no modification by the regexp!

Upvotes: 2

Views: 4879

Answers (2)

Mary
Mary

Reputation: 1

Here is the update of the code that works very well based on the response of @Gurman and the comment of @Ansgar Wiechers. Thank you for your help

Option Explicit
Dim File, objReg, strTest, RegExp, objMatches, objMatch, saveToFile, fso, outFile, strReplace, objShell, i
Set objShell = CreateObject("wscript.shell")
saveToFile = objShell.ExpandEnvironmentStrings("%windir%\Temp\test.txt")

Set File = CreateObject("MSXML2.XMLHTTP")
File.Open "GET","https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt", False
File.send

If File.Status = 200 Then   

    '**********************************************************************************************
    ' Replace content for use with the file service.conf of soft Unbound_DNS
    '
    ' address=/abc.com/0.0.0.0      to      local-zone: "abc.com" redirect
    '                                       local-data: "abc.com 86400 IN A 0.0.0.0"
    '**********************************************************************************************
    strTest = File.responseText

    Set RegExp = CreateObject("VBScript.RegExp")
    RegExp.IgnoreCase = True
    RegExp.Global = True
    RegExp.Pattern = "address=/(.*?)/(\d{1,3}(?:\.\d{1,3}){3})" 
    strReplace = "local-zone: ""$1"" redirect" & vbCrLf & "local-data: ""$1 86400 IN A $2"""

    strTest = RegExp.Replace(strTest, strReplace)  
    Set RegExp = Nothing

    '**********************************************************************************************
    ' Write content 
    '**********************************************************************************************
    Set fso = CreateObject("scripting.filesystemobject")
    Set outFile = fso.OpenTextFile(saveToFile,2,True)
    outFile.Write strTest
    outFile.Close
End If

Upvotes: 0

Gurmanjot Singh
Gurmanjot Singh

Reputation: 10360

Replace the following code:

Set RegExp = CreateObject("VBScript.RegExp")
RegExp.IgnoreCase = True
RegExp.Global = True
RegExp.Pattern = "address=/(.*)/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})"       
File.ResponseBody = RegExp.Replace(File.ResponseBody, "local-zone: \""$1\"" redirect $1" & ret & ">local-data: \""$1 3600 IN A $2\""")  
Set RegExp = Nothing

with this:

Dim objReg, strTest, objMatches, objMatch
Set objReg = New RegExp
strTest = File.ResponseBody                    'address=/abc.com/0.0.0.0
objReg.Global = True
objReg.Pattern = "address=/(.*?)/(\d{1,3}(?:\.\d{1,3}){3})"    'abc.com gets stored in Group 1 and the IP address gets stored in Group 2
Set objMatches = objReg.Execute(strTest)
For Each objMatch In objMatches
    strTest = "local zone: """ & objMatch.Submatches.Item(0) & """ redirect" & vbCrLf &_
              "local data: """ & objMatch.Submatches.Item(0) & " 86400 in A " & objMatch.Submatches.Item(1)&""""
Next
File.ResponseBody = strTest
set objReg = Nothing

Click for Regex Demo(in the demo, / is escaped by \)

Regex Explanation:

address=/(.*?)/(\d{1,3}(?:\.\d{1,3}){3})

  • address=/ - matches address=/ literally
  • (.*?) - matches 0+ occurrences of any character(except a newline), as few as possible. The parenthesis are used to capture this match as group 1
  • / - matches / literally
  • (\d{1,3}(?:\.\d{1,3}){3}) - matches a string of the pattern 12.222.212.33 and captures it in Group 2

Update:

Here is my final solution. From what I could understand from your code, you first get the response body from the server, modify and store the updated response in a file called test in the temp folder. Below is the code I have written to do the same thing. I have tested it on my system and the final output which gets stored in the C:\Windows\Temp\test.txt file looks correct as shown in the attached screenshot. Now, this may not be exactly what you want but you can get an idea from this. Store this code in a new vbs file and run it directly as it is.

Note: Since the response text from the server is very long, It takes a bit long to get executed. If you just want to see if it is working or not, uncomment the code inside the for loop. You will be able to see that you are getting the desired result for the first few URLs

Regex Demo

Option Explicit
Dim File, objReg, strTest, objMatches, objMatch, saveToFile, fso, outFile, strReplace, objShell, i
Set objShell = CreateObject("wscript.shell")
saveToFile = objShell.ExpandEnvironmentStrings("%windir%\Temp\test.txt")

Set File = CreateObject("MSXML2.XMLHTTP")
File.Open "GET","https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt", False
File.send

If File.Status = 200 Then   
    Set objReg = New RegExp
    strTest = File.responseText  'address=/abc.com/0.0.0.0
    objReg.Global = True
    objReg.Pattern = "address=/(.*?)/(\d{1,3}(?:\.\d{1,3}){3})"    'abc.com gets stored in Group 1 and the IP address gets stored in Group 2
    Set objMatches = objReg.Execute(strTest)
    For Each objMatch In objMatches
        strReplace = "local zone: """ & objMatch.Submatches.Item(0) & """ redirect" & vbCrLf &_
                     "local data: """ & objMatch.Submatches.Item(0) & " 86400 in A " & objMatch.Submatches.Item(1)&"""" & vbCrLf

        strTest = Replace(strTest,objMatch.Value,strReplace)

        'Uncomment the following code to see the result for the 1st 5 URLs, if the whole thing is taking too long to get executed
        'i=i+1
        'If(i>5) Then
        '   Exit for
        'End If
    Next
    set objReg = Nothing

    '**********************************************************************************************
    ' Write content 
    '**********************************************************************************************
    Set fso = CreateObject("scripting.filesystemobject")
    Set outFile = fso.OpenTextFile(saveToFile,2,True)
    outFile.Write strTest
    outFile.Close
End If

Output:

enter image description here

Upvotes: 4

Related Questions