[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 400
  • Last Modified:

VBS Script Help

Hello, we have a script that runs and collects some basic data on our servers.  
It has been producing the error in the screen shot, but i am not sure why.  It had been working fine until recently; i removed some servers from line 14 that no longer exisit and added a few new ones, nothing else was chagned.  After doing that i know get the error in screen shot; the account using this is a domain admin and all servers are domain members.  I have very limited scripting knowledge.  Any help is appreciated.
This is the script
'========================
'
' Title: Automate Daily Server Checks v4
'
' Filename: servchk4.vbs
' Author: Ariston Collander, Cox Computer Service
' Date: 07/16/2004
' Installed on Norman
'========================

'User defined Variables - Modify as needed
CurrentDate = Now
company = "Winchester Electronics Corporation"
servers =

Array("1Citrix","2Citrix","3Citrix","4Citrix","Asigra","Control","Controller","Controll_II","COntroller-ma","controller-ng",

"CRM","Ghost","Index","Innovate","Insite","Insite_II","Landru","Lore","Microcall","Monarch","Minuette","Norman","PDM","Posta

ge_2","SL8-SQL","SL8-Utility","Sonny","SQL","SpSql","SpWeb","USFRKAP01","Unity","Virtual-center","Websense","WSUS","Xanthu")
resultsfile = "\\norman\servers\" & FormatDateTime(CurrentDate, vbLongDate) & ".htm "
'Key path is designed only for Symantec Antivirus, modify as needed
'strKeyPath = "c:\test"
strValueName = "DEFWATCH_10"

'System variables - DO NOT CHANGE
Const HKEY_LOCAL_MACHINE = &H80000002
ForWriting = 2
forReading = 1
forWriting = 2
forAppending = 8

CutOff = Date() - 1

Set fs = WScript.CreateObject("Scripting.FileSystemObject")

'Create the htm file with header
Set res = fs.CreateTextFile(resultsfile, True)
res.Writeline ("<html>")
res.Writeline ("<br>")
res.Writeline ("<h1>Server Summary for " & company & " on: <font color='#000080'>" & date() & "</font></h1>")
res.Writeline ("<b>Provided by Information Technology</b>")

'Loop through the array of servers
'Perform checks on each server
For each server in servers
strserver = server
checks(strserver)
Next

'Script complete
res.Writeline ("</html>")

'//////////////////
'FUNCTIONS
'//////////////////

'Entry point for server checks
Function checks (strserver)

'Run the checks
chkdiskspace (strserver)
chkopsys(strserver)
chkservices(strserver)


End Function 'end function checks
'//////////////////

'Check operating system and service pack
'Check for available memory
Function chkopsys (strserver)
Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")

Set colopsys = objWMIService.ExecQuery _
("Select Caption, CSDVersion, FreePhysicalMemory from Win32_OperatingSystem")

res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#C0C0C0 width=27% align=left><font face=Verdana color=#000080 size=1>Operating

System</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 width=16% align=left><font face=Verdana color=#000080 size=1>Service Pack</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Free Memory</font></th>")
res.Writeline ("</tr>")

For each objopsys in colopsys
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>" & objopsys.Caption & "</font></TD>")
if objopsys.CSDVersion = "" then
spver = "None"
else
spver = objopsys.CSDVersion
End If
res.Writeline ("<TD><font face=Verdana color=#000080 size=1>" & spver & "</font></TD>")
res.Writeline ("<TD><font face=Verdana color=#000080 size=1>" & objopsys.FreePhysicalMemory & "K</font></TD></TR>")
Next

End Function 'End function chkopsys
'//////////////////

'Check for stopped services
Function chkservices (strserver)
Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")

Set colsvc = objWMIService.ExecQuery _
("Select * from Win32_Service Where StartMode = 'Auto'")

res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Summary of Running

Services</font></th>")
res.Writeline ("</tr>")

For each objsvc in colsvc
if objsvc.State = "Stopped" Then
serviceerr = "failed"
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>" & objsvc.DisplayName & " service is not

running</font></TD>")
else
End If
Next

if serviceerr = "failed" then
else
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>All Services are running</font></TD>")
End If
res.Writeline ("</table>")
End Function 'End function chkservices

'//////////////////

'Convert WMI Date to standard Date
Function WMIDateStringToDate(dtmDate)
WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
& " " & Mid (dtmDate, 9, 2) & ":" & _
Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate, _
13, 2))
End Function

'//////////////////
'SUBROUTINES
'//////////////////

'Check available disk space
Sub chkdiskspace (strserver)
Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")

Set colDisks = objWMIService.ExecQuery _
("Select * from Win32_LogicalDisk where DriveType = 3")

res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#000080 colspan=3 width=100%>")
res.Writeline ("<p align=left>")
res.Writeline ("<b><font face=Verdana size=3 color=#FFFFFF>System Summary for " & strserver & "</font></b></p>")
res.Writeline ("</th>")
res.Writeline ("</tr>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#C0C0C0 width=11% align=left><font face=Verdana color=#000080 size=1>Disk ID</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 width=16% align=left><font face=Verdana color=#000080 size=1>Percentage Free

Space</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Free Space</font></th>")
res.Writeline ("</tr>")

For each objDisk in colDisks
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1> " & objDisk.Name & "</font></TD>")
if (objDisk.Freespace/objDisk.Size)*100 <=15 then
fontcol = "#FF0000"
else
fontcol = "#00FF00"
End If
res.Writeline ("<TD><font face=Verdana color=" & fontcol & " size=1>" & (objDisk.Freespace/objDisk.Size)*100

"</font></TD>")
res.Writeline ("<TD><font face=Verdana color=" & fontcol & " size=1>" & objDisk.Freespace/1048576 & "MB</font></TD></TR>")
Next
End sub 'End function chkdiskspace

'//////////////////


error.jpg
0
SVT_Cobra_96
Asked:
SVT_Cobra_96
  • 8
  • 7
  • 3
3 Solutions
 
Chris BottomleyCommented:
Possibly surplus hard return:

try

Chris
'========================
'
' Title: Automate Daily Server Checks v4
'
' Filename: servchk4.vbs
' Author: Ariston Collander, Cox Computer Service
' Date: 07/16/2004
' Installed on Norman 
'========================

'User defined Variables - Modify as needed
CurrentDate = Now
company = "Winchester Electronics Corporation"
servers = 

Array("1Citrix","2Citrix","3Citrix","4Citrix","Asigra","Control","Controller","Controll_II","COntroller-ma","controller-ng","CRM","Ghost","Index","Innovate","Insite","Insite_II","Landru","Lore","Microcall","Monarch","Minuette","Norman","PDM","Postage_2","SL8-SQL","SL8-Utility","Sonny","SQL","SpSql","SpWeb","USFRKAP01","Unity","Virtual-center","Websense","WSUS","Xanthu")
resultsfile = "\\norman\servers\" & FormatDateTime(CurrentDate, vbLongDate) & ".htm "
'Key path is designed only for Symantec Antivirus, modify as needed
'strKeyPath = "c:\test"
strValueName = "DEFWATCH_10"

'System variables - DO NOT CHANGE
Const HKEY_LOCAL_MACHINE = &H80000002
ForWriting = 2
forReading = 1
forWriting = 2
forAppending = 8

CutOff = Date() - 1

Set fs = WScript.CreateObject("Scripting.FileSystemObject")

'Create the htm file with header
Set res = fs.CreateTextFile(resultsfile, True)
res.Writeline ("<html>")
res.Writeline ("<br>")
res.Writeline ("<h1>Server Summary for " & company & " on: <font color='#000080'>" & date() & "</font></h1>")
res.Writeline ("<b>Provided by Information Technology</b>")

'Loop through the array of servers
'Perform checks on each server
For each server in servers
strserver = server
checks(strserver)
Next

'Script complete
res.Writeline ("</html>")

'//////////////////
'FUNCTIONS
'//////////////////

'Entry point for server checks
Function checks (strserver)

'Run the checks
chkdiskspace (strserver)
chkopsys(strserver)
chkservices(strserver)


End Function 'end function checks
'//////////////////

'Check operating system and service pack
'Check for available memory
Function chkopsys (strserver)
Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")

Set colopsys = objWMIService.ExecQuery _
("Select Caption, CSDVersion, FreePhysicalMemory from Win32_OperatingSystem")

res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#C0C0C0 width=27% align=left><font face=Verdana color=#000080 size=1>Operating 

System</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 width=16% align=left><font face=Verdana color=#000080 size=1>Service Pack</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Free Memory</font></th>")
res.Writeline ("</tr>")

For each objopsys in colopsys
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>" & objopsys.Caption & "</font></TD>")
if objopsys.CSDVersion = "" then
spver = "None"
else
spver = objopsys.CSDVersion
End If
res.Writeline ("<TD><font face=Verdana color=#000080 size=1>" & spver & "</font></TD>")
res.Writeline ("<TD><font face=Verdana color=#000080 size=1>" & objopsys.FreePhysicalMemory & "K</font></TD></TR>")
Next

End Function 'End function chkopsys
'//////////////////

'Check for stopped services
Function chkservices (strserver)
Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")

Set colsvc = objWMIService.ExecQuery _
("Select * from Win32_Service Where StartMode = 'Auto'")

res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Summary of Running 

Services</font></th>")
res.Writeline ("</tr>")

For each objsvc in colsvc
if objsvc.State = "Stopped" Then
serviceerr = "failed"
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>" & objsvc.DisplayName & " service is not 

running</font></TD>")
else
End If
Next

if serviceerr = "failed" then
else
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>All Services are running</font></TD>")
End If
res.Writeline ("</table>")
End Function 'End function chkservices

'//////////////////

'Convert WMI Date to standard Date
Function WMIDateStringToDate(dtmDate)
WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
& " " & Mid (dtmDate, 9, 2) & ":" & _
Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate, _
13, 2))
End Function

'//////////////////
'SUBROUTINES
'//////////////////

'Check available disk space
Sub chkdiskspace (strserver)
Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")

Set colDisks = objWMIService.ExecQuery _
("Select * from Win32_LogicalDisk where DriveType = 3")

res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#000080 colspan=3 width=100%>")
res.Writeline ("<p align=left>")
res.Writeline ("<b><font face=Verdana size=3 color=#FFFFFF>System Summary for " & strserver & "</font></b></p>")
res.Writeline ("</th>")
res.Writeline ("</tr>")
res.Writeline ("<tr>")
res.Writeline ("<th bgcolor=#C0C0C0 width=11% align=left><font face=Verdana color=#000080 size=1>Disk ID</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 width=16% align=left><font face=Verdana color=#000080 size=1>Percentage Free 

Space</font></th>")
res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Free Space</font></th>")
res.Writeline ("</tr>")

For each objDisk in colDisks
res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1> " & objDisk.Name & "</font></TD>")
if (objDisk.Freespace/objDisk.Size)*100 <=15 then
fontcol = "#FF0000"
else
fontcol = "#00FF00"
End If
res.Writeline ("<TD><font face=Verdana color=" & fontcol & " size=1>" & (objDisk.Freespace/objDisk.Size)*100 & 

"</font></TD>")
res.Writeline ("<TD><font face=Verdana color=" & fontcol & " size=1>" & objDisk.Freespace/1048576 & "MB</font></TD></TR>")
Next
End sub 'End function chkdiskspace

'//////////////////

Open in new window

0
 
SVT_Cobra_96Author Commented:
i selected all and copied to a new file.  When i ran it i had to adjust line 14, it copied with extra spaces.  Once i fixed that it seems to have gotten further, but errors at line 74.  See attached
error.jpg
0
 
Chris BottomleyCommented:
Which is line 74 in the posted script above?

Chris
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
SVT_Cobra_96Author Commented:
res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
0
 
Chris BottomleyCommented:
That can't be ... that line only has about 70 characters so it us not the line 74 in your file as is

Chris
0
 
Chris BottomleyCommented:
See lines 76-78 that looks guilty!

Use as below


res.Writeline ("<th bgcolor=#C0C0C0 width=27% align=left><font face=Verdana color=#000080 size=1>Operating System</font></th>") 

Open in new window

0
 
rejoinderCommented:
Can you see if this gets through your list of machines...
'========================
'
' Title: Automate Daily Server Checks v4
'
' Filename: servchk4.vbs
' Author: Ariston Collander, Cox Computer Service
' Date: 07/16/2004
' Installed on Norman 
'========================

'User defined Variables - Modify as needed
CurrentDate = Now
company = "Winchester Electronics Corporation"
servers = Array("1Citrix","2Citrix","3Citrix","4Citrix","Asigra","Control","Controller","Controll_II","COntroller-ma","controller-ng","CRM","Ghost","Index","Innovate","Insite","Insite_II","Landru","Lore","Microcall","Monarch","Minuette","Norman","PDM","Postage_2","SL8-SQL","SL8-Utility","Sonny","SQL","SpSql","SpWeb","USFRKAP01","Unity","Virtual-center","Websense","WSUS","Xanthu")

resultsfile = "\\norman\servers\" & FormatDateTime(CurrentDate, vbLongDate) & ".htm "
'Key path is designed only for Symantec Antivirus, modify as needed
'strKeyPath = "c:\test"

'System variables - DO NOT CHANGE
Const HKEY_LOCAL_MACHINE = &H80000002
ForWriting = 2
forReading = 1
forWriting = 2
forAppending = 8

CutOff = Date() - 1

Set fs = WScript.CreateObject("Scripting.FileSystemObject")

'Create the htm file with header
Set res = fs.CreateTextFile(resultsfile, True)
res.Writeline ("<html>")
res.Writeline ("<br>")
res.Writeline ("<h1>Server Summary for " & company & " on: <font color='#000080'>" & date() & "</font></h1>")
res.Writeline ("<b>Provided by Information Technology</b>")

'Loop through the array of servers
'Perform checks on each server
For each server in servers
	strserver = server
	checks(strserver)
Next

'Script complete
res.Writeline ("</html>")

'//////////////////
'FUNCTIONS
'//////////////////

'Entry point for server checks
Function checks (strserver)
	'Run the checks
	chkdiskspace (strserver)
	chkopsys(strserver)
	chkservices(strserver)
End Function 'end function checks
'//////////////////

'Check operating system and service pack
'Check for available memory
Function chkopsys (strserver)
	on error resume next

	Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")
	Set colopsys = objWMIService.ExecQuery ("Select Caption, CSDVersion, FreePhysicalMemory from Win32_OperatingSystem")

	res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
	res.Writeline ("<tr>")
	res.Writeline ("<th bgcolor=#C0C0C0 width=27% align=left><font face=Verdana color=#000080 size=1>Operating System</font></th>")
	res.Writeline ("<th bgcolor=#C0C0C0 width=16% align=left><font face=Verdana color=#000080 size=1>Service Pack</font></th>")
	res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Free Memory</font></th>")
	res.Writeline ("</tr>")

	For each objopsys in colopsys
		res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>" & objopsys.Caption & "</font></TD>")
		if objopsys.CSDVersion = "" then
			spver = "None"
		else
			spver = objopsys.CSDVersion
		End If
		res.Writeline ("<TD><font face=Verdana color=#000080 size=1>" & spver & "</font></TD>")
		res.Writeline ("<TD><font face=Verdana color=#000080 size=1>" & objopsys.FreePhysicalMemory & "K</font></TD></TR>")
	Next

End Function 'End function chkopsys
'//////////////////

'Check for stopped services
Function chkservices (strserver)
	on error resume next

	Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")
	Set colsvc = objWMIService.ExecQuery ("Select * from Win32_Service Where StartMode = 'Auto'")

	res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
	res.Writeline ("<tr>")
	res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Summary of Running Services</font></th>")
	res.Writeline ("</tr>")
	
	For each objsvc in colsvc
		if objsvc.State = "Stopped" Then
			serviceerr = "failed"
			res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>" & objsvc.DisplayName & " service is not running</font></TD>")
		else
		End If
	Next

	if serviceerr = "failed" then
	else
		res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1>All Services are running</font></TD>")
	End If
	res.Writeline ("</table>")
End Function 'End function chkservices

'//////////////////

'Convert WMI Date to standard Date
Function WMIDateStringToDate(dtmDate)
	WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate, 13, 2))
End Function

'//////////////////
'SUBROUTINES
'//////////////////

'Check available disk space
Sub chkdiskspace (strserver)
	on error resume next

	Set objWMIService = GetObject("winmgmts:\\" & strserver & "\root\cimv2")
	Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk where DriveType = 3")

	res.Writeline ("<table BORDER=1 width=100% cellspacing=0 cellpadding=1>")
	res.Writeline ("<tr>")
	res.Writeline ("<th bgcolor=#000080 colspan=3 width=100%>")
	res.Writeline ("<p align=left>")
	res.Writeline ("<b><font face=Verdana size=3 color=#FFFFFF>System Summary for " & strserver & "</font></b></p>")
	res.Writeline ("</th>")
	res.Writeline ("</tr>")
	res.Writeline ("<tr>")
	res.Writeline ("<th bgcolor=#C0C0C0 width=11% align=left><font face=Verdana color=#000080 size=1>Disk ID</font></th>")
	res.Writeline ("<th bgcolor=#C0C0C0 width=16% align=left><font face=Verdana color=#000080 size=1>Percentage Free Space</font></th>")
	res.Writeline ("<th bgcolor=#C0C0C0 align=left><font face=Verdana color=#000080 size=1>Free Space</font></th>")
	res.Writeline ("</tr>")

	For each objDisk in colDisks
		res.Writeline ("<TR><TD><font face=Verdana color=#000080 size=1> " & objDisk.Name & "</font></TD>")
		if (objDisk.Freespace/objDisk.Size)*100 <=15 then
			fontcol = "#FF0000"
		else
			fontcol = "#00FF00"
		End If
		res.Writeline ("<TD><font face=Verdana color=" & fontcol & " size=1>" & (objDisk.Freespace/objDisk.Size)*100 & "</font></TD>")
		res.Writeline ("<TD><font face=Verdana color=" & fontcol & " size=1>" & objDisk.Freespace/1048576 & "MB</font></TD></TR>")
	Next
End sub 'End function chkdiskspace

'//////////////////

Open in new window

0
 
SVT_Cobra_96Author Commented:
the second script gave me the same error as the first.   (line 32; char 1; permission denied, ect...)
0
 
rejoinderCommented:
Do you have permission to create/edit a file in the folder "\\norman\servers\"?  Does the server have that share name?
On line 32, if you chage the folder to point to a location where you have write access this script will run.  Tested it here and it worked :-)
0
 
SVT_Cobra_96Author Commented:
the share does exist and domain admins has full control (i am using a domaiin admin account).  I will try to change the path just for kicks and see what happens.  i will let you know in a bit.
thanks
0
 
rejoinderCommented:
My fingers are crossed.  

You might want to check that the file "January 5, 2009.htm" does not exist before running the script.  Perhaps the file is locked and is not allowing you to overwrite it.
0
 
Chris BottomleyCommented:
Did you correct 76:78? and how far did get after that change

Chris
0
 
SVT_Cobra_96Author Commented:
Chris the second file does work for me now.  Rejoinder was write, the file was locked even though it wasnt open.  Once i was closed the session to it the script was able to successfully run - thank you both :)
0
 
SVT_Cobra_96Author Commented:
Guys i meant to split the points between you and got side tracked and screwed it up, i am going to see if a mod can correct it.
Sorry...
0
 
Chris BottomleyCommented:
I have no idea why my script change was not considered after all it took you past the original failure so at the very least ought to have been acceptable in part.

Disappointing to say the least.

Chris
0
 
Chris BottomleyCommented:
Ah that explains that sorry!
0
 
SVT_Cobra_96Author Commented:
i posted in the community support for a mod.  sorry about that, hopefully it should be straigtened out shortly.
0
 
SVT_Cobra_96Author Commented:
Should be set now, thanks for the help guys.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 8
  • 7
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now