|  |  |  | @ -5,6 +5,20 @@ import ( | 
			
		
	
		
			
				
					|  |  |  |  | ) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | func (m *Zones) scan() error { | 
			
		
	
		
			
				
					|  |  |  |  | 	for _, fn := range []func() error{ | 
			
		
	
		
			
				
					|  |  |  |  | 		m.scanDirectory, | 
			
		
	
		
			
				
					|  |  |  |  | 		m.scanMachines, | 
			
		
	
		
			
				
					|  |  |  |  | 		m.scanZoneIDs, | 
			
		
	
		
			
				
					|  |  |  |  | 	} { | 
			
		
	
		
			
				
					|  |  |  |  | 		if err := fn(); err != nil { | 
			
		
	
		
			
				
					|  |  |  |  | 			return err | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return nil | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | func (m *Zones) scanDirectory() error { | 
			
		
	
		
			
				
					|  |  |  |  | 	// each directory is a zone
 | 
			
		
	
		
			
				
					|  |  |  |  | 	entries, err := fs.ReadDir(m.dir, ".") | 
			
		
	
		
			
				
					|  |  |  |  | 	if err != nil { | 
			
		
	
	
		
			
				
					|  |  |  | @ -26,7 +40,7 @@ func (m *Zones) scan() error { | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return m.scanMachines() | 
			
		
	
		
			
				
					|  |  |  |  | 	return nil | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | func (m *Zones) scanMachines() error { | 
			
		
	
	
		
			
				
					|  |  |  | @ -38,6 +52,36 @@ func (m *Zones) scanMachines() error { | 
			
		
	
		
			
				
					|  |  |  |  | 	return err | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | func (m *Zones) scanZoneIDs() error { | 
			
		
	
		
			
				
					|  |  |  |  | 	var hasMissing bool | 
			
		
	
		
			
				
					|  |  |  |  | 	var lastZoneID int | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	m.ForEachZone(func(z *Zone) bool { | 
			
		
	
		
			
				
					|  |  |  |  | 		switch { | 
			
		
	
		
			
				
					|  |  |  |  | 		case z.ID == 0: | 
			
		
	
		
			
				
					|  |  |  |  | 			hasMissing = true | 
			
		
	
		
			
				
					|  |  |  |  | 		case z.ID > lastZoneID: | 
			
		
	
		
			
				
					|  |  |  |  | 			lastZoneID = z.ID | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		return false | 
			
		
	
		
			
				
					|  |  |  |  | 	}) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if hasMissing { | 
			
		
	
		
			
				
					|  |  |  |  | 		next := lastZoneID + 1 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		m.ForEachZone(func(z *Zone) bool { | 
			
		
	
		
			
				
					|  |  |  |  | 			if z.ID == 0 { | 
			
		
	
		
			
				
					|  |  |  |  | 				z.ID, next = next, next+1 | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			return false | 
			
		
	
		
			
				
					|  |  |  |  | 		}) | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return nil | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | func (z *Zone) scan() error { | 
			
		
	
		
			
				
					|  |  |  |  | 	// each directory is a machine
 | 
			
		
	
		
			
				
					|  |  |  |  | 	entries, err := fs.ReadDir(z.zones.dir, z.Name) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |