func()

in google_guest_agent/diagnostics.go [90:138]


func (d *diagnosticsMgr) Set(ctx context.Context) error {
	logger.Infof("Diagnostics: logs export requested.")
	diagnosticsEntries, err := readRegMultiString(regKeyBase, diagnosticsRegKey)
	if err != nil && err != errRegNotExist {
		return err
	}

	strEntry := newMetadata.Instance.Attributes.Diagnostics
	if slices.Contains(diagnosticsEntries, strEntry) {
		return nil
	}
	diagnosticsEntries = append(diagnosticsEntries, strEntry)

	var entry diagnosticsEntry
	if err := json.Unmarshal([]byte(strEntry), &entry); err != nil {
		return err
	}

	expired, _ := utils.CheckExpired(entry.ExpireOn)
	if entry.SignedURL == "" || expired {
		return nil
	}

	args := []string{
		"-signedUrl",
		entry.SignedURL,
	}
	if entry.Trace {
		args = append(args, "-trace")
	}
	// If no existing running job, set it to 1 and block other requests
	if !atomic.CompareAndSwapInt32(&isDiagnosticsRunning, 0, 1) {
		logger.Infof("Diagnostics: reject the request, as an existing process is collecting logs from the system")
		return nil
	}

	go func() {
		logger.Infof("Diagnostics: collecting logs from the system.")
		res := run.WithCombinedOutput(ctx, diagnosticsCmd, args...)
		logger.Infof(res.Combined)
		if res.ExitCode != 0 {
			logger.Warningf("Error collecting logs: %v", res.Error())
		}
		// Job is done, unblock the following requests
		atomic.SwapInt32(&isDiagnosticsRunning, 0)
	}()

	return writeRegMultiString(regKeyBase, diagnosticsRegKey, diagnosticsEntries)
}