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  }