github.com/tompreston/snapd@v0.0.0-20210817193607-954edfcb9611/snap/types.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2014-2015 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package snap
    21  
    22  import (
    23  	"encoding/json"
    24  	"fmt"
    25  )
    26  
    27  // Type represents the kind of snap (app, core, gadget, os, kernel, snapd)
    28  type Type string
    29  
    30  // The various types of snap parts we support
    31  const (
    32  	TypeApp    Type = "app"
    33  	TypeGadget Type = "gadget"
    34  	TypeKernel Type = "kernel"
    35  	TypeBase   Type = "base"
    36  	TypeSnapd  Type = "snapd"
    37  
    38  	// FIXME: this really should be TypeCore
    39  	TypeOS Type = "os"
    40  )
    41  
    42  // This is the sort order from least important to most important for
    43  // types. On e.g. firstboot this will be used to order the snaps this
    44  // way.
    45  var typeOrder = map[Type]int{
    46  	TypeApp:    50,
    47  	TypeGadget: 40,
    48  	TypeBase:   30,
    49  	TypeKernel: 20,
    50  	TypeOS:     10,
    51  	TypeSnapd:  0,
    52  }
    53  
    54  func (m Type) SortsBefore(other Type) bool {
    55  	return typeOrder[m] < typeOrder[other]
    56  }
    57  
    58  // UnmarshalJSON sets *m to a copy of data.
    59  func (m *Type) UnmarshalJSON(data []byte) error {
    60  	var str string
    61  	if err := json.Unmarshal(data, &str); err != nil {
    62  		return err
    63  	}
    64  
    65  	return m.fromString(str)
    66  }
    67  
    68  // UnmarshalYAML so Type implements yaml's Unmarshaler interface
    69  func (m *Type) UnmarshalYAML(unmarshal func(interface{}) error) error {
    70  	var str string
    71  	if err := unmarshal(&str); err != nil {
    72  		return err
    73  	}
    74  
    75  	return m.fromString(str)
    76  }
    77  
    78  // fromString converts str to Type and sets *m to it if validations pass
    79  func (m *Type) fromString(str string) error {
    80  	t := Type(str)
    81  
    82  	// this is a workaround as the store sends "application" but snappy uses
    83  	// "app" for TypeApp
    84  	if str == "application" {
    85  		t = TypeApp
    86  	}
    87  
    88  	if t != TypeApp && t != TypeGadget && t != TypeOS && t != TypeKernel && t != TypeBase && t != TypeSnapd {
    89  		return fmt.Errorf("invalid snap type: %q", str)
    90  	}
    91  
    92  	*m = t
    93  
    94  	return nil
    95  }
    96  
    97  // ConfinementType represents the kind of confinement supported by the snap
    98  // (devmode only, or strict confinement)
    99  type ConfinementType string
   100  
   101  // The various confinement types we support
   102  const (
   103  	DevModeConfinement ConfinementType = "devmode"
   104  	ClassicConfinement ConfinementType = "classic"
   105  	StrictConfinement  ConfinementType = "strict"
   106  )
   107  
   108  // UnmarshalJSON sets *confinementType to a copy of data, assuming validation passes
   109  func (confinementType *ConfinementType) UnmarshalJSON(data []byte) error {
   110  	var s string
   111  	if err := json.Unmarshal(data, &s); err != nil {
   112  		return err
   113  	}
   114  
   115  	return confinementType.fromString(s)
   116  }
   117  
   118  // UnmarshalYAML so ConfinementType implements yaml's Unmarshaler interface
   119  func (confinementType *ConfinementType) UnmarshalYAML(unmarshal func(interface{}) error) error {
   120  	var s string
   121  	if err := unmarshal(&s); err != nil {
   122  		return err
   123  	}
   124  
   125  	return confinementType.fromString(s)
   126  }
   127  
   128  func (confinementType *ConfinementType) fromString(str string) error {
   129  	c := ConfinementType(str)
   130  	if c != DevModeConfinement && c != ClassicConfinement && c != StrictConfinement {
   131  		return fmt.Errorf("invalid confinement type: %q", str)
   132  	}
   133  
   134  	*confinementType = c
   135  
   136  	return nil
   137  }
   138  
   139  type ServiceStopReason string
   140  
   141  const (
   142  	StopReasonRefresh ServiceStopReason = "refresh"
   143  	StopReasonRemove  ServiceStopReason = "remove"
   144  	StopReasonDisable ServiceStopReason = "disable"
   145  	StopReasonOther   ServiceStopReason = ""
   146  )
   147  
   148  // DaemonScope represents the scope of the daemon running under systemd
   149  type DaemonScope string
   150  
   151  const (
   152  	SystemDaemon DaemonScope = "system"
   153  	UserDaemon   DaemonScope = "user"
   154  )
   155  
   156  // UnmarshalJSON sets *daemonScope to a copy of data, assuming validation passes
   157  func (daemonScope *DaemonScope) UnmarshalJSON(data []byte) error {
   158  	var s string
   159  	if err := json.Unmarshal(data, &s); err != nil {
   160  		return err
   161  	}
   162  
   163  	return daemonScope.fromString(s)
   164  }
   165  
   166  // UnmarshalYAML so DaemonScope implements yaml's Unmarshaler interface
   167  func (daemonScope *DaemonScope) UnmarshalYAML(unmarshal func(interface{}) error) error {
   168  	var s string
   169  	if err := unmarshal(&s); err != nil {
   170  		return err
   171  	}
   172  
   173  	return daemonScope.fromString(s)
   174  }
   175  
   176  func (daemonScope *DaemonScope) fromString(str string) error {
   177  	d := DaemonScope(str)
   178  	if d != SystemDaemon && d != UserDaemon {
   179  		return fmt.Errorf("invalid daemon scope: %q", str)
   180  	}
   181  
   182  	*daemonScope = d
   183  	return nil
   184  }