github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/libnetwork/drivers/windows/windows_store.go (about) 1 // +build windows 2 3 package windows 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "net" 9 10 "github.com/docker/libnetwork/datastore" 11 "github.com/docker/libnetwork/discoverapi" 12 "github.com/docker/libnetwork/netlabel" 13 "github.com/docker/libnetwork/types" 14 "github.com/sirupsen/logrus" 15 ) 16 17 const ( 18 windowsPrefix = "windows" 19 windowsEndpointPrefix = "windows-endpoint" 20 ) 21 22 func (d *driver) initStore(option map[string]interface{}) error { 23 if data, ok := option[netlabel.LocalKVClient]; ok { 24 var err error 25 dsc, ok := data.(discoverapi.DatastoreConfigData) 26 if !ok { 27 return types.InternalErrorf("incorrect data in datastore configuration: %v", data) 28 } 29 d.store, err = datastore.NewDataStoreFromConfig(dsc) 30 if err != nil { 31 return types.InternalErrorf("windows driver failed to initialize data store: %v", err) 32 } 33 34 err = d.populateNetworks() 35 if err != nil { 36 return err 37 } 38 39 err = d.populateEndpoints() 40 if err != nil { 41 return err 42 } 43 } 44 45 return nil 46 } 47 48 func (d *driver) populateNetworks() error { 49 kvol, err := d.store.List(datastore.Key(windowsPrefix), &networkConfiguration{Type: d.name}) 50 if err != nil && err != datastore.ErrKeyNotFound { 51 return fmt.Errorf("failed to get windows network configurations from store: %v", err) 52 } 53 54 // It's normal for network configuration state to be empty. Just return. 55 if err == datastore.ErrKeyNotFound { 56 return nil 57 } 58 59 for _, kvo := range kvol { 60 ncfg := kvo.(*networkConfiguration) 61 if ncfg.Type != d.name { 62 continue 63 } 64 d.createNetwork(ncfg) 65 logrus.Debugf("Network %v (%.7s) restored", d.name, ncfg.ID) 66 } 67 68 return nil 69 } 70 71 func (d *driver) populateEndpoints() error { 72 kvol, err := d.store.List(datastore.Key(windowsEndpointPrefix), &hnsEndpoint{Type: d.name}) 73 if err != nil && err != datastore.ErrKeyNotFound { 74 return fmt.Errorf("failed to get endpoints from store: %v", err) 75 } 76 77 if err == datastore.ErrKeyNotFound { 78 return nil 79 } 80 81 for _, kvo := range kvol { 82 ep := kvo.(*hnsEndpoint) 83 if ep.Type != d.name { 84 continue 85 } 86 n, ok := d.networks[ep.nid] 87 if !ok { 88 logrus.Debugf("Network (%.7s) not found for restored endpoint (%.7s)", ep.nid, ep.id) 89 logrus.Debugf("Deleting stale endpoint (%.7s) from store", ep.id) 90 if err := d.storeDelete(ep); err != nil { 91 logrus.Debugf("Failed to delete stale endpoint (%.7s) from store", ep.id) 92 } 93 continue 94 } 95 n.endpoints[ep.id] = ep 96 logrus.Debugf("Endpoint (%.7s) restored to network (%.7s)", ep.id, ep.nid) 97 } 98 99 return nil 100 } 101 102 func (d *driver) storeUpdate(kvObject datastore.KVObject) error { 103 if d.store == nil { 104 logrus.Warnf("store not initialized. kv object %s is not added to the store", datastore.Key(kvObject.Key()...)) 105 return nil 106 } 107 108 if err := d.store.PutObjectAtomic(kvObject); err != nil { 109 return fmt.Errorf("failed to update store for object type %T: %v", kvObject, err) 110 } 111 112 return nil 113 } 114 115 func (d *driver) storeDelete(kvObject datastore.KVObject) error { 116 if d.store == nil { 117 logrus.Debugf("store not initialized. kv object %s is not deleted from store", datastore.Key(kvObject.Key()...)) 118 return nil 119 } 120 121 retry: 122 if err := d.store.DeleteObjectAtomic(kvObject); err != nil { 123 if err == datastore.ErrKeyModified { 124 if err := d.store.GetObject(datastore.Key(kvObject.Key()...), kvObject); err != nil { 125 return fmt.Errorf("could not update the kvobject to latest when trying to delete: %v", err) 126 } 127 goto retry 128 } 129 return err 130 } 131 132 return nil 133 } 134 135 func (ncfg *networkConfiguration) MarshalJSON() ([]byte, error) { 136 nMap := make(map[string]interface{}) 137 138 nMap["ID"] = ncfg.ID 139 nMap["Type"] = ncfg.Type 140 nMap["Name"] = ncfg.Name 141 nMap["HnsID"] = ncfg.HnsID 142 nMap["VLAN"] = ncfg.VLAN 143 nMap["VSID"] = ncfg.VSID 144 nMap["DNSServers"] = ncfg.DNSServers 145 nMap["DNSSuffix"] = ncfg.DNSSuffix 146 nMap["SourceMac"] = ncfg.SourceMac 147 nMap["NetworkAdapterName"] = ncfg.NetworkAdapterName 148 149 return json.Marshal(nMap) 150 } 151 152 func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { 153 var ( 154 err error 155 nMap map[string]interface{} 156 ) 157 158 if err = json.Unmarshal(b, &nMap); err != nil { 159 return err 160 } 161 162 ncfg.ID = nMap["ID"].(string) 163 ncfg.Type = nMap["Type"].(string) 164 ncfg.Name = nMap["Name"].(string) 165 ncfg.HnsID = nMap["HnsID"].(string) 166 ncfg.VLAN = uint(nMap["VLAN"].(float64)) 167 ncfg.VSID = uint(nMap["VSID"].(float64)) 168 ncfg.DNSServers = nMap["DNSServers"].(string) 169 ncfg.DNSSuffix = nMap["DNSSuffix"].(string) 170 ncfg.SourceMac = nMap["SourceMac"].(string) 171 ncfg.NetworkAdapterName = nMap["NetworkAdapterName"].(string) 172 return nil 173 } 174 175 func (ncfg *networkConfiguration) Key() []string { 176 return []string{windowsPrefix + ncfg.Type, ncfg.ID} 177 } 178 179 func (ncfg *networkConfiguration) KeyPrefix() []string { 180 return []string{windowsPrefix + ncfg.Type} 181 } 182 183 func (ncfg *networkConfiguration) Value() []byte { 184 b, err := json.Marshal(ncfg) 185 if err != nil { 186 return nil 187 } 188 return b 189 } 190 191 func (ncfg *networkConfiguration) SetValue(value []byte) error { 192 return json.Unmarshal(value, ncfg) 193 } 194 195 func (ncfg *networkConfiguration) Index() uint64 { 196 return ncfg.dbIndex 197 } 198 199 func (ncfg *networkConfiguration) SetIndex(index uint64) { 200 ncfg.dbIndex = index 201 ncfg.dbExists = true 202 } 203 204 func (ncfg *networkConfiguration) Exists() bool { 205 return ncfg.dbExists 206 } 207 208 func (ncfg *networkConfiguration) Skip() bool { 209 return false 210 } 211 212 func (ncfg *networkConfiguration) New() datastore.KVObject { 213 return &networkConfiguration{Type: ncfg.Type} 214 } 215 216 func (ncfg *networkConfiguration) CopyTo(o datastore.KVObject) error { 217 dstNcfg := o.(*networkConfiguration) 218 *dstNcfg = *ncfg 219 return nil 220 } 221 222 func (ncfg *networkConfiguration) DataScope() string { 223 return datastore.LocalScope 224 } 225 226 func (ep *hnsEndpoint) MarshalJSON() ([]byte, error) { 227 epMap := make(map[string]interface{}) 228 epMap["id"] = ep.id 229 epMap["nid"] = ep.nid 230 epMap["Type"] = ep.Type 231 epMap["profileID"] = ep.profileID 232 epMap["MacAddress"] = ep.macAddress.String() 233 if ep.addr.IP != nil { 234 epMap["Addr"] = ep.addr.String() 235 } 236 if ep.gateway != nil { 237 epMap["gateway"] = ep.gateway.String() 238 } 239 epMap["epOption"] = ep.epOption 240 epMap["epConnectivity"] = ep.epConnectivity 241 epMap["PortMapping"] = ep.portMapping 242 243 return json.Marshal(epMap) 244 } 245 246 func (ep *hnsEndpoint) UnmarshalJSON(b []byte) error { 247 var ( 248 err error 249 epMap map[string]interface{} 250 ) 251 252 if err = json.Unmarshal(b, &epMap); err != nil { 253 return fmt.Errorf("Failed to unmarshal to endpoint: %v", err) 254 } 255 if v, ok := epMap["MacAddress"]; ok { 256 if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { 257 return types.InternalErrorf("failed to decode endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) 258 } 259 } 260 if v, ok := epMap["Addr"]; ok { 261 if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { 262 logrus.Warnf("failed to decode endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) 263 } 264 } 265 if v, ok := epMap["gateway"]; ok { 266 ep.gateway = net.ParseIP(v.(string)) 267 } 268 ep.id = epMap["id"].(string) 269 ep.Type = epMap["Type"].(string) 270 ep.nid = epMap["nid"].(string) 271 ep.profileID = epMap["profileID"].(string) 272 d, _ := json.Marshal(epMap["epOption"]) 273 if err := json.Unmarshal(d, &ep.epOption); err != nil { 274 logrus.Warnf("Failed to decode endpoint container config %v", err) 275 } 276 d, _ = json.Marshal(epMap["epConnectivity"]) 277 if err := json.Unmarshal(d, &ep.epConnectivity); err != nil { 278 logrus.Warnf("Failed to decode endpoint external connectivity configuration %v", err) 279 } 280 d, _ = json.Marshal(epMap["PortMapping"]) 281 if err := json.Unmarshal(d, &ep.portMapping); err != nil { 282 logrus.Warnf("Failed to decode endpoint port mapping %v", err) 283 } 284 285 return nil 286 } 287 288 func (ep *hnsEndpoint) Key() []string { 289 return []string{windowsEndpointPrefix + ep.Type, ep.id} 290 } 291 292 func (ep *hnsEndpoint) KeyPrefix() []string { 293 return []string{windowsEndpointPrefix + ep.Type} 294 } 295 296 func (ep *hnsEndpoint) Value() []byte { 297 b, err := json.Marshal(ep) 298 if err != nil { 299 return nil 300 } 301 return b 302 } 303 304 func (ep *hnsEndpoint) SetValue(value []byte) error { 305 return json.Unmarshal(value, ep) 306 } 307 308 func (ep *hnsEndpoint) Index() uint64 { 309 return ep.dbIndex 310 } 311 312 func (ep *hnsEndpoint) SetIndex(index uint64) { 313 ep.dbIndex = index 314 ep.dbExists = true 315 } 316 317 func (ep *hnsEndpoint) Exists() bool { 318 return ep.dbExists 319 } 320 321 func (ep *hnsEndpoint) Skip() bool { 322 return false 323 } 324 325 func (ep *hnsEndpoint) New() datastore.KVObject { 326 return &hnsEndpoint{Type: ep.Type} 327 } 328 329 func (ep *hnsEndpoint) CopyTo(o datastore.KVObject) error { 330 dstEp := o.(*hnsEndpoint) 331 *dstEp = *ep 332 return nil 333 } 334 335 func (ep *hnsEndpoint) DataScope() string { 336 return datastore.LocalScope 337 }