mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 21:17:43 +09:00 
			
		
		
		
	This is a massive commit that restructures the code into modules:
db/
    All functions related to modifying the Database
types/
    All type definitions and methods that can be exclusivly used on
    these types without dependencies
policy/
    All Policy related code, now without dependencies on the Database.
policy/matcher/
    Dedicated code to match machines in a list of FilterRules
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package types
 | |
| 
 | |
| import (
 | |
| 	"database/sql/driver"
 | |
| 	"encoding/json"
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"net/netip"
 | |
| 
 | |
| 	"tailscale.com/tailcfg"
 | |
| )
 | |
| 
 | |
| var ErrCannotParsePrefix = errors.New("cannot parse prefix")
 | |
| 
 | |
| // This is a "wrapper" type around tailscales
 | |
| // Hostinfo to allow us to add database "serialization"
 | |
| // methods. This allows us to use a typed values throughout
 | |
| // the code and not have to marshal/unmarshal and error
 | |
| // check all over the code.
 | |
| type HostInfo tailcfg.Hostinfo
 | |
| 
 | |
| func (hi *HostInfo) Scan(destination interface{}) error {
 | |
| 	switch value := destination.(type) {
 | |
| 	case []byte:
 | |
| 		return json.Unmarshal(value, hi)
 | |
| 
 | |
| 	case string:
 | |
| 		return json.Unmarshal([]byte(value), hi)
 | |
| 
 | |
| 	default:
 | |
| 		return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Value return json value, implement driver.Valuer interface.
 | |
| func (hi HostInfo) Value() (driver.Value, error) {
 | |
| 	bytes, err := json.Marshal(hi)
 | |
| 
 | |
| 	return string(bytes), err
 | |
| }
 | |
| 
 | |
| type IPPrefix netip.Prefix
 | |
| 
 | |
| func (i *IPPrefix) Scan(destination interface{}) error {
 | |
| 	switch value := destination.(type) {
 | |
| 	case string:
 | |
| 		prefix, err := netip.ParsePrefix(value)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		*i = IPPrefix(prefix)
 | |
| 
 | |
| 		return nil
 | |
| 	default:
 | |
| 		return fmt.Errorf("%w: unexpected data type %T", ErrCannotParsePrefix, destination)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Value return json value, implement driver.Valuer interface.
 | |
| func (i IPPrefix) Value() (driver.Value, error) {
 | |
| 	prefixStr := netip.Prefix(i).String()
 | |
| 
 | |
| 	return prefixStr, nil
 | |
| }
 | |
| 
 | |
| type IPPrefixes []netip.Prefix
 | |
| 
 | |
| func (i *IPPrefixes) Scan(destination interface{}) error {
 | |
| 	switch value := destination.(type) {
 | |
| 	case []byte:
 | |
| 		return json.Unmarshal(value, i)
 | |
| 
 | |
| 	case string:
 | |
| 		return json.Unmarshal([]byte(value), i)
 | |
| 
 | |
| 	default:
 | |
| 		return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Value return json value, implement driver.Valuer interface.
 | |
| func (i IPPrefixes) Value() (driver.Value, error) {
 | |
| 	bytes, err := json.Marshal(i)
 | |
| 
 | |
| 	return string(bytes), err
 | |
| }
 | |
| 
 | |
| type StringList []string
 | |
| 
 | |
| func (i *StringList) Scan(destination interface{}) error {
 | |
| 	switch value := destination.(type) {
 | |
| 	case []byte:
 | |
| 		return json.Unmarshal(value, i)
 | |
| 
 | |
| 	case string:
 | |
| 		return json.Unmarshal([]byte(value), i)
 | |
| 
 | |
| 	default:
 | |
| 		return fmt.Errorf("%w: unexpected data type %T", ErrMachineAddressesInvalid, destination)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Value return json value, implement driver.Valuer interface.
 | |
| func (i StringList) Value() (driver.Value, error) {
 | |
| 	bytes, err := json.Marshal(i)
 | |
| 
 | |
| 	return string(bytes), err
 | |
| }
 |