devicestate

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 12, 2022 License: Apache-2.0 Imports: 75 Imported by: 0

Documentation

Overview

Package devicestate implements the manager and state aspects responsible for the device identity and policies.

Index

Constants

View Source
const (
	RebootHaltOp     = "halt"
	RebootPoweroffOp = "poweroff"
)

Variables

View Source
var EarlyConfig func(st *state.State, preloadGadget func() (sysconfig.Device, *gadget.Info, error)) error

EarlyConfig is a hook set by configstate that can process early configuration during managers' startup.

View Source
var ErrNoSystems = errors.New("no systems seeds")
View Source
var ErrUnsupportedAction = errors.New("unsupported action")

Functions

func CanManageRefreshes

func CanManageRefreshes(st *state.State) bool

CanManageRefreshes returns true if the device can be switched to the "core.refresh.schedule=managed" mode.

TODO:

  • Move the CanManageRefreshes code into the ifstate
  • Look at the connections and find the connection for snapd-control with the managed attribute
  • Take the snap from this connection and look at the snapstate to see if that snap has a snap declaration (to ensure it comes from the store)

func CreateRecoverySystem

func CreateRecoverySystem(st *state.State, label string) (*state.Change, error)

func DeviceCtx

func DeviceCtx(st *state.State, task *state.Task, providedDeviceCtx snapstate.DeviceContext) (snapstate.DeviceContext, error)

DeviceCtx picks a device context from state, optional task or an optionally pre-provided one. Returns ErrNoState if a model assertion is not yet known. In particular if task belongs to a remodeling change this will find the appropriate remodel context.

func InjectSetModelError

func InjectSetModelError(err error)

InjectSetModelError will trigger the selected error in the doSetModel handler. This is only useful for testing.

func InstallFinish

func InstallFinish(st *state.State, label string, onVolumes map[string]*gadget.Volume) (*state.Change, error)

InstallFinish creates a change that will finish the install for the given label and volumes. This includes writing missing volume content, seting up the bootloader and installing the kernel.

func InstallSetupStorageEncryption

func InstallSetupStorageEncryption(st *state.State, label string, onVolumes map[string]*gadget.Volume) (*state.Change, error)

InstallSetupStorageEncryption creates a change that will setup the storage encryption for the install of the given label and volumes.

func Remodel

func Remodel(st *state.State, new *asserts.Model) (*state.Change, error)

Remodel takes a new model assertion and generates a change that takes the device from the old to the new model or an error if the transition is not possible.

TODO:

  • Check estimated disk size delta
  • Check all relevant snaps exist in new store (need to check that even unchanged snaps are accessible)
  • Make sure this works with Core 20 as well, in the Core 20 case we must enforce the default-channels from the model as well

func RemodelingChange

func RemodelingChange(st *state.State) *state.Change

RemodelingChange returns a remodeling change in progress, if there is one

func RemoveUser

func RemoveUser(st *state.State, username string) (*auth.UserState, error)

RemoveUser removes linux user account of passed username.

func ResetSession

func ResetSession(st *state.State) error

ResetSession clears the device store session if any.

Types

type CreatedUser

type CreatedUser struct {
	Username string
	SSHKeys  []string
}

CreatedUser holds the results from a create user operation.

func CreateKnownUsers

func CreateKnownUsers(st *state.State, sudoer bool, email string) ([]*CreatedUser, error)

CreateKnownUsers creates known users. The user details are fetched from existing system user assertions. If no email is passed, all known users will be created based on valid system user assertions. If an email is passed, only the corresponding system user assertion is used.

func CreateUser

func CreateUser(st *state.State, sudoer bool, email string, expiration time.Time) (*CreatedUser, error)

CreateUser creates a Linux user based on the specified email. The username and public ssh keys for the created account are determined from Ubuntu store based on the email.

type DeviceManager

type DeviceManager struct {
	// contains filtered or unexported fields
}

DeviceManager is responsible for managing the device identity and device policies.

func Manager

func Manager(s *state.State, hookManager *hookstate.HookManager, runner *state.TaskRunner, newStore func(storecontext.DeviceBackend) snapstate.StoreService) (*DeviceManager, error)

Manager returns a new device manager.

func (*DeviceManager) CanStandby

func (m *DeviceManager) CanStandby() bool

func (*DeviceManager) Ensure

func (m *DeviceManager) Ensure() error

Ensure implements StateManager.Ensure.

func (*DeviceManager) EnsureRecoveryKeys

func (m *DeviceManager) EnsureRecoveryKeys() (*client.SystemRecoveryKeysResponse, error)

EnsureRecoveryKeys makes sure appropriate recovery keys exist and returns them. Usually a single recovery key is created/used, but older systems might return both a recovery key for ubuntu-data and a reinstall key for ubuntu-save.

func (*DeviceManager) Model

func (m *DeviceManager) Model() (*asserts.Model, error)

Model returns the device model assertion.

func (*DeviceManager) Reboot

func (m *DeviceManager) Reboot(systemLabel, mode string) error

Reboot triggers a reboot into the given systemLabel and mode.

When called without a systemLabel and without a mode it will just trigger a regular reboot.

When called without a systemLabel but with a mode it will use the current system to enter the given mode.

Note that "recover" and "run" modes are only available for the current system.

func (*DeviceManager) Registered

func (m *DeviceManager) Registered() <-chan struct{}

Registered returns a channel that is closed when the device is known to have been registered.

func (*DeviceManager) ReloadModeenv

func (m *DeviceManager) ReloadModeenv() error

ReloadModeenv is only useful for integration testing

func (*DeviceManager) RemoveRecoveryKeys

func (m *DeviceManager) RemoveRecoveryKeys() error

RemoveRecoveryKeys removes and disables all recovery keys.

func (*DeviceManager) RequestSystemAction

func (m *DeviceManager) RequestSystemAction(systemLabel string, action SystemAction) error

RequestSystemAction requests the provided system to be run in a given mode as specified by action. A system reboot will be requested when the request can be successfully carried out.

func (*DeviceManager) ResetToPostBootState

func (m *DeviceManager) ResetToPostBootState()

ResetToPostBootState is only useful for integration testing.

func (*DeviceManager) Serial

func (m *DeviceManager) Serial() (*asserts.Serial, error)

Serial returns the device serial assertion.

func (*DeviceManager) StartOfOperationTime

func (m *DeviceManager) StartOfOperationTime() (time.Time, error)

StartOfOperationTime returns the time when snapd started operating, and sets it in the state when called for the first time. The StartOfOperationTime time is seed-time if available, or current time otherwise.

func (*DeviceManager) StartUp

func (m *DeviceManager) StartUp() error

StartUp implements StateStarterUp.Startup.

func (*DeviceManager) StoreContextBackend

func (m *DeviceManager) StoreContextBackend() storecontext.Backend

func (*DeviceManager) SystemAndGadgetAndEncryptionInfo

func (m *DeviceManager) SystemAndGadgetAndEncryptionInfo(wantedSystemLabel string) (*System, *gadget.Info, *EncryptionSupportInfo, error)

SystemAndGadgetAndEncryptionInfo return the system details including the model assertion, gadget details and encryption info for the given system label.

func (*DeviceManager) SystemMode

func (m *DeviceManager) SystemMode(sysExpect SysExpectation) string

SystemMode returns the current mode of the system. An expectation about the system controls the returned mode when none is set explicitly, as it's the case on pre-UC20 systems. In which case, with SysAny, the mode defaults to implicit "run", thus covering pre-UC20 systems. With SysHasModeeenv, as there is always an explicit mode in systems that use modeenv, no implicit default is used and thus "" is returned for pre-UC20 systems.

func (*DeviceManager) SystemModeInfo

func (m *DeviceManager) SystemModeInfo() (*SystemModeInfo, error)

SystemModeInfo returns details about the current system mode the device is in.

func (*DeviceManager) Systems

func (m *DeviceManager) Systems() ([]*System, error)

Systems list the available recovery/seeding systems. Returns the list of systems, ErrNoSystems when no systems seeds were found or other error.

func (*DeviceManager) Unregister

func (m *DeviceManager) Unregister(opts *UnregisterOptions) error

Unregister unregisters the device forgetting its serial plus the additional behavior described by the UnregisterOptions

type EncryptionSupportInfo

type EncryptionSupportInfo struct {
	// Disabled is set if to true encryption was forcefully
	// disabled (e.g. via the seed partition), if set the rest
	// of the struct content is not relevant.
	Disabled bool

	// StorageSafety describes the level safety properties
	// requested by the model
	StorageSafety asserts.StorageSafety
	// Available is set to true if encryption is available on this device
	// with the used gadget.
	Available bool

	// Type is set to the EncryptionType that can be used if
	// Available is true.
	Type secboot.EncryptionType

	// UnvailableErr is set if the encryption support availability of
	// the this device and used gadget do not match the
	// storage safety requirements.
	UnavailableErr error
	// UnavailbleWarning describes why encryption support is not
	// available in case it is optional.
	UnavailableWarning string
}

EncryptionSupportInfo describes what encryption is available and needed for the current device.

type RebootOptions

type RebootOptions struct {
	Op string `json:"op,omitempty"`
}

RebootOptions can be attached to restart-system-to-run-mode tasks to control their restart behavior.

type RemodelKind

type RemodelKind int

RemodelKind designates a kind of remodeling.

const (
	// same brand/model, brand store
	UpdateRemodel RemodelKind = iota
	// same brand/model, different brand store
	StoreSwitchRemodel
	// different brand/model, maybe different brand store
	ReregRemodel
)

func ClassifyRemodel

func ClassifyRemodel(oldModel, newModel *asserts.Model) RemodelKind

ClassifyRemodel returns what kind of remodeling is going from oldModel to newModel.

func (RemodelKind) String

func (k RemodelKind) String() string

type SysExpectation

type SysExpectation int
const (
	// SysAny indicates any system is appropriate.
	SysAny SysExpectation = iota
	// SysHasModeenv indicates only systems with modeenv are appropriate.
	SysHasModeenv
)

type System

type System struct {
	// Current is true when the system running now was installed from that
	// seed
	Current bool
	// Label of the seed system
	Label string
	// Model assertion of the system
	Model *asserts.Model
	// Brand information
	Brand *asserts.Account
	// Actions available for this system
	Actions []SystemAction
}

type SystemAction

type SystemAction struct {
	Title string
	Mode  string
}

type SystemModeInfo

type SystemModeInfo struct {
	Mode              string
	HasModeenv        bool
	Seeded            bool
	BootFlags         []string
	HostDataLocations []string
}

func SystemModeInfoFromState

func SystemModeInfoFromState(st *state.State) (*SystemModeInfo, error)

SystemModeInfoFromState returns details about the system mode the device is in.

type UnregisterOptions

type UnregisterOptions struct {
	NoRegistrationUntilReboot bool
}

type UserError

type UserError struct {
	Err error
}

UserError is returned when invalid or insufficient data is supplied, or if a user-assertion is not found.

func (*UserError) Error

func (e *UserError) Error() string

Directories

Path Synopsis
Package internal (of devicestate) provides functions to access and set the device state for use only by devicestate, for convenience they are also exposed via devicestatetest for use in tests.
Package internal (of devicestate) provides functions to access and set the device state for use only by devicestate, for convenience they are also exposed via devicestatetest for use in tests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL