• Category Archives Server administration
  • Technology » Server administration » Azure
  • Using PuTTY with Jaws 18.

    Please be aware that I don’t recommend that you use PuTTY exclusively for SSH access. Especially in Windows 10. There are a number of better alternatives out there at this point for most day to day use. I’ll add links to one or two below. However, there are times when PuTTY or Putty as it’s pronounced is just the best tool for the job so it’s important that you can get some feedback from Jaws.

    Note as of 26th October 2017

    Please note that this post is now out of date. You should use these fantastic PuTTY scripts instead as they provide much more complete functionality.

    I had posted a script before that worked with previous versions of Jaws and in fact, it would probably work with Jaws 18 as well but the SayNonHighlightedText function in Jaws 18 has been updated so it’s only right that I tweak it slightly and publish it here to be used in a PuTTY.jss file.

    Here’s the code:

    Include “HjGlobal.jsh” ; default HJ global variables
    Include “hjconst.jsh” ; default HJ constants
    Include “HjHelp.jsh” ; Help Topic Constants
    Include “common.jsm” ; message file
    include “MSAAConst.jsh”
    include “UIA.jsh”

    const
    NavigationByLineTickThreshold = 200
    globals
    int LastLineNavigationTick

    Void Function SayNonHighlightedText (handle hwnd, string buffer)
    ; NonHighlightedText Function for speaking all newly written nonhighlighted
    ; text.
    If GetScreenEcho () > ECHO_NONE
    && hWnd == GetFocus()
    If GetWindowClass(GetFocus()) == “PuTTY”
    && GetTickCount()-LastLineNavigationTick > NavigationByLineTickThreshold
    ;New text should be spoken only if it is not a result of navigation by line.
    ;This prevents double speaking when navigating through a command history,
    ;since the SayLineUnit will already have spoken the new text.
    Say(buffer, OT_NONHIGHLIGHTED_SCREEN_TEXT)
    ;Now clear LastLineNavigationTick, just in case more new text appears shortly after the navigation.
    LastLineNavigationTick = 0
    Return
    endIf
    endIf
    if (GetScreenEcho() > 1) then
    Say (buffer, OT_NONHIGHLIGHTED_SCREEN_TEXT)
    endIf
    EndFunction

    There are a number of great alternatives to PuTTY.
    Over on Git Hub, Microsoft have a rather nice SSH Powershell module that provides a method of accessing an OpenSSH server on Linux from within Powershell.
    The best way to use SSH on Windows in my opinion is to install Git. Be sure that you choose to make git features available from the command line so that you can use SSH without starting the Git Bash shell first.
    Lastly, another really good option if you are using Windows 10 is to install Bash or Linux for Windows. This is an add on that you can install from within Programs and Features\Windows Features.

    There are now more ways than ever to access your Linux servers over SSH from within Windows. Have fun!


  • A skype chat with Nicky Kealy discussing and exploring some of the latest tech news and events.

     

    | Open Player in New Window


    There is a lot happening in the tech world at the moment. Some good, some not so good and some that’s just very interesting.
    In this podcast we discuss:

    • Satya Nadella, the CEO of Microsoft visited the ST. Patrick’s campus of DCU where I work a week ago. I got to speak to him briefly about accessibility and inclusion in education.
    • Elon Musk thinks we’ll be in mars by 2022. Do you agree? Is he a visionary or a mad man? All his efferts seem to be connected to autonomy and sustainable power so here’s hoping.Another organization Mars one thinks we’ll be ready by 2027. What do you think?
    • Speaking of self driving cars, we discuss the potential assistive technology requirements of a blind person using a self driving car.
    • Facebook’s Mark Zukkerburg was live for about half an hour yesterday while he was preparing dinner. Yet he had eighty three to eighty six thousand viewers. Why! How!
    • We discuss augmented reality and AI. Where could it be in 5 years.

    Listen to this tech review with special guest Nicky Kealy.
    Thanks to my special guest Nicky Kealy for helping with this podcast.


  • VMware Fix for Call “HostDatastoreSystem.QueryVmfsDatastoreCreateOptions” for object “ha-datastoresystem” on ESXi failed

    While installing ESXI 6 update 2 on a Dell R410 I found that I could not create a datastore using the VSphere UI. assumed this was something to do with the Windows partition that was previously used on that disk so I decided I’d drop back into the CLI and delete the existing partition manually.

    Here’s how you do this:

    1. Open VSphere.
    2. Go to Configuration
    3. Click Security templates on the left
    4. Click Properties
    5. Select SSH
    6. Click Options
    7. Click start
    8. Connect to your host using PuTTY or any other SSH client
    9. Move to the /dev/disks directory

      cd /dev/disks/

    10. List the files here

      ls

    11. Match the identifier with the datastore that you cant create in VSphere.
      For example: naa.6d4ae5208f875700172a910c5402c983
    12. Run partedUtil to delete that partition.

      partedUtil mklabel /dev/disks/naa.6d4ae5208f875700172a910c5402c983 msdos

    13. Go back into VSphere and create the datastore.
    14. Now disable the SSH service to clean up and close the security vulnerability that you’ve opened.

    I hope that helps someone. It worked for me perfectly.


  • Logon script to migrate users to a new file server and remove and recreate mapped network drives

    I’m migrating a few hundred users over to a new file server.

    The paths will be different. It’s not just the server name that’s changing.

    1. I have run into several problems.
    2. Although I’m a domain admin, I don’t have access to most of the folders. In the worst case scenario I need to take ownership to gain access.
    3. Inheritance is disabled on some of the sub folders.
    4. Permissions are sometimes configured on the fifth or even tenth sub folder.
    5. There are drive paths distributed using group policy but 99% of the paths are mapped directly on the PC.
    6. Five minutes of down time causes untold problems.
    7. The tool that is used to replicate the files isn’t replicating the permissions in all cases. It is also having the same problem that I’m encountering in terms of access to some files and folders.
    8. Permissions aren’t given to groups. Each person is added to the folder directly.
    9. There are often eight different drive maps. Some of these are even pointing to duplicate locations.

    Here’s what I’ve tried.

    1. Section shares will be mapped to S. However, the policy is set to update. IT isn’t changing locally mapped drives. This is ok. It allows users to come to support if they can’t access their files. The benefit of this is support are noting down what S was previously mapped to.
    2. I’m using powershell to level the permissions on all sub directories.
    3. I’m talking to section heads to determine the permissions that each person needs.
    4. I’m adding these people to groups based on the section and directory name and applying access to the group.
    5. I’m marking the old files as hidden. Mainly so that if someone continues using the old path they will think the drive is empty. That will result in a call to support where they can tell the user to use the new drive and then also delete the old map.

    There are far too many manual steps in this.

    There’s also too many remaining drive maps that aren’t needed.

    Here is what the script does to automate most of these manual steps.
    This is run at log in and targets one or more groups.

    1. List the currently mapped network drives.
    2. Check the groups that the user is a member of.
    3. Remove all drive maps
    4. Map drives based on assigned groups.
    5. Show a message to the user to inform them that the migration has completed.

    The main remaining problem is that if I move Drive Q that is used by ApplicationX to the letter Y, all the users who used the old letter will probably have problems opening files. There’s nothing I can really do about this. However, so far, the instances where this has been encountered has been managed easily by support.

    One choice I also made was to remove all existing permissions from the folder and reapply the permissions on the new file server so that only groups that should have access are applied to each folder. Of course, this requires that staff speak to their section heads to in turn ask me for access but this removes the potential that people have access to folders that they no longer need. It also helps to promote a more structured method of processing access requests. I could implement a form for tracking these requests but this overhead would be justifiably resisted by section heads.

    The script follows:

    Option Explicit
    Dim objShell,grouplistD,ADSPath,userPath,listGroup,WshNetwork,objFSO,objFile,strComputer,objWMIService,IPConfigSet,strIPAddress,colItems,strDrives,mappedDrives,objNetwork,x
    dim objTS, sReadLine, bReturn, strOutputFile, RunBefore, WshShell, IPConfig,i,objItem, objOutputFile
    strOutputFile = “\\spd-adc01.spd.dcu.ie\RemainingComputer\SharedFolders.txt”
    On Error Resume Next
    Set objShell = CreateObject(“WScript.Shell”)
    Const ForAppending = 8
    Set WshShell = CreateObject(“WScript.Shell”)
    Set WshNetwork = CreateObject(“WScript.Network”)
    Set objFSO = CreateObject(“Scripting.FileSystemObject”)
    Set objFile = objFSO.OpenTextFile(strOutputFile, ForAppending)

    ScriptNotRunBefore
    if (RunBefore = “False”) Then
    objFile.WriteLine WshNetwork.ComputerName & “,” & WshNetwork.UserName & “,” & GetIpAddress & “,” & GetMappedNetworkDrives

    DeleteMappedDrives
    If isMember(“SPD President”) Then
    MapPresidentsDrive
    End If
    End If
    objFile.Close

    Function GetIPAddress
    strComputer = “.”
    Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
    Set IPConfigSet = objWMIService.ExecQuery _
    (“Select IPAddress from Win32_NetworkAdapterConfiguration WHERE IPEnabled = ‘True'”)

    For Each IPConfig in IPConfigSet
    If Not IsNull(IPConfig.IPAddress) Then
    For i = LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    If Not Instr(IPConfig.IPAddress(i), “:”) > 0 Then
    strIPAddress = strIPAddress & IPConfig.IPAddress(i) & ” ”
    End If
    Next
    End If
    Next
    GetIPAddress = strIPAddress
    End Function

    Function GetMappedNetworkDrives
    On Error Resume Next
    strComputer = “.”
    Set objWMIService = GetObject(“winmgmts:” & “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)
    Set colItems = objWMIService.ExecQuery(“Select * from Win32_MappedLogicalDisk”)

    For Each objItem in colItems
    strDrives = strDrives & “,” & objItem.Name & ” ” & objItem.ProviderName
    Next
    GetMappedNetworkDrives = strDrives
    End Function

    Function DeleteMappedDrives
    On Error Resume Next
    Set objNetwork = CreateObject(“Wscript.Network”)
    Set mappedDrives = objNetwork.EnumNetworkDrives
    For x = 0 to mappedDrives.Count
    objNetwork.RemoveNetworkDrive mappedDrives.Item(x), True, True
    Next
    End Function

    Function MapPresidentsDrive
    DeleteMappedDrives
    If isMember(“SPD President”) Then
    Set objNetwork = WScript.CreateObject(“WScript.Network”)
    objNetwork.MapNetworkDrive “S:” , “\\ad.dcu.ie\data\dept\spd\college admin\President”
    MsgBox”Drive S added successfully.” & vbcrlf & “The presidents section share is available in this new location.” & vbcrlf & vbcrlf & “Please contact the helpdesk if you have any questions.”,64,”Migration successfull”
    Else
    WMsgBox”False”
    End If

    End Function

    Function IsMember(groupName)
    If IsEmpty(groupListD) then
    Set groupListD = CreateObject(“Scripting.Dictionary”)
    groupListD.CompareMode = 1
    ADSPath = EnvString(“userdomain”) & “/” & EnvString(“username”)
    Set userPath = GetObject(“WinNT://” & ADSPath & “,user”)
    For Each listGroup in userPath.Groups
    groupListD.Add listGroup.Name, “-”
    Next
    End if
    IsMember = CBool(groupListD.Exists(groupName))
    End Function

    Function EnvString(variable)
    variable = “%” & variable & “%”
    EnvString = objShell.ExpandEnvironmentStrings(variable)
    End Function
    Set objShell = Nothing

    Function ScriptNotRunBefore
    Set WshNetwork = CreateObject(“WScript.Network”)
    RunBefore = “False”
    strComputer = WshNetwork.ComputerName
    set objFSO = CreateObject(“Scripting.FileSystemObject”)
    set objOutputFile = objFSO.GetFile(strOutputFile)
    set objTS = objOutputFile.OpenAsTextStream(1)

    ‘Loop through the output file to see if “Computer name in STRComputer” is found,
    ‘if it is then the script has run before.
    do while objTs.AtEndOfStream <> true
    sReadLine = objTs.ReadLine
    if instr(sReadLine, strComputer) > 0 then
    RunBefore = “True”
    exit do
    end if
    loop

    ‘Close output file and release objects
    objTS.close
    set objTS = nothing
    set strOutputFile = nothing
    set objFSO = nothing
    end function


  • VBS to inventory your workstations or servers

    Sometimes you just need a clear picture of what is in your environment.

    Sometimes you just need to see how much disk space, RAM and CPU capacity a few dozen workstations have available.

    Sometimes you walk into an office and you haven’t a clue what’s live, what’s turned off and what is very out of date.

    This script fixes all of that. Give it a text file with as many Windows workstations or servers as you like and let it go off and get the version of Windows, the license type, the RAM, CPU, Hard disk capacity, the software and hardware serial number and the Windows installation directory. It saves this into a CSV file that you can then open in Excel to sort and play with as much as you want.

    I wrote this to create an inventory of the servers in use here so I could see what version of windows they have, ensure they are using the most recent service pack and ensure they were all using the enterprise skew. I then expanded it to give me more information. Mainly so I can save it somewhere for use on a later date.

    On Error Resume Next

    Const ForReading = 1
    Const ForWriting = 2
    Const Forappend = 8
    filecomputer = “.\computer.txt” ‘ -> File that contains the computers list
    strComputer = “.”
    Star = “*”
    InventoryOutputFile = “inventory.txt”
    logfilename = “.\inventory.log”

    Dim hostname,OSType,CSDVersion,WinSerialNumber,Version,Windir,Timewritten,sw,Make,Model,CPU,Drives,TotalMemory,SerialNumber

    sw = 0

    ‘—————————————
    ‘ Call the routine for log file creation
    ‘—————————————

    createlogfile logfilename

    ‘————————
    ‘ Read computer.txt file
    ‘————————

    Set objFSO = CreateObject(“Scripting.FileSystemObject”)
    Set objTextFile = objFSO.OpenTextFile(filecomputer,ForReading)
    Do While objTextFile.AtEndOfStream <> True
    strLinetoParse = objTextFile.ReadLine
    First_char = Left(strLinetoParse, 1)
    if (First_char <> star) And (First_char <> ” “) then ‘ Bypass the row starting with * and blank char
    hostname = Trim(strLinetoParse)

    Get_user_info hostname
    If WinSerialNumber > 0 then ‘ If the computer exist or is UP
    hostname = strLinetoParse

    AddLineToOutputFile hostname,OSType,CSDVersion,WinSerialNumber,Version,Windir,TotalMemory,Make,Model,CPU,Drives,SerialNumber,Forappend
    WinSerialNumber = 0
    Else
    msg = “=====> Hostname ” & hostname & ” not found or Down”

    writetofile msg,Forappend
    End if
    End if
    Loop
    objTextFile.Close

    ‘————————————————–
    ‘ Retrieve the information from the remote computer
    ‘————————————————–

    Function Get_user_info(strComputer)
    Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)

    Set colItems = objWMIService.ExecQuery(“Select * from Win32_OperatingSystem”,,48)
    For Each objItem in colItems
    OSType = objItem.Caption
    CSDVersion = objItem.CSDVersion
    WinSerialNumber = objItem.SerialNumber
    Version = objItem.Version
    Windir = objItem.WindowsDirectory
    TotalMemory = Round(Trim(objItem.TotalVisibleMemorySize) / 1024, 2 /1024) /1024
    Next

    Set colItems = objWMIService.ExecQuery(“SELECT * FROM Win32_Processor”,,48)
    For Each objItem in colItems
    CPU = Trim(objItem.Name)
    Next

    Set colItems = objWMIService.ExecQuery(“SELECT * FROM Win32_LogicalDisk WHERE DriveType=3″,,48)
    For Each objItem in colItems
    Drives = Drives & Trim(objItem.DeviceID) & ” ” & Round(Trim(objItem.Size) / (1024^2), 2) & “;”
    Next

    Set colItems = objWMIService.ExecQuery(“SELECT * FROM Win32_ComputerSystem”,,48)
    For Each objItem in colItems
    Make = Trim(objItem.Manufacturer)
    Model = Trim(objItem.Model)
    Next

    Set colItems = objWMIService.ExecQuery(“SELECT * FROM Win32_BIOS”,,48)
    For Each objItem in colItems
    SerialNumber = Trim(objItem.SerialNumber)
    Next
    End function

    ‘————————
    ‘ Add/Update the records
    ‘————————

    function AddLineToOutputFile(hostname,OSType,CSDVersion,WinSerialNumber,Version,Windir,TotalMemory,Make,Model,CPU,Drives,SerialNumber,forwriting)
    ‘WScript.Echo hostname
    Set objFSO = CreateObject(“Scripting.FileSystemObject”)
    Set WriteInventory = objFSO.OpenTextFile(InventoryOutputFile,forwriting, True)
    WriteInventory.WriteLine(hostname & “,” & OSType & “,” & CSDVersion & “,” & WinSerialNumber & “,” & Version & “,” & Windir & “,” & TotalMemory & “,” & Make& “,” & Model & “,” & CPU & “,” & Drives & “,” & SerialNumber)
    WriteInventory.Close
    End function

    ‘———————
    ‘ Create the log file
    ‘———————

    function createlogfile(logfilename)
    Dim objFileSystem, objOutputFile
    Dim strOutputFile
    strOutputFile = logfilename
    Set objFileSystem = CreateObject(“Scripting.fileSystemObject”)
    Set objOutputFile = objFileSystem.CreateTextFile(strOutputFile, TRUE)
    objOutputFile.WriteLine(“——————— Inventory Report ” & now() & ” ———————“)
    objOutputFile.WriteLine(” “)
    objOutputFile.Close
    Set objFileSystem = Nothing
    End function

    ‘——————-
    ‘ Write to log file
    ‘——————-

    function writetofile(msg,forwriting)
    Set myFSO = CreateObject(“Scripting.FileSystemObject”)
    Set WriteStuff = myFSO.OpenTextFile(logfilename,forwriting, True)
    WriteStuff.WriteLine(“—————————————————————————“)
    WriteStuff.WriteLine(” “)
    WriteStuff.WriteLine(msg)
    WriteStuff.WriteLine(” “)
    WriteStuff.Close
    End function


  • Script to delete Chrome cache on all PC’s listed in a text file

    Another problem that could be fixed with a script today. Moving machines and users to a different domain resulted in a problem for some people. Chrome is a very popular browser but a number of people have reported to support that Chrome takes a very long time to start and then open the first page after log in to windows.

    It was determined that deleting the cache directory from within the users Chrome application data folder resolved this.

    Waiting for every effected user to report the problem wouldn’t be a great course of action of course. It would be a lot better to proactively go after all Chrome installations and remove the cache directory.

    So that’s what I’ve done. The script does the following:

    1. Check to see if the computer is on the network by pinging it.
    2. List all the user directories in c:\users on each computer.
    3. Check to see if the Chrome cache directory exists.
    4. Deletes the cache directory.
    5. Logs the result including any encountered errors to a file called results.txt.

    I could have searched Active Directory directly of course but I want to be able to easily add and remove computers when needed. It also allows me to run the script on 10 computers to start off and ramp up to a few thousand by the end.

    It should go without saying that as the script uses the admin share, you need to have access to the workstations that you intend to administer.

    Option Explicit
    Const ForReading = 1
    Const ForAppending = 8
    Dim objFSO : Set objFSO = CreateObject(“Scripting.FileSystemObject”)
    Dim objFile : Set objFile = objFSO.OpenTextFile(“Z:\Scripts\Chrome cleanup\AccountingsectionComputers.txt”, ForReading, False)
    Dim objWriteFile : Set objWriteFile = objFSO.OpenTextFile(“Z:\Scripts\Chrome cleanup\Result.txt”, ForAppending)

    Do Until objFile.AtEndOfStream
    Dim strComputer : strComputer = Trim(objFile.ReadLine)
    If PingMachine(strComputer) Then
    ‘Computer is pinging
    Dim objFolder : Set objFolder = objFSO.GetFolder(“\\” & strComputer & “\c$\users\”)
    Dim strUserParentPath : Set strUserParentPath = objFolder.SubFolders
    Dim strUserFolder
    For Each strUserFolder in strUserParentPath
    Dim strRemoteBasePath : strRemoteBasePath = “\\” & strComputer & “\c$\users\” & strUserFolder.name & “\AppData\Local\Google\Chrome\User Data\Default\Cache”
    If objFSO.FolderExists(strRemoteBasePath) Then
    On Error Resume Next
    objFSO.DeleteFolder strRemoteBasePath, True
    If Err.Number = 0 Then
    objWriteFile.WriteLine strRemoteBasePath & vbTab & ” DELETE SUCCESSFUL”
    Else
    objWriteFile.WriteLine strRemoteBasePath & vbTab & ” DELETE FAILED: ” & Err.Number & ” ” & Err.Description
    End If
    On Error GoTo 0
    Else
    objWriteFile.WriteLine strRemoteBasePath & vbTab & ” FOLDER DOES NOT EXIST”
    End If
    Next
    Else
    objWriteFile.WriteLine strComputer & vbTab & ” PING FAILED”
    End If
    Loop
    objFile.Close

    Function PingMachine(device_name)
    PingMachine = False
    Dim colItems : Set colItems = GetObject(“winmgmts:root\cimv2”).ExecQuery _
    (“Select StatusCode from Win32_PingStatus Where Address = ‘” & device_name & “‘”)
    Dim objItem
    For Each objItem in colItems
    If objItem.StatusCode = 0 Then PingMachine = True
    Next
    End Function

    If there are other scripts that you would like to see, please let me know in the comments section.


  • New Job. New Freedom. New Challenge. New Rewards.

    Hey blogger’s, blog reader’s, lurker’s, search engines and spammers. How are you all keeping?

    I’m in an absolutely fantastic mood. That’s because I’m in an absolutely fantastic place. Not geographically. I mean psychologically and in life. I parted ways with my previous employer DCSDocs on the 15th of April so just a day over a month ago and since then life has taken a huge turn for the better.

    I’m absolutely loving what I’m doing, even though I did not get the advanced diploma of myotherapy like I wanted. Getting back into system administration has been like putting on a comfortable pair of shoes after wearing a pair of stilettos that are two sizes too small with a rusty male sticking at an angle into one of your toes. Not that I have experience of wearing stilettos but I’d imagine that as they aren’t the most comfortable footwear for a woman they would be twice as bad for a man. My mother in law has been at me for ten years now about cross dressing but I absolutely refuse. That’s a story for another day.

    I’m now working for St. Patricks College Drumcondra in Dublin as the senior system administrator. This is an enormously interesting time to work for St. Patrick’s college as we are nearing the end of a project called incorporation which is a fancy word to describe the merge of St. Patrick’s, Mater dei and DCU. I will be working on the IT infrastructure aspect of this project for the next few months before moving to DCU to continue as a senior system administrator there.

    Let me say again that I’m loving this job. I’m there just under a month now but I really enjoy the community spirit among the staff and students in the college. There’s a lot to do in terms of the infrastructure but the previous system administrator had the same high standards as I have so overall I’m very happy with the set up.

    I’m also really enjoying the people I’m working with in the IT department. It’s the same kind of friendly working environment that made my time in Fujitsu so enjoyable.

    Let’s take a break from all the fully stuff.

    I’ll post up a few technical posts in the next few weeks. I have some interesting scripts on the go at the moment so I’ll add them to the blog so people can use them when needed.


  • See who is logging onto your domain

    I was looking a migration from one domain to another a short while ago. Almost all the users accounts had been migrated over but there were a few hanging on.

    The migration tool wasn’t doing a great job of picking them up so I wrote a small script and added it to group policy for all servers and workstations. Now when someone logs in to the old domain a line is written to the log with their username, computer name and IP address.

    Using this the person responsible for the migration can get through the last few people on the old domain. This has saved a lot of time as before I wrote this th eprocess was very manual.


    Const ForAppending = 8
    Set WshShell = CreateObject("WScript.Shell")
    Set WshNetwork = CreateObject("WScript.Network")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("\\ServerName.DomainName.TLD\RemainingComputer\log.txt", ForAppending)
    objFile.WriteLine WshNetwork.ComputerName & "," & WshNetwork.UserName & "," & GetIpAddress
    objFile.Close

    Function GetIPAddress
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set IPConfigSet = objWMIService.ExecQuery _
    ("Select IPAddress from Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'True'")

    For Each IPConfig in IPConfigSet
    If Not IsNull(IPConfig.IPAddress) Then
    For i = LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    If Not Instr(IPConfig.IPAddress(i), ":") > 0 Then
    strIPAddress = strIPAddress & IPConfig.IPAddress(i) & " "
    End If
    Next
    End If
    Next
    GetIPAddress = strIPAddress
    End Function


  • Fixing my first problem with MongoDB.

    working with MongoDB seemed easy at first.

    It isn’t available in the APT repository and compiling it on the Raspberry pi is a little different so I followed this very helpful guide.

    That got me up and running so next I had to learn a little more about MongoDB. Fortunately, the MongoDB manual is fantastic so This section told me everything I needed to know to create my first database and collection. Note, collection is similar to a table in SQL world.

    Next, I wanted to dive right in and connect my Python application that is taking data over serial from my Arduino. The idea was to add this data to a collection in MongoDB so that historical graphs could be generated. With a quick Google search, I found This quick tutorial that shows the basics of Python and MongoDB. Armed with a little knowledge I successfully learned how to add data to my new collection in MongoDB. Everything was working perfectly.

    That was on Friday night. Saturday was a very busy day so I didn’t get near this stuff at all until late on Sunday. With a lot of frustration, I found that no data was shown in MongoDB any more and MongoDB was frequently hanging without providing me with a prompt. This seemed to be any time I tried to use the db operation. I was absolutely certain that data had been written to the database and collection so I set about trying to find out what was going wrong.

    First, I checked the logs in /var/log/mongod/mongodb.log. All they were showing me were the connection attempts.

    Then I looked at the ocasional time out error message that I was getting from within the MongoDB shell. Still nothing useful.

    I even tried searching forums etc for some hint of what might be going wrong.

    I found two useful pages that I’ll keep for future reference but unfortunately, they were of no help with this problem. This is a forum post that someone created when MongoDB seemed to be hung. and This one shows how to troubleshoot hanging issues.

    I decided to try running MongoDB as a user run process instead of a system daemon. Of course, then, i was using the default settings so I thought that it might show me if anything was going wrong with the settings in /etc/mongo.conf. No. All I got was a message about the dBPath not set. This was of no use to me because I quickly found out that in /etc/mongod.conf, the DBPath was set to /var/lib/mongodb/. However, this pointed me toward looking at the permissions on that folder. I had set them while installing MongoDB but I thought I’d check again to be sure that the permissions were set recursively for child files and folders. Again, this wasn’t the problem, however I noticed a file called mongod.lock. I thought maybe this was a place holder to show that the database was locked so I tried moving that file out of the /var/lib/mongodb directory. Sure enough, I made a little more progress. The show dbs command was still causing the MongoDB shell to hang. I deleted the databases that I created while working with Python earlier from the /var/lib/mongodb/ directory and this let the show dbs file runn a little longer but it was still causing MongoDB to freeze. I deleted the MyDB database that was created when I was learning MongodB first as well and the command completed successfully. Of course, I was very aware that I had deleted files from the file system and the databases were still there but were probably now corrupt within MongodB so with another quick search on Google, I found the short command to delete databases from within MongoDB. I also found the command to drop mongoDB collections as well but I don’t particularly need that at the moment. Handy to have for future reference of course.

    So, after deleting the files and deleting the databases within MongoDB, the system is working perfectly. However, I hear you say, “There’s nothing in the system, of course it’s running perfectly!” Your absolutely right, but for the moment, there’s no locking so I@m going to hope either one of the tutorials / forum posts were wrong or it was just something in one of the databases that became corrupt.


  • My new job in Document Centric Solutions

    I was in the process of writing a great blog post early this morning on the way to work when I heard a click and my battery died. I booted the laptop up again this evening and very strangely, Microsoft Word didn’t have an auto saved copy. Strange but probably for the best because I think I was rambling.

    I’m writing today to tell you about what’s been happening in my professional life over the past few months. I had a number of discussions with Fujitsu surrounding where I wanted to go and where they saw me going. Our objectives didn’t exactly match so we agreed that I would look for a new job. I certainly didn’t take this decision lightly. Ordinarily, this wouldn’t be such a great time to look for a new job. With Emma expecting our first child in a matter of months I need stability and reliability at work. Turning my life upside down isn’t really what the doctor ordered if you know what I mean. Anyway, I began looking for a new challenge and opportunity in April and in May I was offered a role in a very small company in Dublin. This company have been about for about thirteen years and the number of customers using their products has grown every year.

    The name of the company I now work with is DCS Docs. DCS stands for Document Centric Solutions but when you look at the array of products that they have developed, documentation is kind of the most unlikely description you could possibly find. DCS write software that manages contracts, payments, HR, resource provisioning and reporting. That’s just scratching the surface. I’m there two weeks now and I’m still trying to get up to speed with everything they provide.

    My job title is support manager but this is only one part of what I do. As you might expect in such a small company, people need to be able to take on multiple roles simultaneously. This means I’m also managing project resources, implementing their new VOIP phone system, coordinating with their out sourced IT provider, stream lining their licenses and updating their internal network.

    Although I’m a technical person and I am quite happy to get out of providing support to end users, the opportunity to build up a support team is something that I think I’m going to enjoy. It’s not the first time I’ve done this kind of thing. When working in Stream, I was promoted to the role of technical lead for the Sybase 365 team but for various reasons, this role became very managerial and most of my tasks revolved around making 19 individuals into a 24 hour a day 7 days a week support team that were rock solid. I found this very difficult. Allowing for 19 separate personalities and trying to manage them was a very high pressure environment was way outside the direction I wanted my career to go. It was a huge relief to me when Novell asked me to go back on their support team as their technical lead because it got me away from the managerial side of the business. Prior to working on the Sybase team I was a support engineer on the Novell team so it was great to be asked to go back at a higher level.

    I was honestly worried about going back into a manager’s position when I started with DCS but I’m not in the slightest bit worried any more. The three people that work in support are outstanding. They all have incredible motivation to get work done and they take advice really easily.

    The role is also very technical. I am working with software that has been developed by DCS so I am constantly using applications such as Visual studio, SQL management studio, the SQL profiler and the SQL optimizer.

    Going from a system administrator role to a developer support role is actually really difficult. It takes a lot of effort to let the system administration jobs go to someone else. This is hopefully going to benefit DCS though as I have experience with implementing systems in a large enterprise environment and a small company with only five employees. DCS haven’t had a system administrator in house for quite a while so I’m hoping that my influence will give their internal IT some direction.

    One thing that I should say here. I obviously can’t give too much away about the software that DCSDocs have written just in case I step over any lines but their core product is absolutely amazing. If you know about the entity framework, consider this made 13 years ago but with a really usable graphical and web user interface to take over from programmatically creating classes and functions. It’s just stunning the direction that this company took so many years ago when Microsoft were still thinking along the lines of classic ASP. That kind of innovation is continuing today.

    I’m finding the work very different and challenging and I’m getting on really well with the people that I’m working with so I really think this was a good move for me. I’m missing Fujitsu and I’m missing the exposure to the systems I had there but for a lot of different reasons, I know that couldn’t continue indefinitely.