Hi paragf! I checked your code.
 Firstly, there seems to a syntax error at:
output = os.system(cmd))
this line should be:
output = os.system(cmd)
But this wouldn't be the cause for error.
I used the following to start the hub and register the node:
Code to start selenium hub on VM:
import os
def start_selenium_hub_on_vm():
   cmd = "java -jar selenium-server-standalone-3.10.0.jar -role hub -port 4444"
   output = os.system(cmd)
   print 'executing command ', cmd
   if output:
      return output
   else:
      return -1
start_selenium_hub_on_vm()
The output when I run this code is as folllows:

On your node, before trying to register it to the hub, make sure you have a config.json file. The config.json file should look something like this:
{
  "capabilities":
  [
    {
      "browserName": "firefox",
      "marionette": true,
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver",
      "version": "62.0" //Your browser version
    }
  ],
  "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
  "maxSession": 5,
  "port": 5555, //Port on which the hub is running
  "register": true,
  "registerCycle": 5000,
  "hub": "http://192.168.111.132:5555", //URL displayed for Node to register when you start the hub
  "nodeStatusCheckTimeout": 5000,
  "nodePolling": 5000,
  "role": "node",
  "unregisterIfStillDownAfter": 60000,
  "downPollingLimit": 2,
  "debug": false,
  "servlets" : [],
  "withoutServlets": [],
  "custom": {}
}
The python script to register node to hub:
import os
def register_node_to_hub():
   cmd = "java -jar selenium-server-standalone-3.10.0.jar -role node -nodeConfig config.json"
   output = os.system(cmd)
   print 'executing command ', cmd
   if output:
      return output
   else:
      return -1
register_node_to_hub()
The output I get: 

The error you are getting is usually got because of incompatible version. The version that successfully worked for me:
Firefox: 62.0
geckodriver-v0.19.1
selenium-server-standalone-3.10.0.jar
Python 2.7.15