Documentation ¶
Index ¶
- Variables
- func AgentPasswordHash(password string) string
- func AptConfigProxy() (string, error)
- func AptGetInstall(packages ...string) error
- func AptProxyContent(proxy osenv.ProxySettings) string
- func AtomicWriteFile(filename string, contents []byte, perms os.FileMode) (err error)
- func AtomicWriteFileAndChange(filename string, contents []byte, change func(*os.File) error) (err error)
- func CheckPendingShutdown() (result bool)
- func CommandString(args ...string) string
- func CopyFile(dest, source string) error
- func DetectAptProxies() (result osenv.ProxySettings, err error)
- func ErrorContextf(err *error, format string, args ...interface{})
- func GetAddressForInterface(interfaceName string) (string, error)
- func GetIPv4Address(addresses []net.Addr) (string, error)
- func GetNonValidatingHTTPClient() *http.Client
- func GetPort() (string, error)
- func GetSocket() (string, error)
- func Gunzip(data []byte) ([]byte, error)
- func Gzip(data []byte) []byte
- func IsPackageInstalled(packageName string) bool
- func IsUbuntu() bool
- func IsValidUUIDString(s string) bool
- func JoinServerPath(elem ...string) string
- func NewHttpTLSTransport(tlsConfig *tls.Config) *http.Transport
- func NewHttpTransport() *http.Transport
- func NormalizePath(dir string) (string, error)
- func PathToWindows(filepath string) string
- func RChmod(path string, mode os.FileMode) error
- func RandomBytes(n int) ([]byte, error)
- func RandomPassword() (string, error)
- func RandomSalt() (string, error)
- func ReadFileSHA256(filename string) (string, int64, error)
- func ReadSHA256(source io.Reader) (string, int64, error)
- func ReadSocketFile(socketPath string) (string, error)
- func ReadYaml(path string, obj interface{}) error
- func ReplaceFile(source, destination string) error
- func RunCommand(command string, args ...string) (output string, err error)
- func ShQuote(s string) string
- func Symlink(oldname, newname string) error
- func TestPort(port int) error
- func Timeit(action string) func()
- func UniqueDirectory(path, name string) (string, error)
- func UserHomeDir(userName string) (homeDir string, err error)
- func UserPasswordHash(password string, salt string) string
- func WriteFile(filename string, contents []byte, perms os.FileMode) (err error)
- func WriteSocketFile(socketPath string) (string, error)
- func WriteYaml(path string, obj interface{}) error
- type Attempt
- type AttemptStrategy
- type UUID
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var AptCommandOutput = (*exec.Cmd).CombinedOutput
AptCommandOutput calls cmd.Output, this is used as an overloading point so we can test what *would* be run without actually executing another program
var ( // AptConfFile is the full file path for the proxy settings that are // written by cloud-init and the machine environ worker. AptConfFile = "/etc/apt/apt.conf.d/42-juju-proxy-settings" )
var CompatSalt = string([]byte{0x75, 0x82, 0x81, 0xca})
CompatSalt is because Juju 1.16 and older used a hard-coded salt to compute the password hash for all users and agents
var FastInsecureHash = false
FastInsecureHash specifies whether a fast, insecure version of the hash algorithm will be used. Changing this will cause PasswordHash to produce incompatible passwords. It should only be changed for testing purposes - to make tests run faster.
var MinAgentPasswordLength = base64.StdEncoding.EncodedLen(randomPasswordBytes)
MinAgentPasswordLength describes how long agent passwords should be. We require this length because we assume enough entropy in the Agent password that it is safe to not do extra rounds of iterated hashing.
Functions ¶
func AgentPasswordHash ¶
AgentPasswordHash returns base64-encoded one-way hash of password. This is not suitable for User passwords because those will have limited entropy (see UserPasswordHash). However, since we generate long random passwords for agents, we can trust that there is sufficient entropy to prevent brute force search. And using a faster hash allows us to restart the state machines and have 1000s of agents log in in a reasonable amount of time.
func AptConfigProxy ¶
AptConfigProxy will consult apt-config about the configured proxy settings. If there are no proxy settings configured, an empty string is returned.
func AptGetInstall ¶
AptGetInstall runs 'apt-get install packages' for the packages listed here
func AptProxyContent ¶
func AptProxyContent(proxy osenv.ProxySettings) string
AptProxyContent produces the format expected by the apt config files from the ProxySettings struct.
func AtomicWriteFile ¶
AtomicWriteFile atomically writes the filename with the given contents and permissions, replacing any existing file at the same path.
func AtomicWriteFileAndChange ¶
func AtomicWriteFileAndChange(filename string, contents []byte, change func(*os.File) error) (err error)
AtomicWriteFileAndChange atomically writes the filename with the given contents and calls the given function after the contents were written, but before the file is renamed.
func CheckPendingShutdown ¶
func CheckPendingShutdown() (result bool)
func CommandString ¶
CommandString flattens a sequence of command arguments into a string suitable for executing in a shell, escaping slashes, variables and quotes as necessary; each argument is double-quoted if and only if necessary.
func DetectAptProxies ¶
func DetectAptProxies() (result osenv.ProxySettings, err error)
DetectAptProxies will parse the results of AptConfigProxy to return a ProxySettings instance.
func ErrorContextf ¶
ErrorContextf prefixes any error stored in err with text formatted according to the format specifier. If err does not contain an error, ErrorContextf does nothing.
func GetAddressForInterface ¶
GetAddressForInterface looks for the network interface and returns the IPv4 address from the possible addresses.
func GetIPv4Address ¶
GetIPv4Address iterates through the addresses expecting the format from func (ifi *net.Interface) Addrs() ([]net.Addr, error)
func IsPackageInstalled ¶
IsPackageInstalled uses dpkg-query to determine if the `packageName` package is installed.
func IsValidUUIDString ¶
IsValidUUIDString returns true, if the given string matches a valid UUID (version 4, variant 2).
func JoinServerPath ¶
JoinServerPath joins any number of path elements into a single path, adding a path separator (based on the current juju server OS) if necessary. The result is Cleaned; in particular, all empty strings are ignored.
func NewHttpTLSTransport ¶
NewHttpTLSTransport returns a new http.Transport constructed with the TLS config and the necessary parameters for Juju.
func NewHttpTransport ¶
NewHttpTransport returns a new http.Transport constructed with the necessary parameters for Juju.
func NormalizePath ¶
NormalizePath expands a path containing ~ to its absolute form, and removes any .. or . path elements.
func PathToWindows ¶
gsamfira: The PathToWindows is a parlous one. Quick and dirty hack to Get around the separator issue when generation windows paths on linux
func RandomPassword ¶
RandomPassword generates a random base64-encoded password.
func RandomSalt ¶
RandomSalt generates a random base64 data suitable for using as a password salt The pbkdf2 guideline is to use 8 bytes of salt, so we do 12 raw bytes into 16 base64 bytes. (The alternative is 6 raw into 8 base64).
func ReadFileSHA256 ¶
ReadFileSHA256 is like ReadSHA256 but reads the contents of the given file.
func ReadSHA256 ¶
ReadSHA256 returns the SHA256 hash of the contents read from source (hex encoded) and the size of the source in bytes.
func ReadSocketFile ¶
func ReadYaml ¶
ReadYaml unmarshals the yaml contained in the file at path into obj. See goyaml.Unmarshal.
func ReplaceFile ¶
Replace atomically replaces the destination file or directory with the source. The errors that are returned are identical to those returned by os.Rename.
func RunCommand ¶
RunCommand executes the command and return the combined output.
func ShQuote ¶
ShQuote quotes s so that when read by bash, no metacharacters within s will be interpreted as such.
func Timeit ¶
func Timeit(action string) func()
Start a timer, used for tracking time spent. Generally used with either defer, as in:
defer utils.Timeit("my func")()
Which will track how much time is spent in your function. Or if you want to track the time spent in a function you are calling then you would use:
toc := utils.Timeit("anotherFunc()") anotherFunc() toc()
This tracks nested calls by indenting the output, and will print out the full stack of timing when we reach the top of the stack.
func UniqueDirectory ¶
UniqueDirectory returns "path/name" if that directory doesn't exist. If it does, the method starts appending .1, .2, etc until a unique name is found.
func UserHomeDir ¶
UserHomeDir returns the home directory for the specified user, or the home directory for the current user if the specified user is empty.
func UserPasswordHash ¶
UserPasswordHash returns base64-encoded one-way hash password that is computationally hard to crack by iterating through possible passwords.
func WriteSocketFile ¶
TODO: get rid of this once named pipes are in This actually writes a text file on disk with the port nr assigned to the unit agent.
Types ¶
type Attempt ¶
type Attempt struct {
// contains filtered or unexported fields
}
func (*Attempt) HasNext ¶
HasNext returns whether another attempt will be made if the current one fails. If it returns true, the following call to Next is guaranteed to return true.
Example ¶
package main import ( "time" gc "launchpad.net/gocheck" "launchpad.net/juju-core/utils" ) func doSomething() (int, error) { return 0, nil } func shouldRetry(error) bool { return false } func doSomethingWith(int) {} func main() { // This example shows how Attempt.HasNext can be used to help // structure an attempt loop. If the godoc example code allowed // us to make the example return an error, we would uncomment // the commented return statements. attempts := utils.AttemptStrategy{ Total: 1 * time.Second, Delay: 250 * time.Millisecond, } for attempt := attempts.Start(); attempt.Next(); { x, err := doSomething() if shouldRetry(err) && attempt.HasNext() { continue } if err != nil { // return err return } doSomethingWith(x) } // return ErrTimedOut return } func (utilsSuite) TestAttemptTiming(c *gc.C) { testAttempt := utils.AttemptStrategy{ Total: 0.25e9, Delay: 0.1e9, } want := []time.Duration{0, 0.1e9, 0.2e9, 0.2e9} got := make([]time.Duration, 0, len(want)) // avoid allocation when testing timing t0 := time.Now() for a := testAttempt.Start(); a.Next(); { got = append(got, time.Now().Sub(t0)) } got = append(got, time.Now().Sub(t0)) c.Assert(got, gc.HasLen, len(want)) const margin = 0.01e9 for i, got := range want { lo := want[i] - margin hi := want[i] + margin if got < lo || got > hi { c.Errorf("attempt %d want %g got %g", i, want[i].Seconds(), got.Seconds()) } } } func (utilsSuite) TestAttemptNextHasNext(c *gc.C) { a := utils.AttemptStrategy{}.Start() c.Assert(a.Next(), gc.Equals, true) c.Assert(a.Next(), gc.Equals, false) a = utils.AttemptStrategy{}.Start() c.Assert(a.Next(), gc.Equals, true) c.Assert(a.HasNext(), gc.Equals, false) c.Assert(a.Next(), gc.Equals, false) a = utils.AttemptStrategy{Total: 2e8}.Start() c.Assert(a.Next(), gc.Equals, true) c.Assert(a.HasNext(), gc.Equals, true) time.Sleep(2e8) c.Assert(a.HasNext(), gc.Equals, true) c.Assert(a.Next(), gc.Equals, true) c.Assert(a.Next(), gc.Equals, false) a = utils.AttemptStrategy{Total: 1e8, Min: 2}.Start() time.Sleep(1e8) c.Assert(a.Next(), gc.Equals, true) c.Assert(a.HasNext(), gc.Equals, true) c.Assert(a.Next(), gc.Equals, true) c.Assert(a.HasNext(), gc.Equals, false) c.Assert(a.Next(), gc.Equals, false) }
Output:
type AttemptStrategy ¶
type AttemptStrategy struct { Total time.Duration // total duration of attempt. Delay time.Duration // interval between each try in the burst. Min int // minimum number of retries; overrides Total }
AttemptStrategy represents a strategy for waiting for an action to complete successfully.
func (AttemptStrategy) Start ¶
func (s AttemptStrategy) Start() *Attempt
Start begins a new sequence of attempts for the given strategy.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
On-disk mutex protecting a resource A lock is represented on disk by a directory of a particular name, containing an information file.
|
On-disk mutex protecting a resource A lock is represented on disk by a directory of a particular name, containing an information file. |
The parallel package provides a way of running functions concurrently while limiting the maximum number running at once.
|
The parallel package provides a way of running functions concurrently while limiting the maximum number running at once. |
Package ssh contains utilities for dealing with SSH connections, key management, and so on.
|
Package ssh contains utilities for dealing with SSH connections, key management, and so on. |
Package voyeur implements a concurrency-safe value that can be watched for changes.
|
Package voyeur implements a concurrency-safe value that can be watched for changes. |