diff --git a/actions.go b/actions.go index 4e9135e..8ece42b 100644 --- a/actions.go +++ b/actions.go @@ -6,15 +6,14 @@ import ( "net/http" ) -// PerformScan runs a scan of a given host using a set of scripts. -// At this moment, we assume that there will be only one script here (idrac.py), -// and that only MAC addresses will be created/updated/deleted in Ralph. -func PerformScan(addrStr string, scripts []string, dryRun bool, cfg *Config, cfgDir string) { +// PerformScan runs a scan of a given host using a script with scriptName. +// At this moment, we assume that only MAC addresses will be created/updated/deleted in Ralph. +func PerformScan(addrStr, scriptName string, dryRun bool, cfg *Config, cfgDir string) { if dryRun { // TODO(xor-xor): Wire up logger here. fmt.Println("INFO: Running in dry-run mode, no changes will be saved in Ralph.") } - script, err := NewScript(scripts[0], cfgDir) + script, err := NewScript(scriptName, cfgDir) if err != nil { log.Fatalln(err) } diff --git a/bindata.go b/bindata.go index 51d0bc5..db68e0c 100644 --- a/bindata.go +++ b/bindata.go @@ -2,6 +2,7 @@ // sources: // bundled_scripts/README.md // bundled_scripts/idrac.py +// bundled_scripts/ilo.py // DO NOT EDIT! package main @@ -84,12 +85,12 @@ func readmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "README.md", size: 632, mode: os.FileMode(420), modTime: time.Unix(1463047570, 0)} + info := bindataFileInfo{name: "README.md", size: 632, mode: os.FileMode(420), modTime: time.Unix(1465157559, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _idracPy = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x3a\x7b\x6f\xdb\xb6\xf6\xff\xfb\x53\xf0\xe7\x61\x90\x8d\x39\xb2\x9d\x47\xd7\xfa\x57\x77\x70\x6d\x67\x33\x56\x27\xb9\x71\xb2\xf5\x22\x37\x10\x18\x89\x4e\xb4\xca\x92\x46\x4a\x75\x7c\x83\x7c\xf7\x7b\x0e\xa9\x07\x25\xf9\x51\x27\xb7\xc0\x4d\x81\x8a\x22\xcf\x8b\xe7\x4d\x5a\x3f\xfc\x5f\x3b\x16\xbc\x7d\xe7\xfa\x6d\xe6\x7f\x25\xe1\x2a\x7a\x08\xfc\x5a\xcd\x5d\x84\x01\x8f\x08\xe5\xf7\x21\xe5\x82\xa5\xef\x7f\x09\x58\x4c\xc6\x81\x48\x47\x61\xc8\x5d\x3f\x4a\xdf\x78\x06\x1d\xc7\xae\x53\x9b\xf3\x60\x41\x1e\x17\x9e\xc9\x22\xce\x18\x49\x96\xc6\x1e\x5b\x30\x3f\xba\xc2\x29\x2a\xc8\xf8\xaa\x96\xa3\xff\x1d\x33\x11\x09\x85\x98\xbe\x99\x21\xb5\xbf\xd0\x7b\x26\xcc\x98\x7b\x9e\x7b\x77\x64\xb2\x47\x9b\x85\x91\x1b\xf8\x22\xa5\x39\xf1\x05\xb3\x63\xce\x2e\x15\xce\x9f\x94\xfb\xae\x7f\x5f\xab\x5d\xcf\xc6\x97\xa4\x0f\xf2\x9a\xb0\x43\x97\x07\xfe\x8d\x31\x1d\x9c\x0d\x7e\x1d\x4f\xc7\x67\x57\x16\xae\x5a\x67\x83\xe9\xd8\xb8\xad\x5d\x0c\x66\xb3\x1d\x90\x08\xf2\xe7\xf9\xe5\x08\xa0\x6b\xb3\xe1\x6f\xe3\xe9\x00\x10\xea\x0f\x51\x14\xf6\xda\x6d\x61\x3f\xb0\x05\x15\xa6\xb3\x88\xe6\x66\xc0\xef\xdb\xcb\x3b\xb6\x68\x2f\x85\xed\x2e\xda\xdd\x36\xfc\x7f\xa0\x20\xda\x87\xf5\xda\xe7\xe9\xa7\xb3\x99\x85\xec\xea\x4f\x09\xfa\x72\xb9\x34\x97\x47\x12\xf1\xb0\xd3\x39\x6a\x77\x4e\xda\x22\xa0\xe1\x01\x08\xc3\xbc\x20\x64\xcf\x29\xd6\x9f\xb3\xf1\x99\x8e\x98\xf2\x05\x35\x23\x82\x62\x2d\x90\xc8\x71\xbb\xf3\x0e\x0c\x1b\x2f\x18\xa7\xa8\x2c\x8d\x04\xec\x6c\x1d\x8d\xb2\xec\x0b\xea\x83\xec\xf2\x69\x3e\x0a\x27\x23\x70\xd6\xb5\x3e\x0e\x66\xe3\xb5\x24\x98\xe7\x99\x76\xb0\xd8\xbc\xfd\xf6\x8f\x02\x08\xfd\x40\x7e\x65\x3e\xe3\xae\x4d\x24\xf9\x03\x9b\xd3\x79\xc4\x1c\x82\x7b\x20\x0b\x26\x04\x18\xbc\x36\x3b\x1f\x5c\x58\xe3\xb3\xeb\xa9\x12\xd9\xba\x1a\x4f\x2f\x3e\x0d\xae\x90\xb1\x61\x18\xef\x7f\x81\x3d\x93\xaf\x8c\x0b\xd8\x5c\xbf\xde\x35\x3b\xf5\x5f\x3e\xd4\xde\x8b\xde\x38\xd1\x19\xba\x9e\x2f\x7a\xa2\x5f\xff\x46\x25\xd7\x13\x8c\xa5\xa0\xfd\xb2\x5d\xd7\xea\xf7\x6d\x9b\x3a\x0e\x07\x69\xc1\xd9\x72\x64\xd8\x4f\x05\x7d\x87\x6a\x73\x64\x56\xc5\xdd\x6d\xda\xfa\x87\x1a\x21\xb0\xf3\xdf\x18\x75\x18\xc7\x17\x78\x85\x5d\xf4\x06\x36\x2e\x13\xd1\x5b\xc4\x22\xba\xf6\x61\x51\x44\xd4\x77\xfa\xf5\x88\xc7\xac\xfe\x61\x6f\x46\xed\x71\x32\x66\xef\xdb\x39\x7d\x8d\xe1\x55\xb0\x91\xd9\x13\xec\x15\xac\x8a\xb1\x6f\x41\x24\x3f\x2b\x0a\x57\x41\x86\x0d\xeb\xbd\x4b\x26\x82\x98\xdb\xec\xfa\x72\xb2\x99\x10\x4f\x80\x24\x89\x12\x96\x26\xcb\x54\xb9\xd1\x64\xb4\x91\x12\x66\xa9\xde\x13\xfe\x9f\x48\x93\xa1\x68\x64\x2e\x59\xe8\xad\x52\x31\x53\xbd\x2a\xb3\x7f\x93\x02\x75\x27\x69\xf3\xc0\x63\x6d\xea\x07\xfe\x6a\x11\xc4\x22\x51\x62\x42\x4c\xb1\x6c\x57\x78\x26\xaa\x99\x31\x8f\xd9\x51\xc0\x67\x2c\xd2\x64\xd1\x57\xc8\x19\x5d\xb0\x7e\xdd\xb2\x20\xde\x7c\x18\x0a\xc8\x9c\xa8\x2f\x91\xac\x67\xfa\x4a\x11\x72\x96\x6b\x18\xbc\x6f\xeb\x0e\x05\xde\xf5\x31\x70\x56\x99\x44\xcc\xef\x65\xbe\x50\x12\xe7\x1c\x72\xf3\xc2\xfd\x37\x1b\x6b\x7e\x53\x02\x99\xd2\xc7\xa4\x0c\x08\xf4\x8b\x47\x8b\x25\x6f\x99\x88\x3a\x44\x26\x65\x99\x29\x8a\xa8\xa4\xc2\x51\x1a\xf7\x1f\x6a\x90\x1d\x6a\xa7\x43\x6b\x72\x76\x7a\x6e\x8d\x3f\x5f\x5c\x8e\x67\xb3\xc9\x39\xa6\x3c\xce\x30\x39\x85\xae\xc7\x1a\xdc\x68\xdc\x74\x0e\xde\xdd\xfe\xd4\x3c\x50\x4f\xa3\x59\xab\x4d\x07\x43\x0b\xc0\x4f\x27\x9f\xad\x8f\x9f\x06\xc3\xdf\x3f\x4d\x66\x57\x80\x76\x23\x25\x30\x4e\x3a\xf0\xef\xd8\x68\x11\xe3\xe8\xe8\xa4\xf3\xe6\x14\x47\x9d\xce\xbb\xb7\x3f\xbf\x51\x23\xfc\xcb\x46\x43\x1c\x1d\x76\x8e\xbb\x27\x47\x38\xea\x1e\xbf\xeb\x1e\xc2\xaa\xa2\xd4\x01\xd7\x50\x94\x4e\xc7\xa7\xf0\x27\x21\x06\xa7\xef\x0e\x15\xfe\x61\xe7\xad\x1a\x8d\xc6\x83\xd1\xe1\x50\xc1\x0d\x46\xc7\x23\xc0\xbf\xad\x41\x2d\x9a\x0c\x3e\xad\x11\xf0\x2c\xf0\x19\x80\x22\xf8\x59\x10\x91\xc1\x57\xea\x7a\xf4\xce\x63\x38\xf1\xf9\x51\xfe\xc3\xe1\x01\xfe\xe1\xe0\xe6\xda\xff\xe2\x07\x4b\xff\x36\x17\x5f\x6d\x41\x09\x89\x34\x66\x21\xb3\xdd\xb9\xcb\x1c\x04\xf9\xe7\xef\xdd\xce\x70\x24\x65\x3d\x3c\x3a\x3e\x79\xf3\xf3\xdb\x77\x1d\xc5\xcc\x97\x3c\x20\xf8\x3f\x32\x72\xea\x7a\x1e\x64\xf2\x8f\x2b\x72\x6e\x8e\xcd\xa9\x29\x65\xae\xd5\x1c\x36\x27\x7e\xc0\x17\xd4\x03\xd7\xb0\x16\xd4\xb6\x92\xb0\x68\x68\xe3\x66\x4f\xb2\xd6\x66\x60\x73\xda\x9b\x19\x87\x21\xe3\x8d\xa6\xc9\x21\x40\xc0\xb9\x1b\x86\xdc\x48\x0f\x6c\x87\x78\x9c\x45\x31\xf7\x75\x04\x60\xbc\xb9\x8f\x70\x5c\x81\xea\xb1\x96\xaa\x5d\x10\x8d\xf5\x6d\x04\xf8\x45\xcd\xf6\x28\xc8\x32\x71\x38\xb5\xc7\x9c\x07\xbc\x31\x4e\x7b\x90\x44\xe4\x90\x4a\x66\x09\xdc\xe8\x72\x30\x6c\x04\x77\x7f\x41\x3c\xc1\xba\x04\xc0\xfd\x5b\x96\xeb\xbb\x91\x65\x35\x20\x22\xe7\x2d\xf2\x10\x88\xa8\x45\x62\xc1\x78\x4b\xe2\x2f\x03\xee\x24\xe4\xf0\x0f\x81\x4c\x84\x01\x1d\xe0\xa3\xb8\x80\x68\xb0\x80\x8f\xe2\x42\x4a\x09\x16\xd3\x61\x2e\x01\x8f\x7d\x0b\x22\x00\x22\xcc\x49\x84\x90\x12\x5b\x98\x2e\x5a\x24\x4d\x14\x7d\x83\x07\x41\xd4\x76\x20\x8f\x18\x9a\x40\xc5\x04\x9e\x36\x3f\x02\x12\xe0\xd3\xb3\x0a\xdb\xba\x39\x47\x13\x47\x8d\x4c\xf6\x66\x86\x7d\x8f\x05\x1f\x02\xd7\xb1\x30\xe1\xa2\xe8\xf0\x30\xf1\xbf\x6e\x23\x87\x4a\x6a\x3f\x2c\x6f\xaa\xfe\x29\x8b\x0c\x45\x59\x5e\x55\x80\xbe\x6a\xcc\x4c\xc8\xf3\xdc\x0d\x1b\x46\xdb\x68\x92\x9f\x08\x3c\xe0\x7f\x6d\xa7\x05\xdc\xe2\xb6\xfa\xc5\xd7\x22\x28\x4a\xdb\x2f\x6e\xa4\x08\x90\x69\x30\x1d\x94\x59\xe5\xa9\xae\x7f\x78\x72\x92\xaf\xe6\x1a\x48\x9c\x78\x7c\x65\x42\xb7\xa5\x14\x69\x41\xe6\x73\x2c\x2c\x2d\xc5\x5d\xa3\xb8\x46\xd9\x06\x46\xd5\x06\x25\x21\x94\x8a\xfb\xc9\x53\x93\xa1\xa9\xb9\x6a\xce\x52\xf9\x09\xea\x22\x45\xd5\x7c\xa2\x5e\xaf\x5f\xf1\x15\x89\xa0\xee\x03\x42\xa1\x7f\xc3\xc9\x10\xd8\x4b\x67\x89\xb1\xfc\x11\x94\x95\xdc\x51\xe1\xda\x19\x01\x1a\x47\x0f\xa0\x0e\xd7\x96\x85\xc2\x84\x24\x16\x81\x27\x46\x0f\x34\x22\x4b\x46\x9c\xc0\x37\x22\x22\x40\x91\x70\x58\xf0\x57\xc0\x44\x60\xbb\x47\x5c\x5f\x6d\x12\xc6\xb9\xfc\x90\x5e\xc8\x57\xc8\x2f\x0e\x18\x87\xcc\x66\x9f\x88\xcd\x78\x04\xd9\x0b\x48\x33\x93\x0c\x00\x7d\x1e\x78\x5e\xb0\x44\x49\xd2\xac\x40\x96\x90\xae\xe0\xed\x00\xc5\xcf\x28\x49\x11\xa5\x68\xe4\x41\x96\x40\x42\xef\xa9\xeb\x9b\xfa\xb6\x73\x83\xc9\xc2\x92\x26\x19\xd8\x70\xc5\x48\x45\xfd\x83\x78\xb4\xaa\xfc\x54\x17\xfd\x46\x16\xde\xad\x62\x40\x97\xcc\x08\x9d\xaf\x3b\x5f\xf5\x4f\xa9\x27\x4a\x64\x94\xc8\xa2\xff\x54\x98\xc5\x3f\x63\x18\xf8\x11\x68\xfb\xe0\x6a\x15\x32\xa3\x47\x0c\x1a\x86\x5e\xa2\x7a\xd9\x0b\xff\x04\x2d\xcc\xff\xdb\x0f\x78\xf0\x8b\xfa\xd7\x57\xa7\x07\x6f\x8d\x22\xed\xe7\x75\x2e\xeb\x62\x6a\x87\xf3\x9b\x19\x7c\xe9\x15\xa0\x61\x81\x9b\xd0\x72\x45\xb1\x80\xb4\xe3\x40\x58\xf7\xc9\x71\xa7\xdb\xab\x08\xc6\xa9\x2b\x98\x9e\x5f\xeb\x03\x54\x3e\xc3\xb1\x09\xc7\x3b\x69\x56\x99\xec\x30\x7e\x09\x18\x3a\xd5\x8a\x59\x6f\xd6\xb6\x52\xaa\xf0\xaa\xcf\x60\xa3\x72\xad\x47\xa0\xd1\x82\x63\x24\xeb\x91\xa7\xe7\x7f\xf9\x49\xda\xc7\x97\xfa\xda\x2c\x93\xf1\x30\x23\xf6\x18\x65\xe1\xd0\xaa\x00\x95\x4c\x95\x4b\x28\x37\x24\xac\x90\xc2\xe6\xe0\x14\xf3\x24\x9e\xb1\x7f\x69\xc3\xf3\x94\xc6\x5e\x94\xc7\x6e\x3f\x39\x24\x56\x50\x3d\x57\x16\x84\x9b\xdb\xf2\x82\x2f\xf5\x9b\xe6\x0d\x25\x62\xd3\x9c\xbb\x90\xe9\x35\xae\x05\xa3\x69\x98\x45\x93\x94\x78\x21\x80\x85\xf4\x20\x80\x38\xc9\xdf\x5c\x5f\x27\x61\xba\x11\xc4\x1b\xcc\x37\x9a\xb7\x7b\x9a\xc4\x28\x98\x24\xb3\x42\x0b\x5e\x84\x34\x50\xc2\x07\x27\x8d\xad\xa6\x49\x4d\x42\x8c\x96\x61\xfe\x15\xb8\x7e\x43\xdb\x4b\x73\x8d\xa5\x36\x18\x2a\xc9\xc2\x4a\x8d\x49\xfb\x62\xdd\xb3\xc8\x82\xd4\xc0\x2c\x4c\x3f\x0d\x17\x37\x64\xa9\x72\xc1\x93\x94\x28\x2f\x3a\xfa\xa4\xb0\x64\xea\x45\xd7\x18\x0d\x27\x53\x6b\xb6\x12\x11\x5b\xfc\xe1\xb2\x65\xd2\xb9\xc8\xe3\x9f\xe5\x77\x01\xb7\x78\xc6\xfe\x91\xd4\x4b\x18\x2a\xf1\xfc\x2d\x4f\xdf\x89\xf7\x3c\x67\x5d\x71\xaa\x2f\x98\x9b\x00\xbc\x80\x67\x19\xbd\xa2\xbe\xc4\xd3\x5a\xa5\x09\xbc\x69\xa8\xce\x41\x25\xce\x27\x53\xa9\xd5\x4c\xda\x83\xd9\x10\x95\xd8\xb7\xa1\x2e\xa4\xff\x51\xcf\x6b\xfc\xad\x56\xd3\x4c\xa1\x80\x72\xa7\xab\xc6\xff\xc4\x07\x10\x80\x8b\x20\xef\x8b\x25\x64\x60\x70\x36\xa8\x14\x25\x23\xa4\xd1\x0f\xf5\x1f\xc2\x07\x98\xe6\x39\xcf\x58\x80\x4f\x7a\xb2\xde\x43\xa6\x03\x5d\x6d\x0c\xeb\x44\x9a\x9b\xce\xad\x0a\x97\x6a\xc6\x78\x7a\xd6\x70\xb3\x5d\x13\x63\x4a\xfd\x78\x4e\x6d\x70\x15\xc6\x8d\x72\xd0\x4b\xd7\x31\x55\x23\x92\x77\xac\x75\xc8\x66\xb6\x59\x6f\x41\x09\x29\x21\xbc\x42\x0c\xdc\xe9\x76\xfe\x5a\xda\x56\xc3\x67\xf9\x3f\x24\x54\x97\x82\x92\xe2\xc5\x1d\x53\x75\x6c\x83\x0c\x1b\x79\x0f\x1f\x20\x11\xbb\x62\xc6\xf8\x57\xd7\x66\x57\xf4\x3e\x95\xa3\xc8\x3f\xb5\x7e\x91\x21\xfa\x02\xd8\xb5\x7c\xa2\xd1\xfc\x42\xda\xf5\xc6\x28\xa0\x19\xb7\x20\x69\x61\x46\xef\xfe\x15\x8a\x1e\xb2\xda\x79\x80\x89\xd7\x84\xed\xd9\x64\xb8\x4f\xcc\x26\xe0\x2f\x0a\xd8\x14\xf7\x3b\x47\x6b\x41\x35\x79\x59\xc1\x34\xaf\x5c\x41\x86\x5d\x31\x90\x73\xeb\x44\x7c\xd5\x2b\xf5\xb7\x76\xe6\x44\xfb\x3a\xf1\x30\x86\x70\xf7\x23\x38\x82\x27\x17\x22\xeb\x1d\x3a\x2f\x7b\xf2\x04\x46\x06\x11\x38\xd8\x5d\x1c\x31\x55\x3e\x0a\x18\x36\x74\x3b\xae\x1f\xb3\x72\xa3\x02\x62\xee\x00\x54\x1b\xd9\x78\x5e\x2d\x54\x51\x78\xbf\xe9\xbd\xb9\x45\x4d\xad\xbb\x3f\xd8\xcd\x29\xb7\x80\x09\xfd\x18\xf4\xa1\x39\x8b\xea\x89\x96\x09\xdd\xb5\x43\x1e\xd8\x30\x09\x05\xee\x35\x7e\x3d\xbc\xb8\xde\xc7\xaf\x13\xf0\x17\xf9\x75\x8a\xfb\xdd\xab\x10\x26\x81\xfd\x3d\x5a\xd6\x8c\x92\x0b\xef\x4a\xbb\x6b\x12\x9d\xd2\x7d\x29\x38\x80\x16\x7b\x44\x6b\xf8\x6b\x7a\x97\xad\x31\x83\x7f\x1b\xa5\x98\xf8\x78\xa7\x69\xb3\xc9\xa8\x1c\x30\x52\x1d\xc5\x2a\x24\xa0\xdd\x8f\x1a\x86\x69\x34\x6f\x0e\xba\xb7\x1b\xbb\x54\x15\x5a\x8d\x3f\xa8\x17\xab\xb8\x6a\x41\xd5\x02\xe9\xe5\xb8\xb9\xc3\xa3\x13\xdd\xa7\xbe\x5c\x3c\x85\x18\xb0\x4d\x26\xa0\x20\xa3\x16\x5e\x96\x28\xce\x64\xca\x3f\x9f\x5f\xa4\xbe\x3f\x94\x24\xb7\x96\xbf\xd2\x62\xb1\x37\x90\x2f\x25\x00\x11\x32\xe6\xbc\x4a\xcc\x29\x7d\x1c\x7a\x81\xfd\x65\x26\x29\xed\x25\x9d\xf4\x14\xc9\x1c\x9e\xa5\xb5\x39\x5d\xb8\xde\x0a\x16\x5f\x98\x65\x2f\xae\x4f\x15\x85\x6f\x6c\x17\x24\x53\x8f\xde\x81\xa7\x57\x34\xf5\xdc\xac\x16\xde\x42\x7a\x5a\xb0\x45\xc0\x57\xaf\x49\x4d\x53\x49\x61\x9f\xec\x94\x63\xbc\x28\x41\x69\xe8\xdf\x3d\x47\x49\xb5\xdd\x64\x40\x4f\xeb\x95\x6e\xc8\xd6\x75\xf3\xb1\xe7\xe5\xa9\x63\x5b\xfb\xba\xcb\x27\x5e\xc9\x79\x5d\xc7\xba\x8b\x65\xd9\x2b\x05\x54\xe6\x57\x85\xe8\x0c\x09\xec\x15\x99\xaf\x4f\x0b\xff\xbd\x74\xf0\x2c\x8b\x9a\x9a\xd4\x6a\x5b\xfa\x73\x1d\x6b\x94\xaa\x5c\x8b\x40\xa1\xe0\x51\xbf\xab\xdc\xef\x56\x0f\x54\xc7\x15\x5f\x5e\xd5\x42\x5c\x3c\xac\x84\x6b\x53\x6f\x04\x84\xf6\x89\xd6\x32\xde\x8b\x62\xb6\x42\xe4\x7f\xb5\xbb\xd0\xe2\x6d\x5b\x9f\xbc\x77\xc0\x6e\x68\x41\xf2\x2a\x27\x2f\x9b\x36\xa7\x11\x5d\xb0\x75\x87\xd2\x17\x1e\x48\xbf\xed\x3c\x9a\x8d\x30\x9e\xe1\x54\x6f\xdd\xad\x22\x79\x18\xd9\xc8\xdb\x40\xbe\xc6\x86\x80\x9e\xf8\x1f\x11\xbf\xaa\x9e\x9c\xcf\xda\x43\xef\x5e\x7c\x24\x05\xd5\x88\x6c\x61\xb4\xbd\x13\xd2\xd2\x57\x45\xb3\x6b\x27\xab\x3a\xa2\x78\xe5\xae\xcf\xa4\xea\xc5\x1b\xd2\x4e\x35\xb9\x92\x36\xe9\x76\x0e\x8f\x8b\x8f\xed\x39\xb6\x70\xf0\xee\x95\x74\x27\xf9\xeb\x33\x3a\x7f\xc3\xd8\xd6\x45\xac\xf9\x21\x66\x4d\x57\xb6\x0e\x2a\xeb\x80\xd6\x7b\xed\xce\xa6\x64\xee\xde\x81\xc5\x1f\xa8\xef\x03\x7d\x9b\x72\xe7\x75\x89\x6f\x38\x19\x31\xbc\xfa\xd8\x2b\xeb\xe9\x48\x2f\x4b\x79\x05\x0a\xdf\x39\xdf\xc5\x82\x39\x96\x2b\x2f\xf5\x04\x8b\x1a\xaf\x4b\x82\xd2\x0b\x5e\x92\xfd\xea\x23\x26\x6c\xf0\x2e\xf9\xc5\xcb\xe6\xa0\x83\x13\xb9\x21\x4d\x4c\x12\x1b\x1b\xe9\x35\x93\xe4\x6c\x7a\xc1\x12\x7f\x42\xde\x79\x2c\x8f\x6c\xbc\xa2\xaf\x7e\x46\x60\x0a\x46\xb9\xfd\xb0\xee\x0a\x71\xcf\x34\x59\x3f\xfd\xc7\x68\x54\xbe\x05\x54\xbb\xd9\xf2\x2b\x8b\x94\x6c\x87\xf4\x61\x52\x10\x2d\xf9\x43\xab\xc4\x30\xef\x79\x10\x87\x8d\x6e\x81\x9e\x0e\x07\x0a\x4a\xed\xbc\x83\x7a\x0a\x66\x52\xc7\x69\x68\x24\x9a\xdf\x98\xf8\x34\x14\x88\x62\xed\x6d\x43\xbe\x90\xcf\x6f\x0b\x70\x15\xad\x8e\x8c\x8c\xcd\xb7\xf4\xda\x3a\xa8\x67\xeb\xb5\x7e\x4d\x39\x43\xf1\x96\x6c\xe7\xad\x62\x2d\xd1\x6f\x01\x26\xd7\xaa\xc6\xff\xc6\x28\xc0\xc8\xab\xcd\xe2\x6d\x8f\xb4\x67\x76\xcd\x93\x72\xdf\x78\xf1\x93\xb2\xce\x01\x36\xf0\xcd\x01\x24\xd3\xfc\x55\x6d\x59\x1e\x83\xb2\xbd\xae\x3b\xc7\x65\x9b\x94\x8b\x9b\x76\x27\x17\xd5\xb6\xe4\x50\x19\x00\xdb\xcd\x94\xf8\xba\xde\x33\xa5\x2d\xd7\x36\x90\x96\x6b\x92\xb2\x1c\xa9\x1c\x54\xc9\xed\x29\x97\x9d\x59\x3f\x65\x59\x05\xdc\xc0\xbf\x0a\x28\x85\xa9\x4e\xeb\xee\xaa\x51\x48\x5c\x56\xd8\xd4\x6f\xc8\x9f\xe9\x15\x9f\x82\x54\x40\x4f\x7d\x4c\xa2\xbe\x15\xc1\xef\x50\x5b\x04\x3f\x44\x6d\xae\x71\xe4\x5d\xce\x9f\xb8\x12\xf6\x16\xf8\x35\xaf\xe9\xc4\x8b\x50\x34\x34\x78\xfc\x00\xa0\xe6\xe2\x77\x2a\x58\x76\x2d\x0b\x7f\xae\x35\x2c\xc0\x87\xf6\xc2\x32\xd2\x0f\x5d\xb8\xfa\xf2\x24\xfd\x40\xd8\x1c\xf0\xfb\x18\xbf\x68\xb8\x90\x2b\x49\x75\x50\x60\x98\x21\x2c\x9a\xac\x37\x0c\xdc\x84\xd1\x22\x3e\xcc\x88\x3e\x24\xc0\x07\xe6\x85\x7d\x39\x2b\x3f\x20\x00\x45\x24\x05\x14\x01\xe4\xf7\x2b\x92\x88\x7c\x20\x19\x91\x10\x97\x2a\xc3\x77\xf9\x79\xc3\x4d\xe7\xb6\x59\xfb\x4f\x00\x00\x00\xff\xff\x13\xe4\x4d\x31\xcd\x2c\x00\x00") +var _idracPy = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x3a\x7b\x73\xda\xb8\xf6\xff\xf3\x29\xf4\x63\x67\xc7\x30\x4b\x0c\xe4\xd1\x6d\xf9\x95\xee\x50\x20\xbb\xcc\x96\x24\x37\x24\xbb\xbd\x93\x9b\xf1\x28\xb6\x48\xbc\x35\x36\x2b\xd9\x25\xdc\x4c\xbe\xfb\x3d\x47\xf2\x43\xb6\x31\x94\xe4\x76\xe6\xa6\x33\xb5\x2c\x9d\x97\xce\x5b\xc2\x3f\xfc\x5f\x3b\x12\xbc\x7d\xe7\xfa\x6d\xe6\x7f\x25\xcb\x75\xf8\x10\xf8\xb5\x9a\xbb\x58\x06\x3c\x24\x94\xdf\x2f\x29\x17\x2c\x79\xff\x4b\xc0\x62\x3c\x0e\x44\x32\xe2\xe9\x7a\x14\xb9\x4e\x6d\xce\x83\x05\x79\x5c\x78\x26\x0b\x39\x63\x24\x5e\x1a\x7b\x6c\xc1\xfc\xf0\x0a\xa7\xa8\x20\xe3\xab\x5a\x86\xfe\x77\xc4\x44\x28\x14\x62\xf2\x66\x2e\xa9\xfd\x85\xde\x33\x61\x46\xdc\xf3\xdc\xbb\x23\x93\x3d\xda\x6c\x19\xba\x81\x2f\x12\x9a\x13\x5f\x30\x3b\xe2\xec\x52\xe1\xfc\x49\xb9\xef\xfa\xf7\xb5\xda\xf5\x6c\x7c\x49\xfa\x20\xa1\x09\x7b\x72\x79\xe0\xdf\x18\xd3\xc1\xd9\xe0\xd7\xf1\x74\x7c\x76\x65\xe1\xaa\x75\x36\x98\x8e\x8d\xdb\xda\xc5\x60\x36\xdb\x01\x89\x20\x7f\x9e\x5f\x8e\x00\xba\x36\x1b\xfe\x36\x9e\x0e\x00\xa1\xfe\x10\x86\xcb\x5e\xbb\x2d\xec\x07\xb6\xa0\xc2\x74\x16\xe1\xdc\x0c\xf8\x7d\x7b\x75\xc7\x16\xed\x95\xb0\xdd\x45\xbb\xdb\x86\xff\x0f\x14\x44\xfb\xb0\x5e\xfb\x3c\xfd\x74\x36\xb3\x90\x5d\xfd\x29\x46\x5f\xad\x56\xe6\xea\x48\x22\x1e\x76\x3a\x47\xed\xce\x49\x5b\x04\x74\x79\x00\xc2\x30\x2f\x58\xb2\xe7\x04\xeb\xcf\xd9\xf8\x4c\x47\x4c\xf8\x82\x9a\x11\x41\xb1\x16\x48\xe4\xb8\xdd\x79\x07\xa6\x8c\x16\x8c\x53\x54\x96\x46\x02\x76\xb6\x89\x46\x51\xf6\x05\xf5\x41\x76\xf9\x34\x1f\x85\x93\x12\x38\xeb\x5a\x1f\x07\xb3\xf1\x46\x12\xcc\xf3\x4c\x3b\x58\x54\x6f\xbf\xfd\xa3\x00\x42\x3f\x90\x5f\x99\xcf\xb8\x6b\x13\x49\xfe\xc0\xe6\x74\x1e\x32\x87\xe0\x1e\xc8\x82\x09\x01\x06\xaf\xcd\xce\x07\x17\xd6\xf8\xec\x7a\xaa\x44\xb6\xae\xc6\xd3\x8b\x4f\x83\x2b\x64\x6c\x18\xc6\xfb\x5f\x60\xcf\xe4\x2b\xe3\x02\x36\xd7\xaf\x77\xcd\x4e\xfd\x97\x0f\xb5\xf7\xa2\x37\x8e\x75\x86\xae\xe7\x8b\x9e\xe8\xd7\xbf\x51\xc9\xf5\x18\x63\x25\x68\xbf\x68\xd7\x8d\xfa\x7d\xdb\xa6\x8e\xc3\x41\x5a\x70\xb6\x0c\x19\xf6\x53\x42\xdf\xa1\xda\x0c\x99\x95\x71\x77\x9b\xb6\xfe\xa1\x46\x08\xec\xfc\x37\x46\x1d\xc6\xf1\x05\x5e\x61\x17\xbd\x81\x8d\xcb\x44\xf4\x16\x91\x08\xaf\x7d\x58\x14\x21\xf5\x9d\x7e\x3d\xe4\x11\xab\x7f\xd8\x9b\x51\x7b\x1c\x8f\xd9\xfb\x76\x46\x5f\x63\x78\x15\x54\x32\x7b\x82\xbd\x82\x55\x31\xf6\x2d\x88\xe4\x67\x45\xe1\x2a\x48\xb1\x61\xbd\x77\xc9\x44\x10\x71\x9b\x5d\x5f\x4e\xaa\x09\xf1\x18\x48\x92\x28\x60\x69\xb2\x4c\x95\x1b\x4d\x46\x95\x94\x30\x4b\xf5\x9e\xf0\xff\x58\x9a\x14\x45\x23\x73\xc9\x96\xde\x3a\x11\x33\xd1\xab\x32\xfb\x37\x29\x50\x77\x92\x36\x0f\x3c\xd6\xa6\x7e\xe0\xaf\x17\x41\x24\x62\x25\xc6\xc4\x14\xcb\x76\x89\x67\xac\x9a\x19\xf3\x98\x1d\x06\x7c\xc6\x42\x4d\x16\x7d\x85\x9c\xd1\x05\xeb\xd7\x2d\x0b\xe2\xcd\x87\xa1\x80\xcc\x89\xfa\x12\xf1\x7a\xaa\xaf\x04\x21\x63\xb9\x81\xc1\xfb\xb6\xee\x50\xe0\x5d\x1f\x03\x67\x9d\x4a\xc4\xfc\x5e\xea\x0b\x05\x71\xce\x21\x37\x2f\xdc\x7f\xb3\xb1\xe6\x37\x05\x90\x29\x7d\x8c\xcb\x80\x40\xbf\x78\xb4\x58\xfc\x96\x8a\xa8\x43\xa4\x52\x16\x99\xa2\x88\x4a\x2a\x1c\x25\x71\xff\xa1\x06\xd9\xa1\x76\x3a\xb4\x26\x67\xa7\xe7\xd6\xf8\xf3\xc5\xe5\x78\x36\x9b\x9c\x63\xca\xe3\x0c\x93\xd3\xd2\xf5\x58\x83\x1b\x8d\x9b\xce\xc1\xbb\xdb\x9f\x9a\x07\xea\x69\x34\x6b\xb5\xe9\x60\x68\x01\xf8\xe9\xe4\xb3\xf5\xf1\xd3\x60\xf8\xfb\xa7\xc9\xec\x0a\xd0\x6e\xa4\x04\xc6\x49\x07\xfe\x1d\x1b\x2d\x62\x1c\x1d\x9d\x74\xde\x9c\xe2\xa8\xd3\x79\xf7\xf6\xe7\x37\x6a\x84\x7f\xe9\x68\x88\xa3\xc3\xce\x71\xf7\xe4\x08\x47\xdd\xe3\x77\xdd\x43\x58\x55\x94\x3a\xe0\x1a\x8a\xd2\xe9\xf8\x14\xfe\x24\xc4\xe0\xf4\xdd\xa1\xc2\x3f\xec\xbc\x55\xa3\xd1\x78\x30\x3a\x1c\x2a\xb8\xc1\xe8\x78\x04\xf8\xb7\x35\xa8\x45\x93\xc1\xa7\x0d\x02\x9e\x05\x3e\x03\x50\x04\x3f\x0b\x42\x32\xf8\x4a\x5d\x8f\xde\x79\x0c\x27\x3e\x3f\xca\x7f\x38\x3c\xc0\x3f\x1c\xdc\x5c\xfb\x5f\xfc\x60\xe5\xdf\x66\xe2\xab\x2d\x28\x21\x91\xc6\x6c\xc9\x6c\x77\xee\x32\x07\x41\xfe\xf9\x7b\xb7\x33\x1c\x49\x59\x0f\x8f\x8e\x4f\xde\xfc\xfc\xf6\x5d\x47\x31\xf3\x25\x0f\x08\xfe\x8f\x8c\x9c\xba\x9e\x07\x99\xfc\xe3\x9a\x9c\x9b\x63\x73\x6a\x4a\x99\x6b\x35\x87\xcd\x89\x1f\xf0\x05\xf5\xc0\x35\xac\x05\xb5\xad\x38\x2c\x1a\xda\xb8\xd9\x93\xac\xb5\x19\xd8\x9c\xf6\x66\x46\xcb\x25\xe3\x8d\xa6\xc9\x21\x40\xc0\xb9\x1b\x86\xdc\x48\x0f\x6c\x87\x78\x9c\x85\x11\xf7\x75\x04\x60\x5c\xdd\x47\x38\xae\x40\xf5\x58\x2b\xd5\x2e\x88\xc6\xe6\x36\x02\xfc\xa2\x66\x7b\x14\x64\x99\x38\x9c\xda\x63\xce\x03\xde\x18\x27\x3d\x48\x2c\xf2\x92\x4a\x66\x31\xdc\xe8\x72\x30\x6c\x04\x77\x7f\x41\x3c\xc1\xba\x04\xc0\xfd\x5b\x96\xeb\xbb\xa1\x65\x35\x20\x22\xe7\x2d\xf2\x10\x88\xb0\x45\x22\xc1\x78\x4b\xe2\xaf\x02\xee\xc4\xe4\xf0\x0f\x81\x4c\x84\x01\x1d\xe0\x23\xbf\x80\x68\xb0\x80\x8f\xfc\x42\x42\x09\x16\x93\x61\x26\x01\x8f\x7c\x0b\x22\x00\x22\xcc\x89\x85\x90\x12\x5b\x98\x2e\x5a\x24\x49\x14\x7d\x83\x07\x41\xd8\x76\x20\x8f\x18\x9a\x40\xf9\x04\x9e\x34\x3f\x02\x12\xe0\xd3\xb3\x0a\xdb\xba\x39\x47\x13\x87\x8d\x54\xf6\x66\x8a\x7d\x8f\x05\x1f\x02\xd7\xb1\x30\xe1\xa2\xe8\xf0\x30\xf1\xbf\x6e\x23\x83\x8a\x6b\x3f\x2c\x57\x55\xff\x84\x45\x8a\xa2\x2c\xaf\x2a\x40\x5f\x35\x66\x26\xe4\x79\xee\x2e\x1b\x46\xdb\x68\x92\x9f\x08\x3c\xe0\x7f\x6d\xa7\x39\xdc\xfc\xb6\xfa\xf9\xd7\x3c\x28\x4a\xdb\xcf\x6f\x24\x0f\x90\x6a\x30\x19\x14\x59\x65\xa9\xae\x7f\x78\x72\x92\xad\x66\x1a\x88\x9d\x78\x7c\x65\x42\xb7\xa5\x14\x69\x41\xe6\x73\x2c\x2c\x2d\xf9\x5d\xa3\xb8\x46\xd1\x06\x46\xd9\x06\x05\x21\x94\x8a\xfb\xf1\x53\x93\xa1\xa9\xb9\x6a\xc6\x52\xf9\x09\xea\x22\x41\xd5\x7c\xa2\x5e\xaf\x5f\xf1\x35\x09\xa1\xee\x03\x42\xae\x7f\xc3\xc9\x25\xb0\x97\xce\x12\x61\xf9\x23\x28\x2b\xb9\xa3\xc2\xb5\x53\x02\x34\x0a\x1f\x40\x1d\xae\x2d\x0b\x85\x09\x49\x2c\x04\x4f\x0c\x1f\x68\x48\x56\x8c\x38\x81\x6f\x84\x44\x80\x22\xe1\xb0\xe0\xaf\x81\x89\xc0\x76\x8f\xb8\xbe\xda\x24\x8c\x33\xf9\x21\xbd\x90\xaf\x90\x5f\x1c\x30\x0e\x99\xcd\x3e\x11\x9b\xf1\x10\xb2\x17\x90\x66\x26\x19\x00\xfa\x3c\xf0\xbc\x60\x85\x92\x24\x59\x81\xac\x20\x5d\xc1\xdb\x01\x8a\x9f\x52\x92\x22\x4a\xd1\xc8\x83\x2c\x81\x84\xde\x53\xd7\x37\xf5\x6d\x67\x06\x93\x85\x25\x49\x32\xb0\xe1\x92\x91\xf2\xfa\x07\xf1\x68\x59\xf9\x89\x2e\xfa\x8d\x34\xbc\x5b\xf9\x80\x2e\x98\x11\x3a\x5f\x77\xbe\xee\x9f\x52\x4f\x14\xc8\x28\x91\x45\xff\x29\x37\x8b\x7f\xc6\x30\xf0\x43\xd0\xf6\xc1\xd5\x7a\xc9\x8c\x1e\x31\xe8\x72\xe9\xc5\xaa\x97\xbd\xf0\x4f\xd0\xc2\xfc\xbf\xfd\x80\x47\xbd\xb0\x7f\x7d\x75\x7a\xf0\xd6\xc8\xd3\x7e\xde\xe4\xb2\x2e\xa6\x76\x38\xbf\x99\xc1\x97\x5e\x0e\x1a\x16\xb8\x09\x2d\x57\x18\x09\x48\x3b\x0e\x84\x75\x9f\x1c\x77\xba\xbd\x92\x60\x9c\xba\x82\xe9\xf9\xb5\x3e\x40\xe5\x33\x1c\x9b\x70\xbc\x93\x66\x95\xc9\x0e\xe3\x97\x80\xa1\x13\xad\x98\xf5\x66\x6d\x2b\xa5\x12\xaf\xfa\x0c\x36\x2a\xd7\x7a\x04\x1a\x2d\x38\x46\xb2\x1e\x79\x7a\xfe\x97\x1f\xa7\x7d\x7c\xa9\x6f\xcc\x32\x29\x0f\x33\x64\x8f\x61\x1a\x0e\xad\x12\x50\xc1\x54\x99\x84\x72\x43\xc2\x5a\x52\xd8\x1c\x9c\x62\x9e\xc4\x33\xf6\x2f\x6d\x78\x9e\xd2\xc8\x0b\xb3\xd8\xed\xc7\x87\xc4\x12\xaa\xe7\xca\x82\x70\x73\x5b\x5c\xf0\xa5\x7e\x93\xbc\xa1\x44\x6c\x9a\x73\x17\x32\xbd\xc6\x35\x67\x34\x0d\x33\x6f\x92\x02\x2f\x04\xb0\x90\x1e\x04\x10\x27\xd9\x9b\xeb\xeb\x24\x4c\x37\x84\x78\x83\xf9\x46\xf3\x76\x4f\x93\x18\x39\x93\xa4\x56\x68\xc1\x8b\x90\x06\x8a\xf9\xe0\xa4\xb1\xd5\x34\x89\x49\x88\xd1\x32\xcc\xbf\x02\xd7\x6f\x68\x7b\x69\x6e\xb0\x54\x85\xa1\xe2\x2c\xac\xd4\x18\xb7\x2f\xd6\x3d\x0b\x2d\x48\x0d\xcc\xc2\xf4\xd3\x70\x71\x43\x96\x2a\x17\x3c\x4e\x89\xf2\xa2\xa3\x4f\x72\x4b\xa6\x5e\x74\x8d\xd1\x70\x32\xb5\x66\x6b\x11\xb2\xc5\x1f\x2e\x5b\xc5\x9d\x8b\x3c\xfe\x59\x7e\x17\x70\xf3\x67\xec\x1f\x49\xbd\x80\xa1\x12\xcf\xdf\xf2\xf4\x1d\x7b\xcf\x73\xda\x15\x27\xfa\x82\xb9\x09\xc0\x0b\x78\x16\xd1\x4b\xea\x8b\x3d\xad\x55\x98\xc0\x9b\x86\xf2\x1c\x54\xe2\x6c\x32\x91\x5a\xcd\x24\x3d\x98\x0d\x51\x89\x7d\x1b\xea\x42\xfa\x1f\xf5\xbc\xc6\xdf\x6a\x35\xc9\x14\x0a\x28\x73\xba\x72\xfc\x4f\x7c\x00\x01\xb8\x10\xf2\xbe\x58\x41\x06\x06\x67\x83\x4a\x51\x30\x42\x12\xfd\x50\xff\x21\x7c\x80\x69\x96\xf3\x8c\x05\xf8\xa4\x27\xeb\x3d\x64\x3a\xd0\x55\x65\x58\xc7\xd2\xdc\x74\x6e\x55\xb8\x94\x33\xc6\xd3\xb3\x86\x9b\xee\x9a\x18\x53\xea\x47\x73\x6a\x83\xab\x30\x6e\x14\x83\x5e\xba\x8e\xa9\x1a\x91\xac\x63\xad\x43\x36\xb3\xcd\x7a\x0b\x4a\x48\x01\xe1\x15\x62\xe0\x4e\xb7\xf3\xd7\xd2\xb6\x1a\x3e\xcb\xff\x21\xa1\xba\x14\x94\x14\x2d\xee\x98\xaa\x63\x15\x32\x54\xf2\x1e\x3e\x40\x22\x76\xc5\x8c\xf1\xaf\xae\xcd\xae\xe8\x7d\x22\x47\x9e\x7f\x62\xfd\x3c\x43\xf4\x05\xb0\x6b\xf1\x44\xa3\xf9\x85\xb4\xeb\x8d\x91\x43\x33\x6e\x41\xd2\xdc\x8c\xde\xfd\x2b\x14\x3d\x64\xb5\xf3\x00\x13\xaf\x09\xdb\xb3\xc9\x70\x9f\x98\x8d\xc1\x5f\x14\xb0\x09\xee\x77\x8e\xd6\x9c\x6a\xb2\xb2\x82\x69\x5e\xb9\x82\x0c\xbb\x7c\x20\x67\xd6\x09\xf9\xba\x57\xe8\x6f\xed\xd4\x89\xf6\x75\xe2\x61\x04\xe1\xee\x87\x70\x04\x8f\x2f\x44\x36\x3b\x74\x56\xf6\xe4\x09\x8c\x0c\x42\x70\xb0\xbb\x28\x64\xaa\x7c\xe4\x30\x6c\xe8\x76\x5c\x3f\x62\xc5\x46\x05\xc4\xdc\x01\xa8\x36\x52\x79\x5e\xcd\x55\x51\x78\xbf\xe9\xbd\xb9\x45\x4d\x6d\xba\x3f\xd8\xcd\x29\xb3\x80\x09\xfd\x18\xf4\xa1\x19\x8b\xf2\x89\x96\x09\xdd\xb5\x97\x3c\xb0\x61\x12\x0a\xdc\x6b\xfc\x7a\x78\x71\xbd\x8f\x5f\xc7\xe0\x2f\xf2\xeb\x04\xf7\xbb\x57\x21\x4c\x02\xfb\x7b\xb4\xac\x19\x05\x17\xde\x95\x76\x37\x24\x3a\xa5\xfb\x42\x70\x00\x2d\xf6\x88\xd6\xf0\x37\xf4\x2e\x5b\x63\x06\xff\x2a\xa5\x98\xf8\x78\xa7\x69\xb3\xc9\xa8\x18\x30\x52\x1d\xf9\x2a\x24\xa0\xdd\x0f\x1b\x86\x69\x34\x6f\x0e\xba\xb7\x95\x5d\xaa\x0a\xad\xc6\x1f\xd4\x8b\x54\x5c\xb5\xa0\x6a\x81\xf4\x72\xdc\xdc\xe1\xd1\xb1\xee\x13\x5f\xce\x9f\x42\x0c\xd8\x26\x13\x50\x90\x51\x0b\x2f\x4b\x14\x67\x32\xe5\x9f\xcf\x2f\x12\xdf\x1f\x4a\x92\x5b\xcb\x5f\x61\x31\xdf\x1b\xc8\x97\x02\x80\x58\x32\xe6\xbc\x4a\xcc\x29\x7d\x1c\x7a\x81\xfd\x65\x26\x29\xed\x25\x9d\xf4\x14\xc9\x1c\x9e\x85\xb5\x39\x5d\xb8\xde\x1a\x16\x5f\x98\x65\x2f\xae\x4f\x15\x85\x6f\x6c\x17\x24\x53\x8f\xde\x81\xa7\x97\x34\xf5\xdc\x2c\x17\xde\x5c\x7a\x5a\xb0\x45\xc0\xd7\xaf\x49\x4d\x53\x49\x61\x9f\xec\x94\x61\xbc\x28\x41\x69\xe8\xdf\x3d\x47\x49\xb5\xdd\xa4\x40\x4f\x9b\x95\x6e\xc8\xd6\xb5\xfa\xd8\xf3\xf2\xd4\xb1\xad\x7d\xdd\xe5\x13\xaf\xe4\xbc\xa9\x63\xdd\xc5\xb2\xe8\x95\x02\x2a\xf3\xab\x42\x74\x86\x04\xf6\x8a\xcc\xd7\xa7\x85\xff\x5e\x3a\x78\x96\x45\x4d\x4d\x6a\xb5\x2d\xf9\xb9\x8e\x35\x0a\x55\xae\x45\xa0\x50\xf0\xb0\xdf\x55\xee\x77\xab\x07\xaa\xe3\x8a\x2f\xaf\x6a\x21\x2e\x1e\xd6\xc2\xb5\xa9\x37\x02\x42\xfb\x44\x6b\x11\xef\x45\x31\x5b\x22\xf2\xbf\xda\x5d\x68\xf1\xb6\xad\x4f\xde\x3b\x60\x2b\x5a\x90\xac\xca\xc9\xcb\xa6\xea\x34\xa2\x0b\xb6\xe9\x50\xfa\xc2\x03\xe9\xb7\x9d\x47\xd3\x11\xc6\x33\x9c\xea\xad\xbb\x75\x28\x0f\x23\x95\xbc\x0d\xe4\x6b\x54\x04\xf4\xc4\xff\x88\xf8\x65\xf5\x64\x7c\x36\x1e\x7a\xf7\xe2\x23\x29\xa8\x46\x64\x0b\xa3\xed\x9d\x90\x96\xbe\x4a\x9a\xdd\x38\x59\xd6\x11\xc5\x2b\x77\x7d\x26\x51\x2f\xde\x90\x76\xca\xc9\x95\xb4\x49\xb7\x73\x78\x9c\x7f\x6c\xcf\xb1\xb9\x83\x77\xaf\xa0\x3b\xc9\x5f\x9f\xd1\xf9\x1b\xc6\xb6\x2e\x62\xc3\x0f\x31\x1b\xba\xb2\x4d\x50\x69\x07\xb4\xd9\x6b\x77\x36\x25\x73\xf7\x0e\x2c\xfe\x40\x7d\x1f\xe8\xdb\x94\x3b\xaf\x4b\x7c\xc3\xc9\x88\xe1\xd5\xc7\x5e\x59\x4f\x47\x7a\x59\xca\xcb\x51\xf8\xce\xf9\x2e\x12\xcc\xb1\x5c\x79\xa9\x27\x58\xd8\x78\x5d\x12\x94\x5e\xf0\x92\xec\x57\x1f\x31\x61\x83\x77\xc9\x2f\x5e\xaa\x83\x0e\x4e\xe4\x86\x34\x31\x89\x6d\x6c\x24\xd7\x4c\x92\xb3\xe9\x05\x2b\xfc\x09\x79\xe7\xb1\x3c\xb4\xf1\x8a\xbe\xfc\x19\x81\x29\x18\xe5\xf6\xc3\xa6\x2b\xc4\x3d\xd3\x64\xfd\xf4\x1f\xa3\x51\xf1\x16\x50\xed\x66\xcb\xaf\x2c\x52\xb2\x1d\xd2\x2f\xe3\x82\x68\xc9\x1f\x5a\x25\x86\x79\xcf\x83\x68\xd9\xe8\xe6\xe8\xe9\x70\xa0\xa0\xc4\xce\x3b\xa8\x27\x60\x26\x75\x9c\x86\x46\xa2\xf9\x8d\x89\x4f\x43\x81\x28\xd6\xde\x2a\xf2\x85\x7c\x7e\x5b\x80\xab\x68\x75\x64\x64\x54\xdf\xd2\x6b\xeb\xa0\x9e\xad\xd7\xfa\x35\xe5\x0c\xf9\x5b\xb2\x9d\xb7\x8a\xb5\x58\xbf\x39\x98\x4c\xab\x1a\xff\x1b\x23\x07\x23\xaf\x36\xf3\xb7\x3d\xd2\x9e\xe9\x35\x4f\xc2\xbd\xf2\xe2\x27\x61\x9d\x01\x54\xf0\xcd\x00\x24\xd3\xec\x55\x6d\x59\x1e\x83\xd2\xbd\x6e\x3a\xc7\xa5\x9b\x94\x8b\x55\xbb\x93\x8b\x6a\x5b\x72\xa8\x0c\x80\xed\x66\x42\x7c\x53\xef\x99\xd0\x96\x6b\x15\xa4\xe5\x9a\xa4\x2c\x47\x2a\x07\x95\x72\x7b\xc2\x65\x67\xd6\x4f\x58\x96\x01\x2b\xf8\x97\x01\xa5\x30\xe5\x69\xdd\x5d\x35\x0a\xb1\xcb\x0a\x9b\xfa\x0d\xf9\x33\xbd\xe2\x93\x93\x0a\xe8\xa9\x8f\x49\xd4\xb7\x22\xf8\x1d\x6a\x8b\xe0\x87\xa8\xcd\x0d\x8e\xbc\xcb\xf9\x63\x57\xc2\xde\x02\xbf\xdf\x35\x9d\x68\xb1\x14\x0d\x0d\x1e\x3f\x00\xa8\xb9\xf8\x9d\x0a\x96\x5d\xcb\xc2\x9f\x6b\x0d\x0b\xf0\xa1\xbd\xb0\x8c\xe4\x43\x17\xae\xbe\x3c\x49\x3e\x09\x36\x07\xfc\x3e\xc2\x2f\x1a\x2e\xe4\x4a\x5c\x1d\x14\x18\x66\x08\x8b\xc6\xeb\x0d\x03\x37\x61\xb4\x88\x0f\x33\xa2\x0f\x09\xf0\x81\x79\xcb\xbe\x9c\x95\x1f\x10\x80\x22\xe2\x02\x8a\x00\xf2\xfb\x15\x49\x44\x3e\x90\x8c\x88\x89\x4b\x95\xe1\xbb\xfc\xbc\xe1\xa6\x73\xdb\xac\xfd\x27\x00\x00\xff\xff\x98\x3b\x46\xe1\xbf\x2c\x00\x00") func idracPyBytes() ([]byte, error) { return bindataRead( @@ -104,7 +105,27 @@ func idracPy() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "idrac.py", size: 11469, mode: os.FileMode(493), modTime: time.Unix(1463986460, 0)} + info := bindataFileInfo{name: "idrac.py", size: 11455, mode: os.FileMode(493), modTime: time.Unix(1465476904, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _iloPy = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x59\x7b\x6f\xe3\xb8\x11\xff\xdf\x9f\x82\xe7\x43\x21\x09\xf5\x6a\x1d\x3b\xbb\xdd\x4d\xe1\x02\xbe\xc4\x69\x83\xc6\x49\x10\xe7\xfa\x80\x11\x08\xb2\xc4\xd8\xbc\x95\x28\x9d\x28\x25\xf1\x15\xf7\xdd\x3b\x43\x52\x12\x65\x49\x9b\x64\xd1\xc3\x55\xf9\x23\x12\xc9\x19\xce\xe3\x37\x0f\xd2\xdf\x7f\xf7\xbe\x10\xd9\xfb\x0d\xe3\xef\x29\x7f\x24\xe9\x3e\xdf\x25\x7c\x30\x60\x71\x9a\x64\x39\xf1\xb3\x6d\xea\x67\x82\x96\xdf\x3f\x09\x98\xd4\xef\x89\x28\xdf\xc4\x5e\x0c\x1e\xb2\x24\x26\x41\x92\xee\x89\x1e\x0c\x29\x4d\xf1\xbb\xe2\xb5\x4b\x59\x94\x0c\x06\x83\x1f\x57\x8b\x5b\x32\x03\x72\x17\x36\x64\x59\xc2\xd7\xd6\x72\x7e\x35\xff\xeb\x62\xb9\xb8\xba\xf3\x70\xd6\xbb\x9a\x2f\x17\xd6\xfd\xe0\x66\xbe\x5a\xbd\xb0\x12\x97\xfc\xf3\xfa\xf6\x0c\x56\x0f\x96\xf3\x53\xef\xe6\x76\x71\x7e\xf1\x2f\xef\x87\xcb\xf9\xe9\xdf\x2f\x2f\x56\x77\x40\xbe\x1e\x10\x78\xac\x0f\x63\xf8\x3b\xb6\x46\xc4\x9a\x4e\x3f\x8c\x3f\x9e\xe3\xdb\x78\xfc\xf9\xd3\x9f\x3e\xaa\x37\x7c\xaa\xb7\x53\x7c\x9b\x8c\x8f\x8f\x3e\x4c\xf1\xed\xe8\xf8\xf3\xd1\x04\x66\x15\xa7\xf1\x64\xac\x39\x9d\x2f\xce\xe1\x91\x2b\xe6\xe7\x9f\x27\x8a\x7e\x32\xfe\xa4\xde\xce\x16\xf3\xb3\xc9\xa9\x5a\x37\x3f\x3b\x3e\x03\x7a\x90\xf2\x6c\xf1\x8f\x8b\xd3\x85\x77\x71\x75\x7e\xed\xdd\x2d\x96\x37\x97\xf3\xbb\x05\x48\xf9\x1f\xc9\x7b\x18\x27\x21\x8d\x3c\xee\xc7\x74\x78\x42\x86\x43\xb5\xe3\x30\xcd\x92\x80\x0a\x91\x64\x02\x46\xd7\xf7\x7a\x34\xf6\x03\xcf\x0f\xc3\x0c\x66\x68\x63\x22\x64\xe2\x8b\x1e\x20\xd5\xf3\x3d\x29\x78\x21\x68\x48\x6c\xe9\x08\x12\x26\x54\x70\x2b\x27\xc0\xfb\x91\x85\x94\x88\x22\xd8\x11\xc6\x1f\x12\x47\x31\x11\x34\x63\x3e\x88\x52\xc4\x1b\x9a\x99\xc2\xc4\x34\x4e\xb2\xbd\xde\xef\xd7\xc1\xe0\xe6\xf6\xfa\x74\xb1\x5a\x5d\xdf\xbe\x42\x9d\xb7\x8b\xf1\xe0\xc7\x2c\xda\x97\xd4\x4a\x11\x45\x99\xd1\xbc\xc8\xb8\x80\xc5\x80\x2d\x9a\xd1\x11\xd9\x14\x80\x4a\x1e\xed\xc9\x43\x92\x11\x76\x79\x3d\x21\xb6\x7e\x9b\x92\x7c\xc7\x04\x79\x60\x34\x0a\x09\xbc\xd0\x38\xcd\xf7\x0e\xf2\xe2\xc9\xcf\xbe\xda\x29\xf2\x37\x34\x32\x15\x65\x3c\xa4\xcf\x30\x70\x95\x70\x3a\x6a\xd8\x50\x6d\x25\x18\x88\xe6\x67\x52\x5a\x64\xea\x3f\xfa\xf0\xbd\x89\x28\xf1\x45\xc9\x4e\xdb\x32\xa5\x34\x2c\x39\xa9\xa1\x20\xc9\xa4\xd3\xd4\x10\x98\x71\xb9\x58\x5e\xdf\xfe\xbb\xc3\x86\x2d\xb9\x04\xfb\x85\x36\x99\x75\xf0\x3f\x10\xfe\x1b\x24\x07\x99\x06\x41\xe4\x0b\x41\x2e\xa2\x64\x91\x65\x49\x66\x2f\x9e\x03\x9a\xe6\x2c\xe1\xce\x89\xdc\x25\x85\x59\x58\x15\xd2\x07\xb0\x63\x16\xfb\x11\x48\xe6\x19\xb0\xb4\x8d\x77\x4d\x62\x8c\x80\x8a\xc6\x97\x5b\xa4\x29\xcd\x6c\xc7\xcd\x68\x1a\xf9\x01\xb5\xad\x77\x18\x3a\x27\x96\x02\x82\xf2\xb6\x49\xa0\x37\xde\xd2\xdc\x03\x38\x78\x8c\x8b\xdc\xe7\x40\xb7\x4b\x44\xae\x37\x43\x98\xcc\x14\x5c\x5c\x50\x42\x4e\x21\x18\x67\xf8\x32\x22\x51\xb2\x65\x7c\x86\x79\x64\x24\x55\x79\x4a\xb2\x70\x86\x19\x05\x3e\x21\x63\xcd\x8e\x8f\xa7\x8d\xcd\x55\xfe\xc2\x4d\x3d\xdc\x15\x64\x11\x76\xe6\x3f\xc9\x97\x11\xce\x7a\x8f\x34\x13\xb5\x79\xbe\x27\x77\x3b\x4a\x42\x3f\xf7\x89\xc8\xb3\x22\x00\x26\x54\x62\x13\x32\x15\xa9\x22\x57\x73\x87\x90\x90\x39\x54\x81\x1b\x9c\x92\xc2\x78\xbe\x27\xdc\x17\xf9\x7e\xa4\xf9\x51\xf0\x74\x00\x61\x59\x63\x7c\x4a\x6c\x9e\x90\x20\xa2\xe0\x4e\x88\xfb\x9c\xf1\x00\x1d\x44\x36\x34\x7f\xa2\x94\x03\xd2\x37\x34\x0c\x81\xf9\xd5\xc5\x29\x38\x9a\x87\x9a\x13\x5b\x9d\xae\x2e\xa4\x9a\xc2\x71\x95\xb1\x1e\x4c\x15\xc8\x6c\x46\xa6\x4a\x0d\x7c\xc0\xb6\x19\xd8\x39\x7c\x06\x7b\x8e\xe5\x28\x8d\x04\xed\x9e\x3f\x3a\x74\x34\x45\x57\xaf\xef\xe5\x30\x8a\x1d\x03\xf0\x48\x69\xb8\x9a\x87\x8c\x4e\x89\x0a\x17\xcc\x6b\x5b\xea\x1b\x40\xb0\xbe\x77\xea\x45\xa8\xb6\xa2\xe7\x5b\x6a\x57\xfb\x82\x37\x29\xb7\x15\x89\x33\x22\x13\xa7\xe6\xab\x95\xb3\x1b\x03\xf5\x86\x6b\x76\xbf\xb6\x10\x15\xd6\x3d\x2a\x6d\xdd\x80\x4d\xac\xca\x52\x3d\xeb\x1f\xfd\xa8\x40\x82\xef\x80\x00\xbc\x60\xa1\x49\x21\x6a\x12\xbe\x15\x24\x4f\x48\xbc\x8d\xf3\xd2\xc3\x0d\x36\x07\x62\x69\x43\x81\xce\xdd\xf1\x53\xee\x48\xfe\x48\x8e\xea\x5d\x9d\x16\x0f\x50\x0f\xc8\xd6\x27\x1f\xef\x81\x51\x8e\xe6\xe9\x2a\x86\xed\xbd\x5b\x8e\x72\x7d\x88\x42\x1e\x62\xe0\xf6\xc5\x1d\x15\x66\x10\xc8\xd4\x63\x8b\x0a\xf1\xc2\x8f\x53\xc8\x23\x9a\x4c\x0a\x6c\xe0\x1a\xb2\xd8\xe4\xc3\x74\x4a\x96\x7f\xfb\x65\x58\x82\x4e\x20\xd8\x51\x6a\x4c\x55\x06\xa2\xc0\x28\x90\xda\x6d\xe1\x8a\x34\x62\xb9\x3d\x24\x43\x67\x3d\xbe\x6f\x48\xd5\x90\xa4\x2e\x92\x32\x28\xf1\x13\xc5\x92\xeb\xcb\x44\x21\xb3\xae\x1d\x18\x5e\x78\x85\xc4\xc7\x24\x79\x20\xc7\x44\xd2\xfe\x99\x7c\x82\x52\x92\x51\x3f\x14\xc3\x81\x61\xfd\xa0\x5b\x09\x7c\x02\xad\x48\x50\x29\x02\xec\x0c\x5d\x0c\x7d\x02\x25\x6d\xad\x49\x33\x6e\xd2\x32\x6e\xa4\x6e\xf5\x2e\xf8\x09\x2b\xcb\x8e\xcb\x6e\x57\x64\xa7\xb1\x76\x6d\xa9\xaa\x8a\x80\xc7\xcc\x64\xa7\x2a\xe0\xce\xd5\xe8\x08\x4a\x8d\x73\x48\x21\x8b\x82\x24\xd0\x8b\x2f\xe5\x80\x5c\x7b\xb0\x54\x42\x42\x2e\x35\x10\xa2\xa9\x56\x72\xae\xc5\x5d\xda\x56\x92\xd4\x5e\xd2\x14\x8b\x67\x1a\x14\x32\xa5\xdd\xd1\x60\xc7\x13\x48\xda\xfb\x43\x06\xca\x58\x25\x76\x71\xa4\x01\x93\x7a\x49\x23\x7d\xcb\x3e\x46\x25\x70\xf9\x7a\x08\x16\xac\xb3\x15\xb2\x5f\x8b\x95\xf1\xe7\x8f\x64\xf9\x43\x03\x1b\x3d\x00\x7f\x11\xe4\x4d\xa0\xcb\x50\x95\x72\xf6\x25\x53\x39\x59\xf3\x87\x6f\x13\x14\x07\xfd\x85\x63\xae\x33\xdd\x1b\xf7\xbb\x57\xae\x44\xab\x54\x9e\x92\x26\xd2\x14\x2b\x9c\x70\x0e\x57\x77\x61\x21\xee\xc1\x82\xd2\xa0\x4a\x41\x34\x6e\xa6\x20\x39\x0b\x1e\xec\x2c\xab\xcd\x22\xaa\x8e\x31\xef\xaa\x5a\xfa\x73\xc1\x72\x0a\x86\x0a\x12\xfe\x48\x39\xa3\xd0\x32\xa2\xed\x92\x22\x03\x6e\xd0\x17\xbd\x0b\x7c\x01\x6d\x52\x8e\x7d\x24\x4c\x50\xf2\x44\x09\x07\xe9\x30\x97\x03\x16\x77\x7e\x0a\xd4\x90\xd1\x09\x38\x29\x07\x00\x6c\x58\xee\x2a\x24\x41\x95\x86\x13\x12\xf5\xb0\xa3\xf0\x50\x26\x09\xa8\xea\xab\xab\x2d\xa8\x26\xab\x1e\x0f\x9f\x21\x9c\xa2\x3c\x6c\xc8\x8c\x4e\x5e\x8e\x77\x36\xff\x72\xa6\xd1\x89\xd7\xa3\x3d\xc7\x82\x5f\x7b\xaa\xfc\xe4\xa4\x51\x5c\x41\x9b\xbc\x84\x54\x25\x69\xab\x98\xe2\x2a\xed\xc5\x62\xf3\x13\x0d\x72\xcb\x91\xc5\x73\xb5\x17\x39\xe0\xee\x02\xf4\x80\x7a\x86\x61\x6b\xb5\xab\x4e\xc5\x16\xf0\xa1\x95\xb6\xee\xab\xe8\x05\xce\xed\x02\x07\x8e\x83\xd6\xa6\xa0\xaf\x95\xe3\xa6\x34\xda\xeb\x45\xa9\xed\xfc\xad\xc2\xb4\x3b\x0c\x7c\xfa\x44\x5c\xaa\x60\x3e\xa3\x8f\x2c\xa0\xdd\x0d\xc7\x01\xb9\x0c\x30\xd9\x72\xa8\x22\x0f\xcd\x4f\x14\x41\x08\xbd\xd4\x61\x18\x4a\x2a\xc8\xfc\x2f\xad\x0d\xd1\x85\x79\x0d\xe5\x37\xe6\x75\xef\xe6\xf4\xa7\x3e\x7c\xaa\x8e\xaf\x4d\xd8\x5e\x0b\xbe\xd4\xe7\x37\xae\x09\xbb\xfb\x99\x5e\x47\x54\x0b\x44\x75\x56\x90\x7c\x46\xd0\x38\x07\xb9\xd3\xeb\x81\x86\xb4\x75\xeb\x87\x3e\x5c\x18\xdd\xb5\xec\xea\xe7\x42\xb0\x2d\x8f\x21\xc1\x58\x9d\xbc\x3a\xbc\x53\x3e\xa6\x97\xcc\x10\x7e\xc9\x59\xe5\xb3\x81\xae\xe4\xcb\xd7\x5d\x49\xa3\xaf\x36\xf9\xdf\x12\xfe\x10\x68\x21\xa4\x60\x72\x85\x0d\xf4\x0b\xee\xfe\x4d\xe2\xbe\xbb\x3f\x78\xb5\x20\xbf\x45\xd4\xd7\xc2\xa9\x2a\xda\x90\xa6\x13\x66\xad\x20\x7f\x03\x81\xaa\xa2\x26\xc5\xef\x90\x0f\x5e\x19\xef\x66\x0c\xb7\x89\xbb\x63\x43\x95\x7b\x10\x21\x64\xd2\xcd\x58\xa3\xcb\x6d\x00\xc7\x7b\x28\xd0\x11\xc3\xcb\x0b\x75\xb7\x91\xef\xfc\xdc\x12\x58\xca\x7b\xb8\xc9\x1b\xa2\x27\x7f\x8f\xb5\x5d\x9d\x98\xb7\x05\x13\xbb\xea\xc4\x5c\x8a\x03\xb5\x5e\xe4\x52\x75\x9f\x71\x58\xd4\xc3\xae\x79\xc0\x7e\x14\xae\x3a\x5a\x0b\x75\xb6\x76\x7f\x97\x14\xf5\xaa\xd3\x6c\x07\x9d\x99\xda\xf0\x54\xfb\x7f\x99\xc2\xcc\x6b\x87\xcc\x67\x82\xd6\xf7\x53\xc3\x1f\xf9\x17\x9e\x3c\x71\x52\xe6\x37\x38\x69\x81\x1e\x27\xe4\x0f\xe1\xd0\x55\x6d\x80\x6d\xf6\x63\x4e\xd9\x12\xe1\xdd\x41\x67\x76\x72\xc8\x5f\xc8\x51\xef\x7e\x0d\x51\x87\x77\x12\x99\x62\x97\x14\x00\xf0\x0d\x55\x40\xc3\x00\xee\xea\x8a\xa4\x43\xc9\xb0\xc9\x01\xa2\x22\x2f\x5b\xdb\xaa\xa1\xdd\xec\x1b\xed\xac\x5b\xd3\x34\xda\xe3\x4a\xfc\x83\x7b\x31\xad\xab\xd4\x3b\xf6\xb9\xbf\xa5\x99\xf6\xe0\xc3\x53\x5d\x07\x88\x31\x8d\x41\xe9\xd5\x93\x76\x65\xa5\x7a\x4c\xc5\xad\x5a\x8f\xc5\xae\x3e\x7c\xab\xe6\x66\x88\x37\x53\xc3\xda\x6e\x8d\x9a\x43\xa6\x75\x31\x7a\x1b\xcb\x49\x2f\xcb\x49\x07\x38\x9a\x2b\xaa\xc4\x58\x5f\xe6\x95\xb3\xda\x62\x38\x12\xca\x6e\x4c\x3a\xdf\xb4\x58\x57\x1b\xdf\xa8\x90\x1d\x16\xac\x4f\x04\x4e\xab\xed\x7f\xdb\xb1\x41\x9f\x4a\x2b\xc9\x80\x41\xd7\xaf\x08\x87\xcb\x9a\xc5\xad\x3c\x82\x19\xd7\x24\x3d\x65\xb0\xb5\x5f\x2b\x9a\x81\x57\x8d\xfd\xfa\x2e\xb4\x3f\xfc\x3b\xf4\xe9\xd8\xa5\xf1\x93\xc3\xc1\x2e\x9d\xd1\x09\x47\x65\x5d\x04\x25\x25\xb9\x52\x94\xf2\xd4\xea\xc2\xd9\x90\xa5\x76\xef\x66\xf5\x4f\x13\x6f\xda\xa9\xd1\xef\xd4\xc7\xe3\xae\x0d\x74\x69\x2d\x0d\xaf\xef\x1b\x3a\x8a\x6f\x23\x8e\x0d\x1e\x1a\x97\x22\xf0\xf9\xc1\xad\x76\x09\x34\x7d\x0c\x6f\xdf\x7f\x0f\xda\x01\xf0\xb5\x84\xd0\x81\xb0\x57\x47\x83\xbe\xb2\xc2\x6b\x0c\xfc\x79\xd0\x0d\x8b\x38\x15\xb6\x41\x0a\x69\x76\x30\x80\x58\xf7\xa4\xb5\x3d\x4f\x96\x17\x0f\x98\x31\xee\x79\x56\xf9\x4b\x42\x26\xa4\x3a\xe5\x2f\x8e\xee\x3c\xdb\x16\x98\x07\x6e\xe4\x8c\xf6\xa3\x5a\xe6\x02\xb2\x3c\x5f\xcf\xdb\x16\x2a\x0c\xae\xe0\x30\x22\x66\x47\x23\x68\x10\xa2\x74\x26\x47\xb1\xc4\xa3\xf5\xf4\x71\x02\x17\xa8\xc3\x06\x32\x91\xff\x90\x8d\xd0\xcc\x73\xf3\xf6\x44\x1a\x1d\x27\x5d\x64\x54\xdd\xc9\x50\xf9\x0b\x08\xb1\xcb\x12\x30\xaa\x7f\x5d\x38\x4d\xe2\xb8\xe0\x2c\x90\xf9\x5d\x4e\x3a\xf8\x73\x0a\x35\xef\xe9\xd0\x48\xd4\x45\xb6\x8d\x5b\x1e\xc0\x99\x4b\x9f\x59\x6e\x1f\x39\x83\xff\x06\x00\x00\xff\xff\xaf\x4d\xaf\x79\x91\x1d\x00\x00") + +func iloPyBytes() ([]byte, error) { + return bindataRead( + _iloPy, + "ilo.py", + ) +} + +func iloPy() (*asset, error) { + bytes, err := iloPyBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "ilo.py", size: 7569, mode: os.FileMode(493), modTime: time.Unix(1465553782, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -163,6 +184,7 @@ func AssetNames() []string { var _bindata = map[string]func() (*asset, error){ "README.md": readmeMd, "idrac.py": idracPy, + "ilo.py": iloPy, } // AssetDir returns the file names below a certain @@ -207,6 +229,7 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "README.md": &bintree{readmeMd, map[string]*bintree{}}, "idrac.py": &bintree{idracPy, map[string]*bintree{}}, + "ilo.py": &bintree{iloPy, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory diff --git a/bundled_scripts/idrac.py b/bundled_scripts/idrac.py index 714dd33..7a49767 100755 --- a/bundled_scripts/idrac.py +++ b/bundled_scripts/idrac.py @@ -3,7 +3,6 @@ import argparse import json import os -import pprint import re import uuid from xml.etree import ElementTree as ET diff --git a/bundled_scripts/ilo.py b/bundled_scripts/ilo.py new file mode 100755 index 0000000..7ae33a6 --- /dev/null +++ b/bundled_scripts/ilo.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python + +import argparse +import json +import os +import sys +from copy import deepcopy + +import hpilo + + +USER = os.environ['MANAGEMENT_USER_NAME'] +PASS = os.environ['MANAGEMENT_USER_PASSWORD'] + +MAC_PREFIX_BLACKLIST = [ + '505054', '33506F', '009876', '000000', '00000C', '204153', '149120', + '020054', 'FEFFFF', '1AF920', '020820', 'DEAD2C', 'FEAD4D', +] + +DEVICE_INFO_TEMPLATE = { + "model_name": "", + "processors": [], + "mac_addresses": [], + "disks": [], # unused (hpilo doesn't provide such info) + "serial_number": "", + "memory": [], +} + +PROCESSOR_TEMPLATE = { + "model_name": "", # unused (hpilo doesn't provide such info) + "family": "", # hpilo returns int here, but only for iLO2 (for iLO3 this field is empty) # noqa + "label": "", + "index": None, # unused, but similar info is available as "label" + "speed": None, + "cores": None, +} + +MEMORY_TEMPLATE = { + "label": "", + "size": None, + "speed": None, + "index": None, # unused, but similar info is available as "label" +} + + +class IloError(Exception): + pass + + +def normalize_mac_address(mac_address): + mac_address = mac_address.upper().replace('-', ':') + return mac_address + + +def get_ilo_instance(host): + ilo = hpilo.Ilo(hostname=host, login=USER, password=PASS, port=443) + return ilo + + +def _get_macs(raw_macs, ilo_version): + # The data structure for MAC addresses returned from hpilo is pretty nasty, + # especially for iLO3 (no clear distinction between embedded NICs and + # iSCSI ports). + if ilo_version == 3: + start_idx = 0 + else: + start_idx = 1 + mac_addresses = [] + for m in raw_macs: + fields = m.get('fields', []) + for i in range(start_idx, len(fields), 2): + if ( + fields[i]['name'] == 'Port' and + fields[i]['value'] != 'iLO' # belongs to mgmt address + ): + mac = normalize_mac_address(fields[i + 1]['value']) + if mac[:6] not in MAC_PREFIX_BLACKLIST: + mac_addresses.append(mac) + return mac_addresses + + +def _get_speed(s): + # sample return value from hpilo: "2533 MHz" + if s is not None: + s = int(s.split(" ")[0]) + return s + + +def _get_processors(raw_procs): + + def get_cores(c): + # sample return value from hpilo: "4 of 4 cores; 8 threads" + if c is not None: + c = int(c.split(" of ")[0]) + return c + + processors = [] + for p in raw_procs: + proc = deepcopy(PROCESSOR_TEMPLATE) + proc['family'] = str(p.get('Family', "")) + proc['label'] = p.get('Label', "") + proc['speed'] = _get_speed(p.get('Speed')) + proc['cores'] = get_cores(p.get('Execution Technology')) + processors.append(proc) + return processors + + +def _get_memory(raw_memory): + + def get_size(s): + # sample return value from hpilo: "4096 MB" + if s is not None: + s = int(s.split(" ")[0]) + return s + + memory = [] + for m in raw_memory: + mem = deepcopy(MEMORY_TEMPLATE) + mem['label'] = m.get('Label', "") + mem['size'] = get_size(m.get('Size')) + mem['speed'] = _get_speed(m.get('Speed')) + memory.append(mem) + return memory + + +# The data structure returned from python-hpilo is quite inconvenient for our +# use-case, therefore we need to reshape it a little bit. +def _prepare_host_data(raw_host_data, ilo_version): + host_data = { + "sys_info": [], + "processors": [], + "memory": [], + "mac_addresses": [], + } + if ilo_version == 2: + for part in raw_host_data: + if part.get('Subject') == 'System Information': + host_data['sys_info'].append(part) + continue + if part.get('Subject') == 'Processor Information': + host_data['processors'].append(part) + continue + if ( + part.get('Subject') == 'Memory Device' and + part.get('Size') != 'not installed' + ): + host_data['memory'].append(part) + continue + if part.get('Subject') is None and part.get('fields') is not None: + fields = part.get('fields') + for field in fields: + if ( + isinstance(field, dict) and + field['value'] == 'Embedded NIC MAC Assignment' + ): + host_data['mac_addresses'].append(part) + break + continue + elif ilo_version == 3: + for part in raw_host_data: + if part.get('Product Name') is not None: + host_data['sys_info'].append(part) + continue + if part.get('Execution Technology') is not None: + host_data['processors'].append(part) + continue + if ( + part.get('Label') is not None and + part.get('Size') is not None and + part.get('Speed') is not None + ): + host_data['memory'].append(part) + continue + if part.get('fields') is not None: + for field in part.get('fields'): + # The condition here is not very reliable, but that's the + # only way to distinguish between 'fields' list containing + # embedded NICs vs. iSCSIs ports. + if ( + isinstance(field, dict) and + field['name'] == 'Port' and + field['value'] == 'iLO' + ): + host_data['mac_addresses'].append(part) + break + continue + else: + raise IloError("Unknown version of iLO: %d".format(ilo_version)) + if len(host_data['sys_info']) > 1: + raise IloError( + "There should be only one 'System Information' dict " + "in the data returned by python-hpilo." + ) + return host_data + + +def get_ilo_version(ilo_manager): + fw_version = ilo_manager.get_fw_version() + if fw_version.get('management_processor') == "iLO3": + ilo_version = 3 + elif fw_version.get('management_processor') == "iLO2": + ilo_version = 2 + else: + ilo_version = None + return ilo_version + + +def ilo_device_info(ilo_manager, ilo_version): + raw_host_data = ilo_manager.get_host_data() + host_data = _prepare_host_data(raw_host_data, ilo_version) + device_info = DEVICE_INFO_TEMPLATE + device_info['processors'] = _get_processors(host_data['processors']) + device_info['mac_addresses'] = ( + _get_macs(host_data['mac_addresses'], ilo_version) + ) + device_info['serial_number'] = ( + host_data['sys_info'][0].get('Serial Number', "").strip() + ) + device_info['model_name'] = ( + host_data['sys_info'][0].get('Product Name', "") + ) + device_info['memory'] = _get_memory(host_data['memory']) + return device_info + + +def scan(host): + ilo_manager = get_ilo_instance(host) + ilo_version = get_ilo_version(ilo_manager) + device_info = ilo_device_info(ilo_manager, ilo_version) + print(json.dumps(device_info)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('host', nargs=1, help='host to scan') + args = parser.parse_args() + try: + scan(args.host[0]) + except (IloError, hpilo.IloCommunicationError) as e: + print(e.args[0]) + sys.exit(1) diff --git a/client.go b/client.go index 39a651a..145a3ab 100644 --- a/client.go +++ b/client.go @@ -78,7 +78,7 @@ func (c *Client) SendToRalph(method, endpoint string, data []byte) (statusCode i return 0, err } defer resp.Body.Close() - if resp.StatusCode > 299 { + if resp.StatusCode >= 400 { body, err := readBody(resp) if err != nil { return 0, err @@ -97,13 +97,19 @@ func (c *Client) GetFromRalph(endpoint string, query string) ([]byte, error) { if err != nil { return []byte{}, err } - resp, err := c.client.Do(req) + defer resp.Body.Close() if err != nil { return []byte{}, err } - defer resp.Body.Close() + if resp.StatusCode >= 400 { + return []byte{}, fmt.Errorf("error while sending a GET request to Ralph: %s", + resp.Status) + } body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return []byte{}, err + } return body, nil } diff --git a/client_test.go b/client_test.go index 9326441..705c0ba 100644 --- a/client_test.go +++ b/client_test.go @@ -53,7 +53,7 @@ func TestSendToRalph(t *testing.T) { errMsg string want int }{ - "#0 Ralph responds with >299": { + "#0 Ralph responds with >= 400": { "POST", "non-existing-endpoint", []byte{}, @@ -88,3 +88,44 @@ func TestSendToRalph(t *testing.T) { } } + +func TestGetFromRalph(t *testing.T) { + var cases = map[string]struct { + endpoint string + query string + statusCode int + errMsg string + want []byte + }{ + "#0 Ralph responds with >= 400": { + "non-existing-endpoint", + "some_valid_query", + 404, + "error while sending a GET request to Ralph", + []byte{}, + }, + } + + for tn, tc := range cases { + server, client := MockServerClient(tc.statusCode, `{}`) + defer server.Close() + + got, err := client.GetFromRalph(tc.endpoint, tc.query) + switch { + case tc.errMsg != "": + if err == nil || !strings.Contains(err.Error(), tc.errMsg) { + t.Errorf("%s\ndidn't get expected string: %q in err msg: %q", tn, tc.errMsg, err) + } + if !TestEqByte(got, tc.want) { + t.Errorf("%s\n got: %v\nwant: %v", tn, got, tc.want) + } + default: + if err != nil { + t.Fatalf("err: %s", err) + } + if !TestEqByte(got, tc.want) { + t.Errorf("%s\n got: %v\nwant: %v", tn, got, tc.want) + } + } + } +} diff --git a/config.go b/config.go index d8b4d4c..7853091 100644 --- a/config.go +++ b/config.go @@ -33,8 +33,8 @@ var DefaultCfg = Config{ ManagementUserPassword: "change_me", } -// List of scripts that are bundled with ralph-cli (at this moment, only idrac.py). -var bundledScripts = []string{"idrac.py"} +// List of scripts that are bundled with ralph-cli. +var bundledScripts = []string{"idrac.py", "ilo.py"} // GetCfgDirLocation gets path to current user's home dir and appends ".ralph-cli" // to it, if baseDir is an empty string, otherwise appends ".ralph-cli" to baseDir path diff --git a/main.go b/main.go index b716e65..0488a41 100644 --- a/main.go +++ b/main.go @@ -40,14 +40,17 @@ func main() { app := cli.App("ralph-cli", "Command-line interface for Ralph") app.Command("scan", "Perform scan of a given host/network", func(cmd *cli.Cmd) { - addr := cmd.StringArg("ADDR", "", "Address of a host to scan (IP or FQDN)") - scripts := cmd.StringsOpt("scripts", []string{"idrac.py"}, "Scripts to be executed") + addr := cmd.StringArg("IP_ADDR", "", "IP address of a host to scan") + script := cmd.StringOpt("script", "", "Script to be executed") dryRun := cmd.BoolOpt("dry-run", false, "Don't write anything") - cmd.Spec = "ADDR [--scripts=] [--dry-run]" + cmd.Spec = "IP_ADDR --script= [--dry-run]" cmd.Action = func() { - PerformScan(*addr, *scripts, *dryRun, cfg, cfgDir) + if *script == "" { + log.Fatalln("No script supplied to '--script' switch. Aborting.") + } + PerformScan(*addr, *script, *dryRun, cfg, cfgDir) } }) diff --git a/ralph.go b/ralph.go index e311d0f..57a5d84 100644 --- a/ralph.go +++ b/ralph.go @@ -101,7 +101,8 @@ func (m *MACAddress) MarshalJSON() ([]byte, error) { // UnmarshalJSON deserializes MACAddress from []byte. func (m *MACAddress) UnmarshalJSON(data []byte) error { - if string(data) == "\"\"" { + // Most management IPs in Ralph won't be associated with any MAC address. + if string(data) == "\"\"" || string(data) == "null" { m.HardwareAddr = []byte{} return nil }