From d42e4e2562e78210398bf2e6de98370211c56a52 Mon Sep 17 00:00:00 2001 From: mitchell Date: Mon, 30 Oct 2023 14:27:10 -0400 Subject: [PATCH] Removed offline installer from the repo. It exists as a separate repository now. --- activestate.offlineinstall.yaml | 37 -- cmd/state-offline-installer/install.go | 492 --------------- cmd/state-offline-installer/main.go | 137 ----- cmd/state-offline-installer/progress.go | 92 --- cmd/state-offline-uninstaller/main.go | 136 ----- cmd/state-offline-uninstaller/uninstall.go | 233 -------- internal/offinstall/storage_darwin.go | 17 - internal/offinstall/storage_linux.go | 17 - internal/offinstall/storage_windows.go | 11 - test/integration/offinstall_int_test.go | 509 ---------------- .../bin/test-another-offline-install | 2 - .../artifact/installdir/bin/test.hello | 0 .../artifact/runtime.json | 23 - .../bin/test-another-offline-install.bat | 1 - .../artifact/installdir/bin/test.hello | 0 .../artifact/runtime.json | 23 - .../installdir/bin/test-offline-install | 2 - .../artifact/installdir/bin/test.hello | 0 .../artifact/runtime.json | 23 - .../installdir/bin/test-offline-install.bat | 1 - .../artifact/installdir/bin/test.hello | 0 .../artifact/runtime.json | 23 - .../Another-IntegrationTest/LICENSE.txt | 563 ------------------ .../installer_config.json | 6 - .../assets/IntegrationTest/LICENSE.txt | 563 ------------------ .../IntegrationTest/installer_config.json | 6 - 26 files changed, 2917 deletions(-) delete mode 100644 activestate.offlineinstall.yaml delete mode 100644 cmd/state-offline-installer/install.go delete mode 100644 cmd/state-offline-installer/main.go delete mode 100644 cmd/state-offline-installer/progress.go delete mode 100644 cmd/state-offline-uninstaller/main.go delete mode 100644 cmd/state-offline-uninstaller/uninstall.go delete mode 100644 internal/offinstall/storage_darwin.go delete mode 100644 internal/offinstall/storage_linux.go delete mode 100644 internal/offinstall/storage_windows.go delete mode 100644 test/integration/offinstall_int_test.go delete mode 100755 test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test-another-offline-install delete mode 100644 test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test.hello delete mode 100644 test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/runtime.json delete mode 100644 test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test-another-offline-install.bat delete mode 100644 test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test.hello delete mode 100644 test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/runtime.json delete mode 100755 test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test-offline-install delete mode 100644 test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test.hello delete mode 100644 test/integration/testdata/offline-install/artifacts-payload-nix/artifact/runtime.json delete mode 100644 test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test-offline-install.bat delete mode 100644 test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test.hello delete mode 100644 test/integration/testdata/offline-install/artifacts-payload-windows/artifact/runtime.json delete mode 100644 test/integration/testdata/offline-install/assets/Another-IntegrationTest/LICENSE.txt delete mode 100644 test/integration/testdata/offline-install/assets/Another-IntegrationTest/installer_config.json delete mode 100644 test/integration/testdata/offline-install/assets/IntegrationTest/LICENSE.txt delete mode 100644 test/integration/testdata/offline-install/assets/IntegrationTest/installer_config.json diff --git a/activestate.offlineinstall.yaml b/activestate.offlineinstall.yaml deleted file mode 100644 index 8e3b1d7867..0000000000 --- a/activestate.offlineinstall.yaml +++ /dev/null @@ -1,37 +0,0 @@ -constants: - - name: BUILD_OFFINSTALL_TARGET - if: ne .OS.Name "Windows" - value: offline-installer - - name: BUILD_OFFINSTALL_TARGET - if: eq .OS.Name "Windows" - value: offline-installer.exe - - name: OFFINSTALL_PKGS - value: ./cmd/state-offline-installer - - name: BUILD_OFFUNINSTALL_TARGET - if: ne .OS.Name "Windows" - value: uninstall - - name: BUILD_OFFUNINSTALL_TARGET - if: eq .OS.Name "Windows" - value: uninstall.exe - - name: OFFUNINSTALL_PKGS - value: ./cmd/state-offline-uninstaller -scripts: - - name: build-offline-installer - language: bash - description: Builds the project with the host OS as the target OS. - value: | - set -e - $constants.SET_ENV - - rm $BUILD_TARGET_DIR/offline/${constants.BUILD_OFFINSTALL_TARGET} || : - go build -tags "$GO_BUILD_TAGS" -o $BUILD_TARGET_DIR/offline/$constants.BUILD_OFFINSTALL_TARGET $constants.CLI_BUILDFLAGS $constants.OFFINSTALL_PKGS - go build -tags "$GO_BUILD_TAGS" -o $BUILD_TARGET_DIR/offline/$constants.BUILD_OFFUNINSTALL_TARGET $constants.CLI_BUILDFLAGS $constants.OFFUNINSTALL_PKGS - - name: pkg-offline-installer - language: bash - description: Packages the installer / uninstaller with the assets it requires - value: | - set -e - $constants.SET_ENV - - cd $BUILD_TARGET_DIR/offline/ - gozip -c ${constants.BUILD_OFFINSTALL_TARGET} artifacts.tar.gz LICENSE.txt installer_config.json $constants.BUILD_OFFUNINSTALL_TARGET diff --git a/cmd/state-offline-installer/install.go b/cmd/state-offline-installer/install.go deleted file mode 100644 index 25dc4db130..0000000000 --- a/cmd/state-offline-installer/install.go +++ /dev/null @@ -1,492 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - rt "runtime" - - "github.com/ActiveState/cli/internal/analytics" - ac "github.com/ActiveState/cli/internal/analytics/constants" - "github.com/ActiveState/cli/internal/analytics/dimensions" - "github.com/ActiveState/cli/internal/assets" - "github.com/ActiveState/cli/internal/config" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/exeutils" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/offinstall" - "github.com/ActiveState/cli/internal/osutils" - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/internal/primer" - "github.com/ActiveState/cli/internal/prompt" - "github.com/ActiveState/cli/internal/rtutils/ptr" - "github.com/ActiveState/cli/internal/subshell" - "github.com/ActiveState/cli/internal/subshell/sscommon" - "github.com/ActiveState/cli/internal/testhelpers/outputhelper" - "github.com/ActiveState/cli/internal/unarchiver" - "github.com/ActiveState/cli/pkg/platform/runtime" - "github.com/ActiveState/cli/pkg/platform/runtime/setup/events" - "github.com/ActiveState/cli/pkg/platform/runtime/target" - "github.com/ActiveState/cli/pkg/project" - "github.com/vbauerster/mpb/v7" - "github.com/vbauerster/mpb/v7/decor" -) - -const artifactsTarGZName = "artifacts.tar.gz" -const assetsPathName = "assets" -const artifactsPathName = "artifacts" -const licenseFileName = "LICENSE.txt" -const installerConfigFileName = "installer_config.json" -const uninstallerFileNameRoot = "uninstall" + exeutils.Extension - -type runner struct { - out output.Outputer - prompt prompt.Prompter - analytics analytics.Dispatcher - cfg *config.Instance - shell subshell.SubShell - icfg InstallerConfig -} - -type primeable interface { - primer.Outputer - primer.Prompter - primer.Analyticer - primer.Configurer - primer.Subsheller -} - -func NewRunner(prime primeable) *runner { - return &runner{ - prime.Output(), - prime.Prompt(), - prime.Analytics(), - prime.Config(), - prime.Subshell(), - InstallerConfig{}, - } -} - -type InstallerConfig struct { - OrgName string `json:"org_name"` - ProjectID string `json:"project_id"` - ProjectName string `json:"project_name"` - CommitID string `json:"commit_id"` -} - -type Params struct { - path string -} - -func newParams() *Params { - return &Params{} -} - -func (r *runner) Run(params *Params) (rerr error) { - var installerDimensions *dimensions.Values - defer func() { - if rerr == nil { - return - } - if locale.IsInputError(rerr) { - r.analytics.EventWithLabel(ac.CatOfflineInstaller, ac.ActOfflineInstallerAbort, errs.JoinMessage(rerr), installerDimensions) - } else { - r.analytics.EventWithLabel(ac.CatOfflineInstaller, ac.ActOfflineInstallerFailure, errs.JoinMessage(rerr), installerDimensions) - } - }() - - tempDir, err := ioutil.TempDir("", "artifacts-") - if err != nil { - return errs.Wrap(err, "Unable to create temporary directory") - } - defer os.RemoveAll(tempDir) - - /* Extract Assets */ - backpackZipFile := os.Args[0] - assetsPath := filepath.Join(tempDir, assetsPathName) - if err := r.extractAssets(assetsPath, backpackZipFile); err != nil { - return errs.Wrap(err, "Could not extract assets") - } - - err = r.prepareInstallerConfig(assetsPath) - if err != nil { - return errs.Wrap(err, "Could not read installer config, this installer appears to be corrupted.") - } - - namespace := project.NewNamespace(r.icfg.OrgName, r.icfg.ProjectName, "") - installerDimensions = &dimensions.Values{ - ProjectNameSpace: ptr.To(namespace.String()), - CommitID: &r.icfg.CommitID, - Trigger: ptr.To(target.TriggerOfflineInstaller.String()), - } - r.analytics.Event(ac.CatOfflineInstaller, "start", installerDimensions) - - // Detect target path - targetPath, err := r.getTargetPath(params.path) - if err != nil { - return errs.Wrap(err, "Could not determine target path") - } - - /* Validate Target Path */ - if err := r.validateTargetPath(targetPath); err != nil { - return errs.Wrap(err, "Could not validate target path") - } - - /* Prompt for License */ - accepted, err := r.promptLicense(assetsPath) - if err != nil { - return errs.Wrap(err, "Could not prompt for license") - } - if !accepted { - return locale.NewInputError("License not accepted") - } - - /* Extract Artifacts */ - artifactsPath := filepath.Join(tempDir, artifactsPathName) - if err := r.extractArtifacts(artifactsPath, assetsPath); err != nil { - return errs.Wrap(err, "Could not extract artifacts") - } - - /* Install Artifacts */ - asrt, err := r.setupRuntime(artifactsPath, targetPath) - if err != nil { - return errs.Wrap(err, "Could not setup runtime") - } - - /* Manually Install License File */ - { - err = fileutils.CopyFile(filepath.Join(assetsPath, licenseFileName), filepath.Join(targetPath, licenseFileName)) - if err != nil { - return errs.Wrap(err, "Error copying license file") - } - } - - /* Manually Install config File */ - { - err = fileutils.CopyFile( - filepath.Join(assetsPath, installerConfigFileName), - filepath.Join(targetPath, installerConfigFileName), - ) - if err != nil { - return errs.Wrap(err, "Error copying config file") - } - } - - var uninstallerSrc string - var uninstallerDest string - - /* Manually Install uninstaller */ - if rt.GOOS == "windows" { - /* shenanigans because windows won't let you delete an executable that's running */ - installDir, err := filepath.Abs(targetPath) - if err != nil { - return errs.Wrap(err, "Error determining absolute install directory") - } - uninstallDir := filepath.Join(installDir, "uninstall-data") - if fileutils.DirExists(uninstallDir) { - if err := os.RemoveAll(uninstallDir); err != nil { - return errs.Wrap(err, "Error removing uninstall directory") - } - } - if err := os.Mkdir(uninstallDir, os.ModeDir); err != nil { - return errs.Wrap(err, "Error creating uninstall directory") - } - - uninstallerSrc = filepath.Join(assetsPath, uninstallerFileNameRoot) - uninstallerDest = filepath.Join(uninstallDir, uninstallerFileNameRoot) - - // create batch script which copies the uninstaller to a temp dir and runs it from there this is necessary - // because windows won't let you delete an executable that's running - // The last message about ignoring the error is because the uninstaller will delete the directory the batch file - // is in, which unlike with the exe is fine because batch files are "special", but it does result in a benign - // "File not Found" error - batch := fmt.Sprintf( - ` - @echo off - copy %[1]s\%[2]s %%TEMP%%\%[2]s >nul 2>&1 - %%TEMP%%\%[2]s %[3]s - del %%TEMP%%\%[2]s >nul 2>&1 - echo You can safely ignore any File not Found errors following this message. - `, - uninstallDir, - uninstallerFileNameRoot, - installDir, - ) - err = os.WriteFile(filepath.Join(installDir, "uninstall.bat"), []byte(batch), 0755) - if err != nil { - return errs.Wrap(err, "Error creating uninstall script") - } - } else { - uninstallerSrc = filepath.Join(assetsPath, uninstallerFileNameRoot) - uninstallerDest = filepath.Join(targetPath, uninstallerFileNameRoot) - } - { - if fileutils.TargetExists(uninstallerDest) { - err := os.Remove(uninstallerDest) - if err != nil { - return errs.Wrap(err, "Error removing existing uninstaller") - } - } - err = fileutils.CopyFile( - uninstallerSrc, - uninstallerDest, - ) - if err != nil { - return errs.Wrap(err, "Error copying uninstaller") - } - err = os.Chmod(uninstallerDest, 0555) - if err != nil { - return errs.Wrap(err, "Error making uninstaller executable") - } - } - - /* Configure Environment */ - if err := r.configureEnvironment(targetPath, namespace, asrt); err != nil { - return errs.Wrap(err, "Could not configure environment") - } - - r.analytics.Event(ac.CatOfflineInstaller, ac.ActOfflineInstallerSuccess, installerDimensions) - - r.out.Print(fmt.Sprintf(`Installation complete. -Your language runtime has been installed in [ACTIONABLE]%s[/RESET].`, targetPath)) - - return nil -} - -func (r *runner) prepareInstallerConfig(assetsPath string) error { - icfg := InstallerConfig{} - installerConfigPath := filepath.Join(assetsPath, installerConfigFileName) - configData, err := os.ReadFile(installerConfigPath) - if err != nil { - return errs.Wrap(err, "Failed to read config_file") - } - if err := json.Unmarshal(configData, &icfg); err != nil { - return errs.Wrap(err, "Failed to decode config_file") - } - - if icfg.ProjectName == "" { - return errs.New("ProjectName is empty") - } - - if icfg.OrgName == "" { - return errs.New("OrgName is empty") - } - - if icfg.CommitID == "" { - return errs.New("CommitID is empty") - } - - r.icfg = icfg - - return nil -} - -func (r *runner) setupRuntime(artifactsPath string, targetPath string) (*runtime.Runtime, error) { - logfile, err := buildlogfile.New(outputhelper.NewCatcher()) - if err != nil { - return nil, errs.Wrap(err, "Unable to create new logfile object") - } - - ns := project.NewNamespace(r.icfg.OrgName, r.icfg.ProjectName, r.icfg.CommitID) - offlineTarget := target.NewOfflineTarget(ns, targetPath, artifactsPath) - offlineTarget.SetTrigger(target.TriggerOfflineInstaller) - - offlineProgress := newOfflineProgressOutput(r.out) - eventHandler := events.NewRuntimeEventHandler(offlineProgress, nil, logfile) - - rti, err := runtime.New(offlineTarget, r.analytics, nil, nil) - if err != nil { - if !runtime.IsNeedsUpdateError(err) { - return nil, errs.Wrap(err, "Could not create runtime") - } - if err = rti.Update(eventHandler); err != nil { - return nil, errs.Wrap(err, "Had an installation error") - } - } - return rti, nil -} - -func (r *runner) extractArtifacts(artifactsPath, assetsPath string) error { - if err := os.Mkdir(artifactsPath, os.ModePerm); err != nil { - return errs.Wrap(err, "Unable to create artifactsPath directory") - } - - archivePath := filepath.Join(assetsPath, artifactsTarGZName) - ua := unarchiver.NewTarGz() - f, siz, err := ua.PrepareUnpacking(archivePath, artifactsPath) - if err != nil { - return errs.Wrap(err, "Unable to prepare unpacking of artifact tarball") - } - - pb := mpb.New( - mpb.WithWidth(40), - ) - barName := "Extracting" - bar := pb.AddBar( - siz, - mpb.PrependDecorators(decor.Name(barName, decor.WC{W: len(barName) + 1, C: decor.DidentRight})), - ) - - ua.SetNotifier(func(filename string, _ int64, isDir bool) { - if !isDir { - bar.Increment() - } - }) - - err = ua.Unarchive(f, siz, artifactsPath) - if err != nil { - return errs.Wrap(err, "Unable to unarchive artifacts to artifactsPath") - } - - bar.SetTotal(0, true) - bar.Abort(true) - pb.Wait() - - return nil -} - -func (r *runner) extractAssets(assetsPath string, backpackZipFile string) error { - if err := os.Mkdir(assetsPath, os.ModePerm); err != nil { - return errs.Wrap(err, "Unable to create assetsPath") - } - - ua := unarchiver.NewZip() - f, siz, err := ua.PrepareUnpacking(backpackZipFile, assetsPath) - if err != nil { - return errs.Wrap(err, "Unable to prepare unpacking of backpack") - } - - err = ua.Unarchive(f, siz, assetsPath) - if err != nil { - return errs.Wrap(err, "Unable to unarchive Assets to assetsPath") - } - - return nil -} - -func (r *runner) configureEnvironment(path string, namespace *project.Namespaced, asrt *runtime.Runtime) error { - env, err := asrt.Env(false, false) - if err != nil { - return errs.Wrap(err, "Error setting environment") - } - - if rt.GOOS == "windows" { - contents, err := assets.ReadFileBytes("scripts/setenv.bat") - if err != nil { - return errs.Wrap(err, "Error reading file bytes") - } - err = fileutils.WriteFile(filepath.Join(path, "setenv.bat"), contents) - if err != nil { - return locale.WrapError(err, - "err_deploy_write_setenv", - "Could not create setenv batch scriptfile at path: {{.V0}}", - path) - } - } - - // Configure available shells - isAdmin, err := osutils.IsAdmin() - if err != nil { - return errs.Wrap(err, "Could not determine if running as Windows administrator") - } - - id := sscommon.ProjectRCIdentifier(sscommon.OfflineInstallID, namespace) - err = subshell.ConfigureAvailableShells(r.shell, r.cfg, env, id, !isAdmin) - if err != nil { - return locale.WrapError(err, - "err_deploy_subshell_write", - "Could not write environment information to your shell configuration.") - } - - binPath := filepath.Join(path, "bin") - if err := fileutils.MkdirUnlessExists(binPath); err != nil { - return locale.WrapError(err, "err_deploy_binpath", "Could not create bin directory.") - } - - // Write global env file - err = r.shell.SetupShellRcFile(binPath, env, nil) - if err != nil { - return locale.WrapError(err, "err_deploy_subshell_rc_file", "Could not create environment script.") - } - - return nil -} - -func (r *runner) getTargetPath(inputPath string) (string, error) { - var targetPath string - if inputPath != "" { - targetPath = inputPath - } else { - parentDir, err := offinstall.DefaultInstallParentDir() - if err != nil { - return "", errs.Wrap(err, "Could not determine default install path") - } - targetPath = filepath.Join(parentDir, r.icfg.ProjectName) - - targetPath, err = r.prompt.Input("", "Enter an installation directory", &targetPath) - if err != nil { - return "", errs.Wrap(err, "Could not retrieve installation directory") - } - } - return targetPath, nil -} - -func (r *runner) validateTargetPath(path string) error { - if !fileutils.IsWritable(path) { - return errs.New( - "Cannot write to [ACTIONABLE]%s[/RESET]. Please ensure that the directory is writeable without "+ - "needing admin privileges or run this installer with Admin.", path) - } - - if fileutils.TargetExists(path) { - if !fileutils.IsDir(path) { - return errs.New("Target path [ACTIONABLE]%s[/RESET] is not a directory", path) - } - - empty, err := fileutils.IsEmptyDir(path) - if err != nil { - return errs.Wrap(err, "Test for directory empty failed") - } - if !empty { - installNonEmpty, err := r.prompt.Confirm( - "Setup", - "Installation directory is not empty, install anyway?", - ptr.To(true)) - if err != nil { - return errs.Wrap(err, "Unable to get confirmation to install into non-empty directory") - } - - if !installNonEmpty { - return locale.NewInputError( - "offline_installer_err_installdir_notempty", - "Installation directory ({{.V0}}) not empty, installation aborted", - path) - } - } - } - - return nil -} - -func (r *runner) promptLicense(assetsPath string) (bool, error) { - licenseFileAssetPath := filepath.Join(assetsPath, licenseFileName) - licenseContents, err := fileutils.ReadFile(licenseFileAssetPath) - if err != nil { - return false, errs.Wrap(err, "Unable to open License file") - } - r.out.Print(licenseContents) - - choice, err := r.prompt.Confirm("", "Do you accept the ActiveState Runtime Installer License Agreement?", ptr.To(false)) - if err != nil { - return false, err - } - - if err != nil { - return false, errs.Wrap(err, "Unable to confirm license") - } - - return choice, nil -} diff --git a/cmd/state-offline-installer/main.go b/cmd/state-offline-installer/main.go deleted file mode 100644 index 82b8cd86e7..0000000000 --- a/cmd/state-offline-installer/main.go +++ /dev/null @@ -1,137 +0,0 @@ -package main - -import ( - "fmt" - "os" - "runtime/debug" - "time" - - "github.com/ActiveState/cli/internal/analytics" - "github.com/ActiveState/cli/internal/analytics/client/sync" - anaConst "github.com/ActiveState/cli/internal/analytics/constants" - "github.com/ActiveState/cli/internal/captain" - "github.com/ActiveState/cli/internal/config" - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/events" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/multilog" - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/internal/primer" - "github.com/ActiveState/cli/internal/prompt" - "github.com/ActiveState/cli/internal/rollbar" - "github.com/ActiveState/cli/internal/rtutils/ptr" - "github.com/ActiveState/cli/internal/runbits/panics" - "github.com/ActiveState/cli/internal/subshell" - "github.com/ActiveState/cli/pkg/cmdlets/errors" -) - -func main() { - var exitCode int - - var an analytics.Dispatcher - var cfg *config.Instance - rollbar.SetupRollbar(constants.OfflineInstallerRollbarToken) - - // Allow starting the installer via a double click - captain.DisableMousetrap() - - // Handle things like panics, exit codes and the closing of globals - defer func() { - if panics.HandlePanics(recover(), debug.Stack()) { - exitCode = 1 - } - - if err := cfg.Close(); err != nil { - logging.Error("Failed to close config: %w", err) - } - - if err := events.WaitForEvents(5*time.Second, rollbar.Wait, an.Wait, logging.Close); err != nil { - logging.Warning("state-remote-installer failed to wait for events: %v", err) - } - os.Exit(exitCode) - }() - - if os.Getenv("VERBOSE") == "true" { - logging.CurrentHandler().SetVerbose(true) - } - - // Set up configuration handler - cfg, err := config.New() - if err != nil { - logging.Critical("Could not set up configuration handler: " + errs.JoinMessage(err)) - fmt.Fprintln(os.Stderr, errs.JoinMessage(err)) - exitCode = 1 - return - } - - rollbar.SetConfig(cfg) - - out, err := output.New("", &output.Config{ - OutWriter: os.Stdout, - ErrWriter: os.Stderr, - }) - if err != nil { - logging.Critical("Could not set up outputter: " + errs.JoinMessage(err)) - fmt.Fprintln(os.Stderr, errs.JoinMessage(err)) - exitCode = 1 - return - } - - an = sync.New(anaConst.SrcOfflineInstaller, cfg, nil, out) - - prime := primer.New( - nil, out, nil, - prompt.New(true, an), - subshell.New(cfg), nil, cfg, - nil, nil, an) - - if err := run(prime); err != nil { - if locale.IsInputError(err) { - logging.Debug("state-offline-installer errored out due to input: %s", errs.JoinMessage(err)) - } else { - multilog.Critical("state-offline-installer errored out: %s", errs.JoinMessage(err)) - } - - exitCode, _ = errors.ParseUserFacing(err) - if err != nil { - fmt.Fprintln(os.Stderr, errs.JoinMessage(err)) - } - } - out.Print("Press enter to exit.") - fmt.Scanln(ptr.To("")) // Wait for input from user -} - -func run(prime *primer.Values) error { - params := newParams() - - cmd := captain.NewCommand( - "install", - "Doing offline installation", - "Do an offline installation", - prime, nil, - []*captain.Argument{ - { - Name: "path", - Description: "Install into target directory ", - Value: ¶ms.path, - Required: false, - }, - }, - func(ccmd *captain.Command, args []string) error { - logging.Debug("Running CmdInstall") - runner := NewRunner(prime) - return runner.Run(params) - }, - ) - - err := cmd.Execute(os.Args[1:]) - if err != nil { - errors.PanicOnMissingLocale = false - errors.ReportError(err, cmd, prime.Analytics()) - return err - } - - return nil -} diff --git a/cmd/state-offline-installer/progress.go b/cmd/state-offline-installer/progress.go deleted file mode 100644 index 81515452dd..0000000000 --- a/cmd/state-offline-installer/progress.go +++ /dev/null @@ -1,92 +0,0 @@ -package main - -import ( - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/pkg/platform/model" - "github.com/ActiveState/cli/pkg/platform/runtime/artifact" - "github.com/vbauerster/mpb/v7" - "github.com/vbauerster/mpb/v7/decor" -) - -// New returns an error with the supplied message. -// New also records the stack trace at the point it was called. -// func New(out output.Outputer) *offlineProgressOutput { -// -// return &offlineProgressOutput{ -// out: out, -// } -// } - -type offlineProgressOutput struct { - out output.Outputer - pb *mpb.Progress - bar *mpb.Bar -} - -func newOfflineProgressOutput(out output.Outputer) *offlineProgressOutput { - return &offlineProgressOutput{out: out} -} - -func (mpo *offlineProgressOutput) BuildStarted(total int64) error { - return nil -} -func (mpo *offlineProgressOutput) BuildCompleted(bool) error { - return nil -} - -func (mpo *offlineProgressOutput) BuildArtifactStarted(artifactID artifact.ArtifactID, artifactName string) error { - return nil -} -func (mpo *offlineProgressOutput) BuildArtifactCompleted(artifactID artifact.ArtifactID, artifactName, logURI string, cachedBuild bool) error { - return nil -} -func (mpo *offlineProgressOutput) BuildArtifactFailure(artifactID artifact.ArtifactID, artifactName, logURI string, errorMessage string, cachedBuild bool) error { - return nil -} -func (mpo *offlineProgressOutput) BuildArtifactProgress(artifactID artifact.ArtifactID, artifactName, timeStamp, message, facility, pipeName, source string) error { - return nil -} - -func (mpo *offlineProgressOutput) InstallationCompleted(withFailures bool) error { - mpo.bar.SetTotal(0, true) - mpo.bar.Abort(true) - mpo.pb.Wait() - return nil -} -func (mpo *offlineProgressOutput) InstallationStarted(total int64) error { - mpo.pb = mpb.New(mpb.WithWidth(40)) - barName := "Installing" - mpo.bar = mpo.pb.AddBar(total, mpb.PrependDecorators(decor.Name(barName, decor.WC{W: len(barName) + 1, C: decor.DidentRight}))) - return nil -} -func (mpo *offlineProgressOutput) InstallationStatusUpdate(current, total int64) error { - mpo.bar.SetTotal(total, false) - mpo.bar.SetCurrent(current) - return nil -} -func (mpo *offlineProgressOutput) ArtifactStepStarted(artifactID artifact.ArtifactID, artifactName string, title string, total int64, counterCountsBytes bool) error { - return nil -} -func (mpo *offlineProgressOutput) ArtifactStepIncrement(artifactID artifact.ArtifactID, artifactName string, title string, total int64) error { - return nil -} -func (mpo *offlineProgressOutput) ArtifactStepCompleted(artifactID artifact.ArtifactID, artifactName string, title string) error { - return nil -} -func (mpo *offlineProgressOutput) ArtifactStepFailure(artifact.ArtifactID, string, string, string) error { - return nil -} -func (mpo *offlineProgressOutput) StillBuilding(numCompleted, numTotal int) error { - return nil -} -func (mpo *offlineProgressOutput) SolverStart() error { - return nil -} - -func (mpo *offlineProgressOutput) SolverSuccess() error { - return nil -} -func (mpo *offlineProgressOutput) SolverError(serr *model.SolverError) error { - return nil -} -func (mpo *offlineProgressOutput) Close() error { return nil } diff --git a/cmd/state-offline-uninstaller/main.go b/cmd/state-offline-uninstaller/main.go deleted file mode 100644 index 0ba17527c5..0000000000 --- a/cmd/state-offline-uninstaller/main.go +++ /dev/null @@ -1,136 +0,0 @@ -package main - -import ( - "fmt" - "os" - "runtime/debug" - "time" - - "github.com/ActiveState/cli/internal/analytics" - "github.com/ActiveState/cli/internal/analytics/client/sync" - anaConst "github.com/ActiveState/cli/internal/analytics/constants" - "github.com/ActiveState/cli/internal/captain" - "github.com/ActiveState/cli/internal/config" - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/events" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/multilog" - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/internal/primer" - "github.com/ActiveState/cli/internal/prompt" - "github.com/ActiveState/cli/internal/rollbar" - "github.com/ActiveState/cli/internal/rtutils/ptr" - "github.com/ActiveState/cli/internal/runbits/panics" - "github.com/ActiveState/cli/internal/subshell" - "github.com/ActiveState/cli/pkg/cmdlets/errors" -) - -func main() { - var exitCode int - - var an analytics.Dispatcher - var cfg *config.Instance - rollbar.SetupRollbar(constants.OfflineInstallerRollbarToken) - - // Allow starting the installer via a double click - captain.DisableMousetrap() - - // Handle things like panics, exit codes and the closing of globals - defer func() { - if panics.HandlePanics(recover(), debug.Stack()) { - exitCode = 1 - } - - if err := cfg.Close(); err != nil { - logging.Error("Failed to close config: %w", err) - } - - if err := events.WaitForEvents(5*time.Second, rollbar.Wait, an.Wait, logging.Close); err != nil { - logging.Warning("state-remote-installer failed to wait for events: %v", err) - } - os.Exit(exitCode) - }() - - if os.Getenv("VERBOSE") == "true" { - logging.CurrentHandler().SetVerbose(true) - } - - // Set up configuration handler - cfg, err := config.New() - if err != nil { - logging.Critical("Could not set up configuration handler: " + errs.JoinMessage(err)) - fmt.Fprintln(os.Stderr, errs.JoinMessage(err)) - exitCode = 1 - return - } - - rollbar.SetConfig(cfg) - - out, err := output.New("", &output.Config{ - OutWriter: os.Stdout, - ErrWriter: os.Stderr, - }) - if err != nil { - logging.Critical("Could not set up outputter: " + errs.JoinMessage(err)) - fmt.Fprintln(os.Stderr, errs.JoinMessage(err)) - exitCode = 1 - return - } - - an = sync.New(anaConst.SrcOfflineInstaller, cfg, nil, out) - - prime := primer.New( - nil, out, nil, - prompt.New(true, an), - subshell.New(cfg), nil, cfg, - nil, nil, an) - - if err := run(prime); err != nil { - if locale.IsInputError(err) { - logging.Debug("state-offline-uninstaller errored out due to input: %s", errs.JoinMessage(err)) - } else { - multilog.Critical("state-offline-uninstaller errored out: %s", errs.JoinMessage(err)) - } - - exitCode, _ = errors.ParseUserFacing(err) - if err != nil { - fmt.Fprintln(os.Stderr, errs.JoinMessage(err)) - } - } - out.Print("Press enter to exit.") - fmt.Scanln(ptr.To("")) // Wait for input from user -} - -func run(prime *primer.Values) error { - params := newParams() - cmd := captain.NewCommand( - "uninstall", - "Doing offline un-installation", - "Do an offline un-installation", - prime, nil, - []*captain.Argument{ - { - Name: "path", - Description: "Directory to uninstall ", - Value: ¶ms.path, - Required: false, - }, - }, - func(ccmd *captain.Command, args []string) error { - logging.Debug("Running CmdUnInstall") - runner := NewRunner(prime) - return runner.Run(params) - }, - ) - - err := cmd.Execute(os.Args[1:]) - if err != nil { - errors.PanicOnMissingLocale = false - errors.ReportError(err, cmd, prime.Analytics()) - return err - } - - return nil -} diff --git a/cmd/state-offline-uninstaller/uninstall.go b/cmd/state-offline-uninstaller/uninstall.go deleted file mode 100644 index 08a86065fc..0000000000 --- a/cmd/state-offline-uninstaller/uninstall.go +++ /dev/null @@ -1,233 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - - "github.com/ActiveState/cli/internal/analytics" - ac "github.com/ActiveState/cli/internal/analytics/constants" - "github.com/ActiveState/cli/internal/analytics/dimensions" - "github.com/ActiveState/cli/internal/config" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/primer" - "github.com/ActiveState/cli/internal/rtutils/ptr" - "github.com/ActiveState/cli/pkg/project" - - "github.com/ActiveState/cli/internal/osutils" - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/internal/prompt" - "github.com/ActiveState/cli/internal/subshell" - "github.com/ActiveState/cli/internal/subshell/sscommon" - "github.com/ActiveState/cli/pkg/platform/runtime/target" -) - -const licenseFileName = "LICENSE.txt" - -type runner struct { - out output.Outputer - prompt prompt.Prompter - analytics analytics.Dispatcher - cfg *config.Instance - shell subshell.SubShell - icfg InstallerConfig -} - -type primeable interface { - primer.Outputer - primer.Prompter - primer.Analyticer - primer.Configurer - primer.Subsheller -} - -func NewRunner(prime primeable) *runner { - return &runner{ - prime.Output(), - prime.Prompt(), - prime.Analytics(), - prime.Config(), - prime.Subshell(), - InstallerConfig{}, - } -} - -const installerConfigFileName = "installer_config.json" - -type InstallerConfig struct { - OrgName string `json:"org_name"` - ProjectID string `json:"project_id"` - ProjectName string `json:"project_name"` - CommitID string `json:"commit_id"` -} - -type Params struct { - path string -} - -func newParams() *Params { - return &Params{} -} - -func (r *runner) Run(params *Params) (rerr error) { - var installerDimensions *dimensions.Values - defer func() { - if rerr == nil { - return - } - if locale.IsInputError(rerr) { - r.analytics.EventWithLabel(ac.CatOfflineInstaller, ac.ActOfflineInstallerAbort, errs.JoinMessage(rerr), installerDimensions) - } else { - r.analytics.EventWithLabel(ac.CatOfflineInstaller, ac.ActOfflineInstallerFailure, errs.JoinMessage(rerr), installerDimensions) - } - }() - - // Detect target path - targetPath, err := r.getTargetPath(params.path) - if err != nil { - return errs.Wrap(err, "Could not determine target path") - } - - /* Validate Target Path */ - if err := r.validateTargetPath(targetPath); err != nil { - return errs.Wrap(err, "Could not validate target path") - } - - if err := r.prepareInstallerConfig(targetPath); err != nil { - return errs.Wrap(err, "Could not read installer config, this installer appears to be corrupted.") - } - - cont, err := r.prompt.Confirm("", - fmt.Sprintf("You are about to uninstall the runtime installed at [[ACTIONABLE]%s[/RESET], continue?", targetPath), - ptr.To(false)) - if err != nil { - return errs.Wrap(err, "Could not confirm uninstall") - } - if !cont { - return locale.NewInputError("err_uninstall_abort", "Uninstall aborted") - } - - namespace := project.NewNamespace(r.icfg.OrgName, r.icfg.ProjectName, "") - installerDimensions = &dimensions.Values{ - ProjectNameSpace: ptr.To(namespace.String()), - CommitID: &r.icfg.CommitID, - Trigger: ptr.To(target.TriggerOfflineUninstaller.String()), - } - r.analytics.Event(ac.CatOfflineInstaller, ac.ActOfflineInstallerStart, installerDimensions) - - r.out.Print("Removing environment configuration") - err = r.removeEnvPaths(namespace) - if err != nil { - return errs.Wrap(err, "Error removing environment path") - } - - r.out.Print("Removing installation directory") - err = os.RemoveAll(targetPath) - if err != nil { - return errs.Wrap(err, "Error removing installation directory") - } - - r.analytics.Event(ac.CatOfflineInstaller, ac.ActOfflineInstallerSuccess, installerDimensions) - r.analytics.Event(ac.CatRuntimeUsage, ac.ActRuntimeDelete, installerDimensions) - - r.out.Print("Uninstall Complete") - - return nil -} - -func (r *runner) prepareInstallerConfig(assetsPath string) error { - icfg := InstallerConfig{} - installerConfigPath := filepath.Join(assetsPath, installerConfigFileName) - - configData, err := os.ReadFile(installerConfigPath) - if err != nil { - return errs.Wrap(err, "Failed to read config_file") - } - if err := json.Unmarshal(configData, &icfg); err != nil { - return errs.Wrap(err, "Failed to decode config_file") - } - - if icfg.ProjectName == "" { - return errs.New("ProjectName is empty") - } - - if icfg.OrgName == "" { - return errs.New("OrgName is empty") - } - - if icfg.CommitID == "" { - return errs.New("CommitID is empty") - } - - r.icfg = icfg - - return nil -} - -func (r *runner) getTargetPath(inputPath string) (string, error) { - if inputPath != "" { - return inputPath, nil - } - - cwd, err := os.Getwd() - if err != nil { - return "", errs.Wrap(err, "Could not determine current working directory") - } - - var targetPath string - if fileutils.TargetExists(filepath.Join(cwd, installerConfigFileName)) { - targetPath = cwd - } - - if targetPath != "" { - targetPath, err = r.prompt.Input("", "Enter an installation directory to uninstall", &targetPath) - } else { - targetPath, err = r.prompt.Input("", "Enter an installation directory to uninstall", nil, prompt.InputRequired) - } - if err != nil { - return "", errs.Wrap(err, "Could not retrieve installation directory") - } - return targetPath, nil -} - -func (r *runner) validateTargetPath(path string) error { - if !fileutils.IsWritable(path) { - return errs.New( - "Cannot write to [ACTIONABLE]%s[/RESET]. Please ensure that the directory is writeable without "+ - "needing admin privileges or run this installer with Admin.", path) - } - - if !fileutils.IsDir(path) { - return errs.New("Target path [ACTIONABLE]%s[/RESET] is not a directory", path) - } - - installerConfigPath := filepath.Join(path, installerConfigFileName) - if !fileutils.FileExists(installerConfigPath) { - return errs.New( - "The target directory does not appear to contain an ActiveState Runtime installation. Expected to find: %s.", - installerConfigPath) - } - - return nil -} - -func (r *runner) removeEnvPaths(namespace *project.Namespaced) error { - isAdmin, err := osutils.IsAdmin() - if err != nil { - return errs.Wrap(err, "Could not determine if running as Windows administrator") - } - - // remove shell file additions - id := sscommon.ProjectRCIdentifier(sscommon.OfflineInstallID, namespace) - if err := r.shell.CleanUserEnv(r.cfg, id, !isAdmin); err != nil { - return errs.Wrap(err, "Failed to remove runtime PATH") - } - if err := r.shell.CleanUserEnv(r.cfg, sscommon.AutostartID, !isAdmin); err != nil { - return errs.Wrap(err, "Failed to remove runtime PATH") - } - - return nil -} diff --git a/internal/offinstall/storage_darwin.go b/internal/offinstall/storage_darwin.go deleted file mode 100644 index 893adf8a77..0000000000 --- a/internal/offinstall/storage_darwin.go +++ /dev/null @@ -1,17 +0,0 @@ -package offinstall - -import ( - "path/filepath" - - "github.com/ActiveState/cli/internal/errs" - "github.com/mitchellh/go-homedir" -) - -func DefaultInstallParentDir() (string, error) { - home, err := homedir.Dir() - if err != nil { - return "", errs.Wrap(err, "Could not get home directory") - } - - return filepath.Join(home, "Applications"), nil -} diff --git a/internal/offinstall/storage_linux.go b/internal/offinstall/storage_linux.go deleted file mode 100644 index 20d0f87d93..0000000000 --- a/internal/offinstall/storage_linux.go +++ /dev/null @@ -1,17 +0,0 @@ -package offinstall - -import ( - "path/filepath" - - "github.com/ActiveState/cli/internal/errs" - "github.com/mitchellh/go-homedir" -) - -func DefaultInstallParentDir() (string, error) { - home, err := homedir.Dir() - if err != nil { - return "", errs.Wrap(err, "Could not get home directory") - } - - return filepath.Join(home, ".local", "share", "applications"), nil -} diff --git a/internal/offinstall/storage_windows.go b/internal/offinstall/storage_windows.go deleted file mode 100644 index 54c4036337..0000000000 --- a/internal/offinstall/storage_windows.go +++ /dev/null @@ -1,11 +0,0 @@ -package offinstall - -import ( - "os" - "path/filepath" -) - -func DefaultInstallParentDir() (string, error) { - // There is no system install path for Windows - return filepath.Join(os.Getenv("USERPROFILE"), "AppData", "Local", "Programs"), nil -} diff --git a/test/integration/offinstall_int_test.go b/test/integration/offinstall_int_test.go deleted file mode 100644 index 83d21b8cb5..0000000000 --- a/test/integration/offinstall_int_test.go +++ /dev/null @@ -1,509 +0,0 @@ -package integration - -import ( - "encoding/json" - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "testing" - "time" - - "github.com/ActiveState/termtest" - "github.com/mholt/archiver" - - "github.com/ActiveState/cli/internal/analytics/client/sync/reporters" - anaConst "github.com/ActiveState/cli/internal/analytics/constants" - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/environment" - "github.com/ActiveState/cli/internal/exeutils" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/offinstall" - "github.com/ActiveState/cli/internal/osutils" - "github.com/ActiveState/cli/internal/osutils/user" - "github.com/ActiveState/cli/internal/subshell/cmd" - "github.com/ActiveState/cli/internal/testhelpers/e2e" - "github.com/ActiveState/cli/internal/testhelpers/tagsuite" - "github.com/ActiveState/cli/pkg/project" - "github.com/google/uuid" -) - -type OffInstallIntegrationTestSuite struct { - tagsuite.Suite - - installerPath string - uninstallerPath string -} - -const ( - defaultOrg = "ActiveState-Test" - defaultProject = "IntegrationTest" - anotherProject = "Another-IntegrationTest" - defaultArtifactsPayload = "artifacts-payload" - anotherArtifactsPayload = "another-artifacts-payload" - defaultInstalledExecutable = "test-offline-install" - anotherInstalledExecutable = "test-another-offline-install" -) - -func (suite *OffInstallIntegrationTestSuite) TestInstallAndUninstall() { - suite.OnlyRunForTags(tagsuite.OffInstall) - - // Clean up env after test - if runtime.GOOS == "windows" { - env := cmd.NewCmdEnv(true) - origPath, err := env.Get("PATH") - suite.Require().NoError(err) - defer func() { - suite.Require().NoError(env.Set("PATH", origPath)) - }() - } else { - originalPath, exists := os.LookupEnv("PATH") - defer func() { - if !exists { - return - } - suite.Require().NoError(os.Setenv("PATH", originalPath)) - }() - } - - ts := e2e.New(suite.T(), true) - defer ts.Close() - - testReportFilename := filepath.Join(ts.Dirs.Config, reporters.TestReportFilename) - suite.Require().NoFileExists(testReportFilename) - - fmt.Printf("Work dir: %s\n", ts.Dirs.Work) - - suite.preparePayload(ts, defaultArtifactsPayload, defaultProject) - - defaultInstallParentDir, err := offinstall.DefaultInstallParentDir() - suite.Require().NoError(err) - defaultInstallDir := filepath.Join(defaultInstallParentDir, "IntegrationTest") - - env := []string{constants.DisableRuntime + "=false"} - if runtime.GOOS != "windows" { - env = append(env, "SHELL=bash") - } - namespace := project.NewNamespace(defaultOrg, defaultProject, "") - { // Install - suite.runOfflineInstaller(ts, defaultInstallDir, env) - - // Verify that our analytics event was fired - time.Sleep(2 * time.Second) // give time to let rtwatcher detect process has exited - events := parseAnalyticsEvents(suite, ts) - suite.Require().NotEmpty(events) - - heartbeat := suite.filterEvent(events, anaConst.CatRuntimeUsage, anaConst.ActRuntimeHeartbeat) - suite.assertDimensions(heartbeat) - - nDelete := countEvents(events, anaConst.CatRuntimeUsage, anaConst.ActRuntimeDelete, anaConst.SrcOfflineInstaller) - if nDelete != 0 { - suite.FailNow(fmt.Sprintf("Expected 0 delete events, got %d, events:\n%#v", nDelete, events)) - } - - // Ensure shell env is updated - suite.assertShellUpdated(defaultInstallDir, namespace.String(), true, ts) - - // Ensure installation dir looks correct - suite.assertInstallDir(defaultInstallDir, defaultInstalledExecutable, true) - - // Run executable and validate that it has the relocated value - if runtime.GOOS == "windows" { - refreshEnv := filepath.Join(environment.GetRootPathUnsafe(), "test", "integration", "testdata", "tools", "refreshenv", "refreshenv.bat") - tp := ts.SpawnCmd("cmd", "/C", refreshEnv+" && "+defaultInstalledExecutable) - tp.Expect("TEST REPLACEMENT", termtest.OptExpectTimeout(5*time.Second)) - tp.ExpectExitCode(0) - } else { - // Disabled for now: DX-1307 - // tp = ts.SpawnCmd("bash") - // time.Sleep(1 * time.Second) // Give zsh a second to start -- can't use ExpectInput as it doesn't respect a custom HOME dir - // tp.Send("test-offline-install") - // tp.Expect("TEST REPLACEMENT", termtest.OptExpectTimeout(5*time.Second)) - // tp.Send("exit") - // tp.ExpectExitCode(0) - } - } - - { // Uninstall - tp := ts.SpawnCmdWithOpts( - suite.uninstallerPath, - e2e.OptArgs(defaultInstallDir), - e2e.OptAppendEnv(env...), - ) - tp.Expect("continue?") - tp.SendLine("y") - tp.Expect("Uninstall Complete", termtest.OptExpectTimeout(5*time.Second)) - tp.Expect("Press enter to exit") - tp.SendEnter() - tp.ExpectExitCode(0) - - // Ensure shell env is updated - suite.assertShellUpdated(defaultInstallDir, namespace.String(), false, ts) - - // Ensure installation files are removed - suite.assertInstallDir(defaultInstallDir, defaultInstalledExecutable, false) - - // Verify that our analytics event was fired - events := parseAnalyticsEvents(suite, ts) - suite.Require().NotEmpty(events) - nHeartbeat := countEvents(events, anaConst.CatRuntimeUsage, anaConst.ActRuntimeHeartbeat, anaConst.SrcExecutor) - if nHeartbeat != 1 { - suite.FailNow(fmt.Sprintf("Expected 1 heartbeat event, got %d, events:\n%#v", nHeartbeat, events)) - } - del := suite.filterEvent(events, anaConst.CatRuntimeUsage, anaConst.ActRuntimeDelete) - suite.assertDimensions(del) - } -} - -func (suite *OffInstallIntegrationTestSuite) TestInstallNoPermission() { - suite.OnlyRunForTags(tagsuite.OffInstall) - - ts := e2e.New(suite.T(), true) - defer ts.Close() - - suite.preparePayload(ts, defaultArtifactsPayload, defaultProject) - - pathWithNoPermission := "/no-permission" - if runtime.GOOS == "windows" { - pathWithNoPermission = "C:\\Program Files\\No Permission" - } - - tp := ts.SpawnCmdWithOpts( - suite.installerPath, - e2e.OptArgs(pathWithNoPermission), - ) - tp.Expect("Please ensure that the directory is writeable", termtest.OptExpectTimeout(5*time.Second)) - tp.Expect("Press enter to exit", termtest.OptExpectTimeout(5*time.Second)) - tp.SendEnter() - tp.ExpectExitCode(1) -} - -func (suite *OffInstallIntegrationTestSuite) TestInstallMultiple() { - suite.OnlyRunForTags(tagsuite.OffInstall) - - // Clean up env after test - if runtime.GOOS == "windows" { - env := cmd.NewCmdEnv(true) - origPath, err := env.Get("PATH") - suite.Require().NoError(err) - defer func() { - suite.Require().NoError(env.Set("PATH", origPath)) - }() - } else { - originalPath, exists := os.LookupEnv("PATH") - defer func() { - if !exists { - return - } - suite.Require().NoError(os.Setenv("PATH", originalPath)) - }() - } - - ts := e2e.New(suite.T(), true) - defer ts.Close() - - testReportFilename := filepath.Join(ts.Dirs.Config, reporters.TestReportFilename) - suite.Require().NoFileExists(testReportFilename) - - suite.preparePayload(ts, defaultArtifactsPayload, defaultProject) - - defaultInstallParentDir, err := offinstall.DefaultInstallParentDir() - suite.Require().NoError(err) - firstInstallDir := filepath.Join(defaultInstallParentDir, "IntegrationTest") - secondInstallDir := filepath.Join(defaultInstallParentDir, "Another-IntegrationTest") - - firstNamespace := project.NewNamespace(defaultOrg, defaultProject, "") - secondNamespace := project.NewNamespace(defaultOrg, anotherProject, "") - - env := []string{constants.DisableRuntime + "=false"} - if runtime.GOOS != "windows" { - env = append(env, "SHELL=bash") - } - - // Run offline installer for first project - suite.runOfflineInstaller(ts, firstInstallDir, env) - - // Prepare new payload and run offline installer for second project - suite.preparePayload(ts, anotherArtifactsPayload, anotherProject) - suite.runOfflineInstaller(ts, secondInstallDir, env) - - // Assert first projects updates are still in place - suite.assertShellUpdated(firstInstallDir, firstNamespace.String(), true, ts) - suite.assertInstallDir(firstInstallDir, defaultInstalledExecutable, true) - - // Assert second projects updates are also in place - suite.assertShellUpdated(secondInstallDir, firstNamespace.String(), true, ts) - suite.assertInstallDir(secondInstallDir, anotherInstalledExecutable, true) - - // Uninstall first project - suite.runOfflineUninstaller(ts, firstInstallDir, env) - - // Assert first project's update are removed - suite.assertShellUpdated(firstInstallDir, firstNamespace.String(), false, ts) - - // Assert first project's installation files are removed - suite.assertInstallDir(firstInstallDir, defaultInstalledExecutable, false) - - // Uninstall second project - suite.runOfflineUninstaller(ts, secondInstallDir, env) - - // Assert second project's update are removed - suite.assertShellUpdated(secondInstallDir, secondNamespace.String(), false, ts) - - // Assert second project's installation files are removed - suite.assertInstallDir(secondInstallDir, anotherInstalledExecutable, false) -} - -func (suite *OffInstallIntegrationTestSuite) TestInstallTwice() { - suite.OnlyRunForTags(tagsuite.OffInstall) - - // Clean up env after test - if runtime.GOOS == "windows" { - env := cmd.NewCmdEnv(true) - origPath, err := env.Get("PATH") - suite.Require().NoError(err) - defer func() { - suite.Require().NoError(env.Set("PATH", origPath)) - }() - } else { - originalPath, exists := os.LookupEnv("PATH") - defer func() { - if !exists { - return - } - suite.Require().NoError(os.Setenv("PATH", originalPath)) - }() - } - - ts := e2e.New(suite.T(), true) - defer ts.Close() - - suite.preparePayload(ts, defaultArtifactsPayload, defaultProject) - - defaultInstallParentDir, err := offinstall.DefaultInstallParentDir() - suite.Require().NoError(err) - defaultInstallDir := filepath.Join(defaultInstallParentDir, "IntegrationTest") - - env := []string{constants.DisableRuntime + "=false"} - if runtime.GOOS != "windows" { - env = append(env, "SHELL=bash") - } - - suite.runOfflineInstaller(ts, defaultInstallDir, env) - - // Running offline installer again should not cause an error - tp := ts.SpawnCmdWithOpts( - suite.installerPath, - e2e.OptArgs(defaultInstallDir), - e2e.OptAppendEnv(env...), - ) - tp.Expect("Installation directory is not empty") - tp.Send("y") - tp.Expect("Do you accept the ActiveState Runtime Installer License Agreement? (y/N)", termtest.OptExpectTimeout(5*time.Second)) - tp.Send("y") - tp.Expect("Extracting", termtest.OptExpectTimeout(time.Second)) - tp.Expect("Installation complete") - tp.Expect("Press enter to exit") - tp.SendEnter() - tp.ExpectExitCode(0) - - // Uninstall - suite.runOfflineUninstaller(ts, defaultInstallDir, env) -} - -func (suite *OffInstallIntegrationTestSuite) runOfflineInstaller(ts *e2e.Session, installDir string, env []string) { - tp := ts.SpawnCmdWithOpts( - suite.installerPath, - e2e.OptArgs(installDir), - e2e.OptAppendEnv(env...), - ) - tp.Expect("Do you accept the ActiveState Runtime Installer License Agreement? (y/N)", termtest.OptExpectTimeout(5*time.Second)) - tp.Send("y") - tp.Expect("Extracting", termtest.OptExpectTimeout(time.Second)) - tp.Expect("Installing") - tp.Expect("Installation complete") - tp.Expect("Press enter to exit") - tp.SendEnter() - tp.ExpectExitCode(0) -} - -func (suite *OffInstallIntegrationTestSuite) runOfflineUninstaller(ts *e2e.Session, installDir string, env []string) { - tp := ts.SpawnCmdWithOpts( - suite.uninstallerPath, - e2e.OptArgs(installDir), - e2e.OptAppendEnv(env...), - ) - tp.Expect("continue?") - tp.SendLine("y") - tp.Expect("Uninstall Complete", termtest.OptExpectTimeout(5*time.Second)) - tp.Expect("Press enter to exit") - tp.SendEnter() - tp.ExpectExitCode(0) -} - -func (suite *OffInstallIntegrationTestSuite) preparePayload(ts *e2e.Session, payloadName, projectName string) { - root := environment.GetRootPathUnsafe() - - suffix := "-windows" - if runtime.GOOS != "windows" { - suffix = "-nix" - } - - // The payload is an artifact that contains mocked installation files - payloadPath := filepath.Join(root, "test", "integration", "testdata", "offline-install", payloadName+suffix, "artifact") - - // The asset path contains additional files that we want to embed into the executable, such as the license - assetPath := filepath.Join(root, "test", "integration", "testdata", "offline-install", "assets", projectName) - - // The payload archive is effectively double encrypted. We have the artifact itself, as well as the archive that - // wraps it. Our test code only has one artifact, but in the wild there can and most likely will be multiple - artifactMockPath := filepath.Join(ts.Dirs.Work, uuid.New().String()+".tar.gz") - payloadMockPath := filepath.Join(ts.Dirs.Work, "artifacts.tar.gz") - - // The paths of the installer and uninstaller - suite.installerPath = filepath.Join(ts.Dirs.Bin, "offline-installer"+exeutils.Extension) - suite.uninstallerPath = filepath.Join(ts.Dirs.Bin, "uninstall"+exeutils.Extension) - - archiver := archiver.NewTarGz() - { // Create the artifact archive - err := archiver.Archive(fileutils.ListFilesUnsafe(payloadPath), artifactMockPath) - suite.Require().NoError(err) - } - - { // Create the payload archive which contains the artifact - if fileutils.TargetExists(payloadMockPath) { - err := os.RemoveAll(payloadMockPath) - suite.Require().NoError(err) - } - err := archiver.Archive([]string{artifactMockPath}, payloadMockPath) - suite.Require().NoError(err) - } - - { // Use a distinct copy of the installer to test with - err := fileutils.CopyFile(filepath.Join(root, "build", "offline", "offline-installer"+exeutils.Extension), suite.installerPath) - suite.Require().NoError(err) - } - - { // Use a distinct copy of the uninstaller to test with - err := fileutils.CopyFile(filepath.Join(root, "build", "offline", "uninstall"+exeutils.Extension), suite.uninstallerPath) - suite.Require().NoError(err) - } - - // Copy all assets to same dir so gozip doesn't include their relative or absolute paths - buildPath := filepath.Join(ts.Dirs.Work, "build") - suite.Require().NoError(fileutils.MkdirUnlessExists(buildPath)) - suite.Require().NoError(fileutils.CopyMultipleFiles(map[string]string{ - payloadMockPath: filepath.Join(buildPath, filepath.Base(payloadMockPath)), - filepath.Join(assetPath, "installer_config.json"): filepath.Join(buildPath, "installer_config.json"), - filepath.Join(assetPath, "LICENSE.txt"): filepath.Join(buildPath, "LICENSE.txt"), - suite.uninstallerPath: filepath.Join(buildPath, filepath.Base(suite.uninstallerPath)), - })) - - // Append our assets to the installer executable - tp := ts.SpawnCmdWithOpts("gozip", - e2e.OptWD(buildPath), - e2e.OptArgs( - "-c", suite.installerPath, - filepath.Base(payloadMockPath), - "installer_config.json", - "LICENSE.txt", - filepath.Base(suite.uninstallerPath), - ), - ) - tp.ExpectExitCode(0) - - suite.Require().NoError(os.Chmod(suite.installerPath, 0775)) // ensure file is executable - suite.Require().NoError(os.Chmod(suite.uninstallerPath, 0775)) // ensure file is executable -} - -func (suite *OffInstallIntegrationTestSuite) assertShellUpdated(dir, namespace string, exists bool, ts *e2e.Session) { - if runtime.GOOS != "windows" { - // Test bashrc - homeDir, err := user.HomeDir() - suite.Require().NoError(err) - - fname := ".bashrc" - if runtime.GOOS == "darwin" { - fname = ".bash_profile" - } - - assert := suite.Contains - if !exists { - assert = suite.NotContains - } - - fpath := filepath.Join(homeDir, fname) - rcContents := fileutils.ReadFileUnsafe(fpath) - assert(string(rcContents), fmt.Sprintf("%s-%s", constants.RCAppendOfflineInstallStartLine, namespace), fpath) - assert(string(rcContents), fmt.Sprintf("%s-%s", constants.RCAppendOfflineInstallStopLine, namespace), fpath) - assert(string(rcContents), dir) - } else { - // It seems there is a race condition with updating the registry and asserting it was updated - time.Sleep(time.Second) - - // Test registry - isAdmin, err := osutils.IsAdmin() - suite.Require().NoError(err) - regKey := `HKCU\Environment` - if isAdmin { - regKey = `HKLM\SYSTEM\ControlSet001\Control\Session Manager\Environment` - } - out, err := exec.Command("reg", "query", regKey, "/v", "Path").Output() - suite.Require().NoError(err) - - assert := strings.Contains - if !exists { - assert = func(s, substr string) bool { - return !strings.Contains(s, substr) - } - } - - // we need to look for the short and the long version of the target PATH, because Windows translates between them arbitrarily - shortPath, _ := fileutils.GetShortPathName(dir) - longPath, _ := fileutils.GetLongPathName(dir) - if !assert(string(out), shortPath) && !assert(string(out), longPath) && !assert(string(out), dir) { - suite.T().Errorf("registry PATH \"%s\" validation failed for \"%s\", \"%s\" or \"%s\", should contain: %v", out, dir, shortPath, longPath, exists) - } - } -} - -func (suite *OffInstallIntegrationTestSuite) filterEvent(events []reporters.TestLogEntry, category string, action string) reporters.TestLogEntry { - ev := filterEvents(events, func(e reporters.TestLogEntry) bool { - return e.Category == category && e.Action == action - }) - suite.Require().Len(ev, 1) - return ev[0] -} - -func (suite *OffInstallIntegrationTestSuite) assertInstallDir(dir, executable string, exists bool) { - assert := suite.Require().FileExists - if !exists { - assert = suite.Require().NoFileExists - } - if runtime.GOOS == "windows" { - assert(filepath.Join(dir, "bin", fmt.Sprintf("%s.bat", executable))) - } else { - assert(filepath.Join(dir, "bin", fmt.Sprintf("%s", executable))) - } - if runtime.GOOS == "windows" { - assert(filepath.Join(dir, "bin", "shell.bat")) - } - assert(filepath.Join(dir, "LICENSE.txt")) -} - -func (suite *OffInstallIntegrationTestSuite) assertDimensions(event reporters.TestLogEntry) { - evdbg, err := json.Marshal(event) - suite.Require().NoError(err) - dbg := fmt.Sprintf("Event: %s", string(evdbg)) - suite.Require().NotNil(event.Dimensions.ProjectNameSpace, dbg) - suite.Require().NotNil(event.Dimensions.CommitID, dbg) - suite.Require().Equal("ActiveState-Test/IntegrationTest", *event.Dimensions.ProjectNameSpace) - suite.Require().Equal("00000000-0000-0000-0000-000000000000", *event.Dimensions.CommitID) -} - -func TestOffInstallIntegrationTestSuite(t *testing.T) { - t.Skip("Skipping offline installer tests as they will soon live in a separate repo") - // suite.Run(t, new(OffInstallIntegrationTestSuite)) -} diff --git a/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test-another-offline-install b/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test-another-offline-install deleted file mode 100755 index cce31695ba..0000000000 --- a/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test-another-offline-install +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env sh -echo TEST PLACEHOLDER diff --git a/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test.hello b/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/installdir/bin/test.hello deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/runtime.json b/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/runtime.json deleted file mode 100644 index 90afca4c3e..0000000000 --- a/test/integration/testdata/offline-install/another-artifacts-payload-nix/artifact/runtime.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "env": [ - { - "env_name": "PATH", - "join": "prepend", - "inherit": true, - "values": [ - "${INSTALLDIR}/bin" - ], - "separator": ";" - } - ], - "file_transforms": [ - { - "pattern": "PLACEHOLDER", - "with": "ANOTHER", - "in": [ - "bin/test-another-offline-install" - ] - } - ], - "installdir": "installdir" -} \ No newline at end of file diff --git a/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test-another-offline-install.bat b/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test-another-offline-install.bat deleted file mode 100644 index c14ffd1645..0000000000 --- a/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test-another-offline-install.bat +++ /dev/null @@ -1 +0,0 @@ -echo TEST PLACEHOLDER \ No newline at end of file diff --git a/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test.hello b/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/installdir/bin/test.hello deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/runtime.json b/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/runtime.json deleted file mode 100644 index c348000216..0000000000 --- a/test/integration/testdata/offline-install/another-artifacts-payload-windows/artifact/runtime.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "env": [ - { - "env_name": "PATH", - "join": "prepend", - "inherit": true, - "values": [ - "${INSTALLDIR}\\bin" - ], - "separator": ";" - } - ], - "file_transforms": [ - { - "pattern": "PLACEHOLDER", - "with": "ANOTHER", - "in": [ - "bin/test-another-offline-install.bat" - ] - } - ], - "installdir": "installdir" -} \ No newline at end of file diff --git a/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test-offline-install b/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test-offline-install deleted file mode 100755 index cce31695ba..0000000000 --- a/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test-offline-install +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env sh -echo TEST PLACEHOLDER diff --git a/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test.hello b/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/installdir/bin/test.hello deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/runtime.json b/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/runtime.json deleted file mode 100644 index e16b19bf70..0000000000 --- a/test/integration/testdata/offline-install/artifacts-payload-nix/artifact/runtime.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "env": [ - { - "env_name": "PATH", - "join": "prepend", - "inherit": true, - "values": [ - "${INSTALLDIR}/bin" - ], - "separator": ";" - } - ], - "file_transforms": [ - { - "pattern": "PLACEHOLDER", - "with": "REPLACEMENT", - "in": [ - "bin/test-offline-install" - ] - } - ], - "installdir": "installdir" -} \ No newline at end of file diff --git a/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test-offline-install.bat b/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test-offline-install.bat deleted file mode 100644 index c14ffd1645..0000000000 --- a/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test-offline-install.bat +++ /dev/null @@ -1 +0,0 @@ -echo TEST PLACEHOLDER \ No newline at end of file diff --git a/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test.hello b/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/installdir/bin/test.hello deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/runtime.json b/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/runtime.json deleted file mode 100644 index e04e2f102e..0000000000 --- a/test/integration/testdata/offline-install/artifacts-payload-windows/artifact/runtime.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "env": [ - { - "env_name": "PATH", - "join": "prepend", - "inherit": true, - "values": [ - "${INSTALLDIR}\\bin" - ], - "separator": ";" - } - ], - "file_transforms": [ - { - "pattern": "PLACEHOLDER", - "with": "REPLACEMENT", - "in": [ - "bin/test-offline-install.bat" - ] - } - ], - "installdir": "installdir" -} \ No newline at end of file diff --git a/test/integration/testdata/offline-install/assets/Another-IntegrationTest/LICENSE.txt b/test/integration/testdata/offline-install/assets/Another-IntegrationTest/LICENSE.txt deleted file mode 100644 index f406868075..0000000000 --- a/test/integration/testdata/offline-install/assets/Another-IntegrationTest/LICENSE.txt +++ /dev/null @@ -1,563 +0,0 @@ -ACTIVESTATE® COMMUNITY EDITION LICENSE AGREEMENT - -Version effective date: March 25, 2019 - -This license agreement (the “Agreement”) is made between you (either -an individual or a company or organization, not including its -affiliates or wholly owned subsidiaries) (“You”) and ActiveState -Software Inc. (“ActiveSstate”). This Agreement establishes the terms -under which ActiveState will license the Software (as defined below) -to You and establishes the terms under which You may use, copy, -modify, distribute, and/or Redistribute (as defined below) the -Software. This Agreement does not apply to Maintenance and Support, -anything Beyond Development Use, OEM Distribution (all such -capitalized terms as defined below) each of which requires a separate -agreement with ActiveState. For more information on these types of -agreements, please visit www.activestate.com. The intent of this -Agreement is to allow ActiveState to maintain control over the -development and distribution of the Software while allowing its use in -a variety of ways. If the terms and conditions of this Agreement do -not permit Your proposed use of the Software or if You require -clarification regarding the scope of Your intended use of the -Software, please contact sales@activestate.com. - -PLEASE READ THIS AGREEMENT CAREFULLY BEFORE INSTALLING OR USING THE -SOFTWARE. BY CLICKING ON “YES, ACCEPT” OR BY INSTALLING THE SOFTWARE, -YOU AGREE TO BE BOUND BY THE TERMS AND CONDITIONS OF THIS AGREEMENT. -IF YOU ARE ENTERING INTO THIS AGREEMENT ON BEHALF OF A PERSON, YOUR -ACCEPTANCE REPRESENTS THAT YOU HAVE THE AUTHORITY TO BIND SUCH PERSON -TO THE TERMS AND CONDITIONS OF THIS AGREEMENT, IN WHICH CASE “YOU” OR -“YOUR” WILL REFER TO THE PERSON ON BEHALF OF WHICH YOU ACT (“YOUR -ENTITY”). IF YOU DO NOT AGREE WITH THE TERMS AND CONDITIONS OF THIS -AGREEMENT OR IF YOU DO NOT HAVE THE AUTHORITY TO BIND YOUR ENTITY, YOU -HAVE NO RIGHT TO INSTALL OR USE THE SOFTWARE AND YOU SHOULD (A) -RETURN, DELETE, OR DISABLE THE SOFTWARE OR (B) IF YOU PURCHASED A -PRODUCT FROM ACTIVESTATE OR ITS RESELLER OR DISTRIBUTOR ON WHICH THE -SOFTWARE IS PRE-INSTALLED BY ACTIVESTATE, RETURN THE PURCHASED PRODUCT -TO ACTIVESTATE OR THE APPLICABLE RESELLER OR DISTRIBUTOR FROM WHOM YOU -OBTAINED THE PRODUCT. - -1. Definitions. - -“Accessible Code” means source code contained within the Software that -is licensed under an open source license. - -“Confidential Information” means all information designated in writing -as confidential by each party, or which under the circumstances of -disclosure reasonably ought to be considered as confidential. Without -limiting the foregoing, ActiveState Confidential Information includes -the Software, including all source and object code, and all associated -documentation, but not Accessible Code. - -"Maintenance And Support" means maintenance and support for the -Software provided by ActiveState under separate terms. - -"OEM Distribution" means any distribution to, and/or use of the -Software by, others outside Your organization and distribution and/or -use of the Software as either a bundled add-on to, or embedded -component of another application, with such application being made -available to its users as, but not limited to, an on-premises -application, a hosted application, a software-as-a-service offering or -a subscription service for which the distributor of the application -receives a license fee or any form of direct or indirect compensation -and whether for commercial or non-commercial purposes. - -“Person” means any individual, sole proprietorship, partnership, firm, -entity, unincorporated association, unincorporated syndicate, -unincorporated organization, trust, body corporate or governmental or -regulatory authority, and where the context requires, any of the -foregoing when they are acting as trustee, executor, administrator or -other legal representative. - -“Beyond Development Use” means any use of the Software licensed under -this Agreement beyond software development with the Software. For -greater clarity, any use of the Software licensed under this Agreement -beyond the purpose of developing, prototyping or demonstrating Your -application with the Software or by the Software are not permitted -under this license. - -“Redistribute” means any distribution to, and/or use of the Software -by, others inside or outside Your organization and distribution and/or -use of the Software inside or outside Your organization. - -“Software” means any of ActivePerl, ActivePython, ActiveTcl, ActiveGo, -ActiveRuby, ActiveNode, or ActiveLua software and the accompanying -materials including, but not limited to, source code, binary -executables, documentation, images and scripts, which are distributed -by ActiveState, and derivatives of that collection and/or those files. - -“User Data” means all information and data collected by the Software -or otherwise transmitted by the Software to ActiveState, including any -data, metadata, metrics, statistics, or other information relating to -the performance, operations, resource, health, or other conditions of -the Software, any component thereof (including third party -components), and any related infrastructure, such as network host -names, IP addresses, interpreter used, and system architecture, which -includes filenames, full path, file size, and content hash. - -“Wrapped Application” means a single-file executable in which all -binary components are encapsulated in a single binary without exposing -the base programming language as a scripting language within Your own -application program to end users. - -2. License Grant. - - (a) Subject to the terms and conditions of this Agreement, - ActiveState hereby grants to You a limited, worldwide, - perpetual, paid up, free-of-charge, non-exclusive, - non-transferable, non-assignable, and non-sublicensable - license to install and use the Software on any computing - device, in accordance with the limitations and restrictions - set forth in this Agreement, for research and development - purposes only. You may not use the Software Beyond Development - Use, except as provided in Section 2(b) below. You may not - use the Software for OEM Distribution. You may copy the Software - for archival purposes or as necessary to use the Software as - authorized in this section. You also may modify the - Accessible Code to develop bug fixes, customizations, or - additional features, for the sole purpose of using the Software - as authorized by this Agreement. - - (b) ActiveState may, in its sole discretion, grant You the right to - use the Software Beyond Development Use and/or OEM Distribution - for limited, small-scale, non-commercial and/or open source - projects. To apply for this right, contact sales@activestate.com. - Without the prior approval of ActiveState, you may not use the - Software Beyond Development Use and/or for OEM Distribution. - -3. Restrictions. - - (a) Except as expressly provided in this Agreement, You may not: - - (i) transfer, assign, sublicense, resell, or rent the - Software; - (ii) modify or translate the Software to discover the source - code in the Software or create a functional equivalent in - the Software; - (iii) reverse engineer, decompile, or disassemble (except as - and only to the extent this restriction is prohibited by - applicable law) the Software; - (iv) create derivative works based on the Software; - (v) merge the Software with another product; - (vi) copy the Software; - (vii) remove or obscure any proprietary rights notices or - labels on the Software; - (viii) Redistribute, without entering into a separate agreement - with ActiveState: - I. the Software as a whole, whether as a Wrapped - Application or on a standalone basis; - II. parts of the Software to create a language - distribution; or - III. the Software (other than the Accessible Code) with - Your Wrapped Application; - (ix) distribute the Software by OEM Distribution without - entering into a separate OEM Distribution agreement with - ActiveState; - (x) permit others to use the Software; or - (xi) use the Software: - I. Beyond Development Use on any computing device in - whatever form or manner, whether physical or - virtual and external or internal-facing; - II. on any operating systems other than Windows, OSX, and - Linux; - III. on computing devices used for file and/or application - serving; - IV. on any computing devices used for business continuity - and disaster recovery; or - V. to provide content or functionality through - external-facing servers or internal-facing - production servers. - -4. Confidentiality. - - (a) Except as reasonably required to exercise Your rights under - this Agreement, You agree to prevent any unauthorized copying, - use, distribution, installation or transfer of possession of - Confidential Information received from ActiveState (the - “ACTIVESTATE CONFIDENTIAL INFORMATION”). You do not acquire - any interest in any ActiveState Confidential Information by - reason of this Agreement. ActiveState Confidential Information - does not include any information which (i) becomes part of the - public domain through no act or omission on Your part; (ii) is - lawfully acquired by You from a third party without any breach - of confidentiality; (iii) is independently developed by You - without reference to the ActiveState Confidential Information; - or (iv) is disclosed in accordance with judicial or other - governmental order or timely disclosure requirements imposed - by law or stock exchange policies. Notwithstanding the - foregoing, either party may disclose the terms and conditions - of this Agreement in conjunction with legal proceedings. - Without limiting the generality of the foregoing, You must - take reasonable steps to prevent any personnel from removing - any proprietary or other legend or restrictive notice - contained or included in any material provided by ActiveState - to You. - - (b) You acknowledge that any use or disclosure of the ActiveState - Confidential Information in a manner inconsistent with the - provisions of this Agreement may cause ActiveState irreparable - damage for which remedies other than injunctive relief may be - inadequate. You further agree that ActiveState will be - entitled to attempt to receive from a court of competent - jurisdiction injunctive or other equitable relief to restrain - such use or disclosure in addition to other appropriate - remedies. - -5. Open Source Acknowledgement. The Software is comprised of open - source software, which is subject to the terms of the open source - software license(s) accompanying or otherwise applicable to that - open source software included in the Software (the “Open Source - Components”). For reference, Tcl/Tk open source license terms can - be found in Exhibit A attached to this Agreement or obtained from - this link: https://www.tcl.tk/software/tcltk/license.html. You - acknowledge that Your own distribution or deployment of instances - containing or linking to the Software, including the Open Source - Components, or any other open source software may trigger open - source license requirements for which You are responsible. Nothing - in this Agreement limits Your rights under or grants rights to You - that supersede the terms of any applicable open source software - license for the applicable Open Source Components. - -6. Intellectual Property Ownership. All right, title and interest in - and to the Software and all intellectual property rights embodied - therein, including copyrights, trade names, trademarks, service - marks, product names, trade secrets embodied in the Software's - design and coding methodology and other proprietary materials in - the Software belong exclusively to ActiveState or its third party - licensors. The Software is protected by Canada and United States - copyright laws and international treaty provisions as implemented - locally in different jurisdictions. Except as specifically - provided under this Agreement, You acknowledge that no other - right, title or interest in and to the Software or any parts - thereof is granted to You. ActiveState grants You the limited - right to use the trade names, trademarks, service marks or product - names of ActiveState as required for reasonable and customary use - in describing the origin of the Software. You may not use the - trade names, trademarks, service marks or product names of - ActiveState in any way that might state or imply that ActiveState - endorses Your work, or might state or imply that You created the - Software. - -7. User Data. You acknowledge, agree, and expressly consent to - ActiveState’s collection of Your User Data through the Software. - ActiveState does not claim ownership of any User Data. You hereby - grant to ActiveState and its sublicensees a royalty-free, - perpetual, irrevocable, transferable, worldwide non-exclusive - right to reproduce, analyse, review, process, diagnose, or - otherwise use the User Data (in whole or in part) for the purpose - of supporting, maintaining, and providing the Software, the - Maintenance and Support, if any, and any related services provided - by ActiveState relating to the Software (the “User Data License”). - ActiveState will not disclose the User Data to any third parties - and will only use the User Data in accordance with the User Data - License, except that ActiveState may provide Your User Data to - third parties providing services relating to the Software to - ActiveState (which will protect the User Data on terms and - conditions that are commensurate in scope with this Agreement). In - addition to the rights granted under the User Data License, You - acknowledge and agree that ActiveState has the right to (i) - publicly disclose, in any manner whatsoever, User Data that have - been anonymized; and (ii) review or analyze the User Data and - publicly disclose any results of such review or analysis, - including in the form of reports, blog posts, newsletters, - marketing materials, or otherwise, provided You will not be - identified in such publicly disclosed materials. - -8. Term. This Agreement will be effective upon Your agreement to be - bound by the terms and conditions of this Agreement and will - continue in effect unless otherwise terminated in accordance with - the terms and conditions of this Agreement. - -9. Termination. If You breach any term or condition of this - Agreement, ActiveState may immediately terminate this Agreement - with respect to the Software that You have licensed under this - Agreement by providing notice to You. ActiveState may also - terminate this Agreement, without any liability to You, if any - law, regulations, orders, or legal requirements prohibits - ActiveState’s provision or licensing of the Software to You. Upon - termination of this Agreement by ActiveState, You will immediately - cease all use of the Software and return all copies of the - Software that are under Your control to ActiveState or to delete - all such copies. - -10. Infringement Indemnification. You indemnify, hold harmless, and - defend ActiveState, its licensors, and their respective employees, - agents and distributors against any and all claims, proceedings, - demands and costs resulting from or in any way connected with Your - use of the Software and arising from Your breach of this - Agreement; provided, however, that ActiveState will notify You in - writing of any such claim. ActiveState will not enter into any - settlement or compromise any such claim without Your prior written - consent. You will have sole control of any such action and - settlement negotiations; and ActiveState will provide You with - commercially reasonable information and assistance, at Your - request and expense, necessary to settle or defend such claim. - -11. Disclaimer Of Warranty. - - (a) NEITHER ACTIVESTATE NOR ANY OF ITS SUPPLIERS, LICENSORS, OR - RESELLERS MAKES ANY WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - UNDER THIS AGREEMENT. TO THE MAXIMUM EXTENT PERMITTED UNDER - APPLICABLE LAW, ACTIVESTATE AND ITS SUPPLIERS, LICENSORS, AND - RESELLERS SPECIFICALLY DISCLAIM ALL WARRANTIES AND CONDITIONS - WITH RESPECT TO THE SOFTWARE, EITHER EXPRESS, IMPLIED OR - STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY OR - CONDITION OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, - DURABILITY, MERCHANTABLE QUALITY, FITNESS FOR A PARTICULAR - PURPOSE, UPDATES, UPGRADES, SUPPLEMENTS, PRODUCTS, APPLIANCES, - SYSTEM INTEGRATION, DATA ACCURACY AND ANY OTHER ITEMS PROVIDED - HEREUNDER. ACTIVESTATE MAKES NO WARRANTY OR GUARANTEE THAT THE - OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, ERROR-FREE, - OR VIRUS-FREE, OR THAT THE SOFTWARE WILL MEET ANY PARTICULAR - CRITERIA OF PERFORMANCE, QUALITY, ACCURACY, PURPOSE, OR NEED. - YOU ASSUME THE ENTIRE RISK OF SELECTION, INSTALLATION, AND USE - OF THE SOFTWARE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN - ESSENTIAL PART OF THIS AGREEMENT. - - (b) TO THE EXTENT ANY IMPLIED WARRANTIES CANNOT BE DISCLAIMED - UNDER APPLICABLE LAW, ANY IMPLIED WARRANTIES ARE LIMITED IN - DURATION TO THE PERIOD REQUIRED BY APPLICABLE LAW. - - (c) SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED - WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A - CONSUMER, AND SO SOME OR ALL OF THE EXCLUSION OF IMPLIED - WARRANTIES OR LIMITATIONS SET OUT IN THIS SECTION MAY NOT - APPLY TO YOU. - -12. Limitation Of Liability. - - (a) INDEPENDENT OF THE FOREGOING PROVISIONS, TO THE MAXIMUM EXTENT - PERMITTED UNDER APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL - THEORY, INCLUDING WITHOUT LIMITATION, TORT, CONTRACT, OR - STRICT PRODUCTS LIABILITY, WILL ACTIVESTATE, ITS DIRECTORS, - OFFICERS, EMPLOYEES, AFFILIATES, AGENTS, CONTRACTORS, - PRINCIPALS, SUPPLIERS OR LICENSORS BE LIABLE TO YOU OR ANY - OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR - CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING WITHOUT - LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, - COMPUTER MALFUNCTION, OR ANY OTHER KIND OF COMMERCIAL DAMAGE, - EVEN IF ACTIVESTATE HAS BEEN ADVISED OF THE POSSIBILITY OF - SUCH DAMAGES. - - (b) TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAW, IN NO - EVENT WILL ACTIVESTATE BE LIABLE TO YOU FOR DAMAGES UNDER THIS - AGREEMENT FOR ANY CAUSE WHATSOEVER, AND REGARDLESS OF THE FORM - OF ACTION. - -13. Export Controls. You must comply with all export laws and - restrictions and regulations of Canada, the United States or - foreign agencies or authorities, and not to export or re-export - the Software or any direct product thereof in violation of any - such restrictions, laws or regulations, or without all necessary - approvals. As applicable, each party will obtain and bear all - expenses relating to any necessary licenses and/or exemptions with - respect to its own export of the Software from Canada or the U.S. - Neither the Software nor the underlying information or technology - may be electronically transmitted or otherwise exported or - re-exported: into any country subject to Canada or U.S. trade - sanctions covering the Software, to individuals or entities - controlled by such countries, or to nationals or residents of such - countries other than nationals who are lawfully admitted permanent - residents of countries not subject to such sanctions; to anyone on - Canada's Area Control List of the Export and Import Permits Act; - or to anyone on the U.S. Treasury Department's list of Specially - Designated Nationals and Blocked Persons or the U.S. Commerce - Department's Table of Denial Orders. By installing or using the - Software, You agree to the foregoing and represent and warrant - that it complies with these conditions. - -14. U.S. Government End-Users. The Software is a "commercial item," as - that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of - "commercial computer software" and "commercial computer software - documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. - 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 - through 227.7202-4 (June 1995), all U.S. Government End Users - acquire the Software with only those rights as are granted to - all other end users pursuant to the terms and conditions herein. - Unpublished rights are reserved under the copyright laws of Canada - and the United States. - -15. Licensee Outside The U.S. If You are located outside the U.S., - then the following provisions will apply: (a) Les parties aux - presentes confirment leur volonte que cette convention de meme que - tous les documents y compris tout avis qui siy rattache, soient - rediges en langue anglaise (translation: "The parties confirm that - this Agreement and all related documentation is and will be in the - English language."); and (b) You are responsible for complying - with any local laws in Your jurisdiction which might impact Your - right to import, export or use the Software, and You represent - that You have complied with any regulations or registration - procedures required by applicable law to make this license - enforceable. - -16. Entire Agreement. This Agreement constitutes the entire - understanding of the parties with respect to the subject matter of - this Agreement and merges all prior communications, - representations, and agreements. - -17. Severability. If any provision of this Agreement is declared - invalid or unenforceable, such provision will be deemed modified - to the extent necessary and possible to render it valid and - enforceable. In any event, the unenforceability or invalidity of - any provision will not affect any other provision of this - Agreement, and this Agreement will continue in full force and - effect, and be construed and enforced, as if such provision had - not been included, or had been modified as above provided, as the - case may be. - -18. Entire Agreement & Amendment. This Agreement constitutes the - complete agreement between the parties and supersedes all prior or - contemporaneous agreements or representations, written or oral, - concerning the subject matter of this Agreement, appendices and - attachments. ActiveState reserves the right to change this - Agreement at any time, which change shall be effective as of the - effective date for the terms and conditions of this Agreement as - shown on ActiveState’s Website (the “Change Effective Date”). Your - continued use of the Software after the Change Effective Date - constitutes Your acceptance of such changes. This Agreement may - not be otherwise amended without ActiveState's prior written - agreement. You agree to periodically review the terms and - conditions of this Agreement as updated from time to time on - ActiveState’s website. - -19. Arbitration. Except for actions to protect intellectual property - rights and to enforce an arbitrator's decision hereunder, all - disputes, controversies, or claims arising out of or relating to - this Agreement or a breach thereof will be submitted to and be - finally resolved by arbitration under the rules of the American - Arbitration Association ("AAA") then in effect. There will be one - arbitrator, and such arbitrator will be chosen by mutual agreement - of the parties in accordance with AAA rules. The arbitration will - take place in Vancouver, BC, Canada, and may be conducted by - telephone or online. The arbitrator will apply the laws of the - Province of British Columbia, Canada to all issues in dispute. The - controversy or claim will be arbitrated on an individual basis, - and will not be consolidated in any arbitration with any claim or - controversy of any other party. The findings of the arbitrator - will be final and binding on the parties, and may be entered in - any court of competent jurisdiction for enforcement. Enforcements - of any award or judgment will be governed by the United Nations - Convention on the Recognition and Enforcement of Foreign Arbitral - Awards. Should either party file an action contrary to this - provision, the other party may recover legal fees and costs up to - $1,000.00. - -20. Jurisdiction And Venue. The superior courts of Vancouver in the - Province of British Columbia, Canada will be the exclusive - jurisdiction and venue for all legal proceedings that are not - arbitrated under this Agreement. - -21. Force Majeure. Neither party will be liable for damages for any - delay or failure of delivery arising out of causes beyond their - reasonable control and without their fault or negligence, - including, but not limited to, Acts of God, acts of civil or - military authority, fires, riots, wars, embargoes, Internet - disruptions, hacker attacks, or communications failures. - Notwithstanding anything to the contrary contained herein, if - either party is unable to perform hereunder for a period of - thirty (30) consecutive days, then the other party may terminate - this Agreement immediately without liability by ten (10) days’ - written notice to the other. - -22. Publicity And Audit Rights. - - (a) You grant ActiveState the right to include Your name, trade - name, trademark, service mark or logo in its Software - promotional material. You may retract this grant at any time - in writing to marcom@activestate.com, requesting Your name, - trade name, trademark, service mark or logo be excluded from - future releases of ActiveState Software promotional material. - Requests cannot be complied with retroactively and may require - up to thirty (30) days to process. - - (b) If You entered into this Agreement on behalf of a Person, - where such Person has more than 100 employees, if requested by - ActiveState, You will furnish ActiveState with a signed - certification (i) verifying that the Software is being used - pursuant to the terms of this Agreement, including any user - limitations and (ii) listing the locations where the Software - is being used, the version(s) of the Software being used, how - long and how the Software is being used, and the number - computing devices and operating systems the Software is being - used with. You agree to grant ActiveState reasonable access to - Your site(s) and/or systems, upon prior notice during normal - business hours, to audit the use of the Software. Any such - audit shall be at ActiveState’s expense. - -23. Assignment. Except as expressly provided herein, neither this - Agreement nor any rights granted hereunder, nor the use of any of - the Software may be assigned, or otherwise transferred, in whole - or in part, by You, without the prior written consent of - ActiveState. Any permitted assignment by You under this Section - will be conditional upon You delivering all copies of the Software - to the transferee along with a copy of this Agreement, the - transferee accepting the terms and conditions of this Agreement, - and Your license to the Software terminating upon transfer. Any - attempted assignment by You will be void and of no effect unless - permitted by the foregoing. You acknowledge and agree that - ActiveState may assign this Agreement to any third party without - Your prior consent. - -24. Enurement. This Agreement will enure to the benefit of the - parties’ permitted successors and assigns. - -25. Governing Law. This Agreement will be construed under the laws of - the Province of British Columbia and the federal laws of Canada - applicable therein, without regard to the conflict of law rules. - The application of the United Nations Convention of Contracts for - the International Sale of Goods and any local implementations - thereof are expressly excluded. The parties agree that the Uniform - Computer - -Transactions Act or any version thereof, adopted by any jurisdiction, -in any form ("UCITA"), will not apply to this Agreement, and to the -extent that UCITA may be applicable, the parties agree to opt out of -the applicability of UCITA pursuant to the opt-out provision(s) -contained therein. - - - -EXHIBIT A - -Tcl/tk License Terms - - -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, and other -parties. The following terms apply to all files associated with the -software unless explicitly disclaimed in individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, -provided that existing copyright notices are retained in all copies -and that this notice is included verbatim in any distributions. No -written agreement, license, or royalty fee is required for any of the -authorized uses. Modifications to this software may be copyrighted by -their authors and need not follow the licensing terms described here, -provided that the new terms are clearly indicated on the first page of -each file where they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND -THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE -MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, -the software shall be classified as "Commercial Computer Software" -and the Government shall have only "Restricted Rights" as defined -in Clause 252.227-7013 (c)(1) of DFARs. Notwithstanding the foregoing, -the authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. diff --git a/test/integration/testdata/offline-install/assets/Another-IntegrationTest/installer_config.json b/test/integration/testdata/offline-install/assets/Another-IntegrationTest/installer_config.json deleted file mode 100644 index 3fd0854480..0000000000 --- a/test/integration/testdata/offline-install/assets/Another-IntegrationTest/installer_config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "org_name": "ActiveState-Test", - "project_id": "00000000-0000-0000-0000-000000000000", - "project_name": "Another-IntegrationTest", - "commit_id": "00000000-0000-0000-0000-000000000000" -} \ No newline at end of file diff --git a/test/integration/testdata/offline-install/assets/IntegrationTest/LICENSE.txt b/test/integration/testdata/offline-install/assets/IntegrationTest/LICENSE.txt deleted file mode 100644 index f406868075..0000000000 --- a/test/integration/testdata/offline-install/assets/IntegrationTest/LICENSE.txt +++ /dev/null @@ -1,563 +0,0 @@ -ACTIVESTATE® COMMUNITY EDITION LICENSE AGREEMENT - -Version effective date: March 25, 2019 - -This license agreement (the “Agreement”) is made between you (either -an individual or a company or organization, not including its -affiliates or wholly owned subsidiaries) (“You”) and ActiveState -Software Inc. (“ActiveSstate”). This Agreement establishes the terms -under which ActiveState will license the Software (as defined below) -to You and establishes the terms under which You may use, copy, -modify, distribute, and/or Redistribute (as defined below) the -Software. This Agreement does not apply to Maintenance and Support, -anything Beyond Development Use, OEM Distribution (all such -capitalized terms as defined below) each of which requires a separate -agreement with ActiveState. For more information on these types of -agreements, please visit www.activestate.com. The intent of this -Agreement is to allow ActiveState to maintain control over the -development and distribution of the Software while allowing its use in -a variety of ways. If the terms and conditions of this Agreement do -not permit Your proposed use of the Software or if You require -clarification regarding the scope of Your intended use of the -Software, please contact sales@activestate.com. - -PLEASE READ THIS AGREEMENT CAREFULLY BEFORE INSTALLING OR USING THE -SOFTWARE. BY CLICKING ON “YES, ACCEPT” OR BY INSTALLING THE SOFTWARE, -YOU AGREE TO BE BOUND BY THE TERMS AND CONDITIONS OF THIS AGREEMENT. -IF YOU ARE ENTERING INTO THIS AGREEMENT ON BEHALF OF A PERSON, YOUR -ACCEPTANCE REPRESENTS THAT YOU HAVE THE AUTHORITY TO BIND SUCH PERSON -TO THE TERMS AND CONDITIONS OF THIS AGREEMENT, IN WHICH CASE “YOU” OR -“YOUR” WILL REFER TO THE PERSON ON BEHALF OF WHICH YOU ACT (“YOUR -ENTITY”). IF YOU DO NOT AGREE WITH THE TERMS AND CONDITIONS OF THIS -AGREEMENT OR IF YOU DO NOT HAVE THE AUTHORITY TO BIND YOUR ENTITY, YOU -HAVE NO RIGHT TO INSTALL OR USE THE SOFTWARE AND YOU SHOULD (A) -RETURN, DELETE, OR DISABLE THE SOFTWARE OR (B) IF YOU PURCHASED A -PRODUCT FROM ACTIVESTATE OR ITS RESELLER OR DISTRIBUTOR ON WHICH THE -SOFTWARE IS PRE-INSTALLED BY ACTIVESTATE, RETURN THE PURCHASED PRODUCT -TO ACTIVESTATE OR THE APPLICABLE RESELLER OR DISTRIBUTOR FROM WHOM YOU -OBTAINED THE PRODUCT. - -1. Definitions. - -“Accessible Code” means source code contained within the Software that -is licensed under an open source license. - -“Confidential Information” means all information designated in writing -as confidential by each party, or which under the circumstances of -disclosure reasonably ought to be considered as confidential. Without -limiting the foregoing, ActiveState Confidential Information includes -the Software, including all source and object code, and all associated -documentation, but not Accessible Code. - -"Maintenance And Support" means maintenance and support for the -Software provided by ActiveState under separate terms. - -"OEM Distribution" means any distribution to, and/or use of the -Software by, others outside Your organization and distribution and/or -use of the Software as either a bundled add-on to, or embedded -component of another application, with such application being made -available to its users as, but not limited to, an on-premises -application, a hosted application, a software-as-a-service offering or -a subscription service for which the distributor of the application -receives a license fee or any form of direct or indirect compensation -and whether for commercial or non-commercial purposes. - -“Person” means any individual, sole proprietorship, partnership, firm, -entity, unincorporated association, unincorporated syndicate, -unincorporated organization, trust, body corporate or governmental or -regulatory authority, and where the context requires, any of the -foregoing when they are acting as trustee, executor, administrator or -other legal representative. - -“Beyond Development Use” means any use of the Software licensed under -this Agreement beyond software development with the Software. For -greater clarity, any use of the Software licensed under this Agreement -beyond the purpose of developing, prototyping or demonstrating Your -application with the Software or by the Software are not permitted -under this license. - -“Redistribute” means any distribution to, and/or use of the Software -by, others inside or outside Your organization and distribution and/or -use of the Software inside or outside Your organization. - -“Software” means any of ActivePerl, ActivePython, ActiveTcl, ActiveGo, -ActiveRuby, ActiveNode, or ActiveLua software and the accompanying -materials including, but not limited to, source code, binary -executables, documentation, images and scripts, which are distributed -by ActiveState, and derivatives of that collection and/or those files. - -“User Data” means all information and data collected by the Software -or otherwise transmitted by the Software to ActiveState, including any -data, metadata, metrics, statistics, or other information relating to -the performance, operations, resource, health, or other conditions of -the Software, any component thereof (including third party -components), and any related infrastructure, such as network host -names, IP addresses, interpreter used, and system architecture, which -includes filenames, full path, file size, and content hash. - -“Wrapped Application” means a single-file executable in which all -binary components are encapsulated in a single binary without exposing -the base programming language as a scripting language within Your own -application program to end users. - -2. License Grant. - - (a) Subject to the terms and conditions of this Agreement, - ActiveState hereby grants to You a limited, worldwide, - perpetual, paid up, free-of-charge, non-exclusive, - non-transferable, non-assignable, and non-sublicensable - license to install and use the Software on any computing - device, in accordance with the limitations and restrictions - set forth in this Agreement, for research and development - purposes only. You may not use the Software Beyond Development - Use, except as provided in Section 2(b) below. You may not - use the Software for OEM Distribution. You may copy the Software - for archival purposes or as necessary to use the Software as - authorized in this section. You also may modify the - Accessible Code to develop bug fixes, customizations, or - additional features, for the sole purpose of using the Software - as authorized by this Agreement. - - (b) ActiveState may, in its sole discretion, grant You the right to - use the Software Beyond Development Use and/or OEM Distribution - for limited, small-scale, non-commercial and/or open source - projects. To apply for this right, contact sales@activestate.com. - Without the prior approval of ActiveState, you may not use the - Software Beyond Development Use and/or for OEM Distribution. - -3. Restrictions. - - (a) Except as expressly provided in this Agreement, You may not: - - (i) transfer, assign, sublicense, resell, or rent the - Software; - (ii) modify or translate the Software to discover the source - code in the Software or create a functional equivalent in - the Software; - (iii) reverse engineer, decompile, or disassemble (except as - and only to the extent this restriction is prohibited by - applicable law) the Software; - (iv) create derivative works based on the Software; - (v) merge the Software with another product; - (vi) copy the Software; - (vii) remove or obscure any proprietary rights notices or - labels on the Software; - (viii) Redistribute, without entering into a separate agreement - with ActiveState: - I. the Software as a whole, whether as a Wrapped - Application or on a standalone basis; - II. parts of the Software to create a language - distribution; or - III. the Software (other than the Accessible Code) with - Your Wrapped Application; - (ix) distribute the Software by OEM Distribution without - entering into a separate OEM Distribution agreement with - ActiveState; - (x) permit others to use the Software; or - (xi) use the Software: - I. Beyond Development Use on any computing device in - whatever form or manner, whether physical or - virtual and external or internal-facing; - II. on any operating systems other than Windows, OSX, and - Linux; - III. on computing devices used for file and/or application - serving; - IV. on any computing devices used for business continuity - and disaster recovery; or - V. to provide content or functionality through - external-facing servers or internal-facing - production servers. - -4. Confidentiality. - - (a) Except as reasonably required to exercise Your rights under - this Agreement, You agree to prevent any unauthorized copying, - use, distribution, installation or transfer of possession of - Confidential Information received from ActiveState (the - “ACTIVESTATE CONFIDENTIAL INFORMATION”). You do not acquire - any interest in any ActiveState Confidential Information by - reason of this Agreement. ActiveState Confidential Information - does not include any information which (i) becomes part of the - public domain through no act or omission on Your part; (ii) is - lawfully acquired by You from a third party without any breach - of confidentiality; (iii) is independently developed by You - without reference to the ActiveState Confidential Information; - or (iv) is disclosed in accordance with judicial or other - governmental order or timely disclosure requirements imposed - by law or stock exchange policies. Notwithstanding the - foregoing, either party may disclose the terms and conditions - of this Agreement in conjunction with legal proceedings. - Without limiting the generality of the foregoing, You must - take reasonable steps to prevent any personnel from removing - any proprietary or other legend or restrictive notice - contained or included in any material provided by ActiveState - to You. - - (b) You acknowledge that any use or disclosure of the ActiveState - Confidential Information in a manner inconsistent with the - provisions of this Agreement may cause ActiveState irreparable - damage for which remedies other than injunctive relief may be - inadequate. You further agree that ActiveState will be - entitled to attempt to receive from a court of competent - jurisdiction injunctive or other equitable relief to restrain - such use or disclosure in addition to other appropriate - remedies. - -5. Open Source Acknowledgement. The Software is comprised of open - source software, which is subject to the terms of the open source - software license(s) accompanying or otherwise applicable to that - open source software included in the Software (the “Open Source - Components”). For reference, Tcl/Tk open source license terms can - be found in Exhibit A attached to this Agreement or obtained from - this link: https://www.tcl.tk/software/tcltk/license.html. You - acknowledge that Your own distribution or deployment of instances - containing or linking to the Software, including the Open Source - Components, or any other open source software may trigger open - source license requirements for which You are responsible. Nothing - in this Agreement limits Your rights under or grants rights to You - that supersede the terms of any applicable open source software - license for the applicable Open Source Components. - -6. Intellectual Property Ownership. All right, title and interest in - and to the Software and all intellectual property rights embodied - therein, including copyrights, trade names, trademarks, service - marks, product names, trade secrets embodied in the Software's - design and coding methodology and other proprietary materials in - the Software belong exclusively to ActiveState or its third party - licensors. The Software is protected by Canada and United States - copyright laws and international treaty provisions as implemented - locally in different jurisdictions. Except as specifically - provided under this Agreement, You acknowledge that no other - right, title or interest in and to the Software or any parts - thereof is granted to You. ActiveState grants You the limited - right to use the trade names, trademarks, service marks or product - names of ActiveState as required for reasonable and customary use - in describing the origin of the Software. You may not use the - trade names, trademarks, service marks or product names of - ActiveState in any way that might state or imply that ActiveState - endorses Your work, or might state or imply that You created the - Software. - -7. User Data. You acknowledge, agree, and expressly consent to - ActiveState’s collection of Your User Data through the Software. - ActiveState does not claim ownership of any User Data. You hereby - grant to ActiveState and its sublicensees a royalty-free, - perpetual, irrevocable, transferable, worldwide non-exclusive - right to reproduce, analyse, review, process, diagnose, or - otherwise use the User Data (in whole or in part) for the purpose - of supporting, maintaining, and providing the Software, the - Maintenance and Support, if any, and any related services provided - by ActiveState relating to the Software (the “User Data License”). - ActiveState will not disclose the User Data to any third parties - and will only use the User Data in accordance with the User Data - License, except that ActiveState may provide Your User Data to - third parties providing services relating to the Software to - ActiveState (which will protect the User Data on terms and - conditions that are commensurate in scope with this Agreement). In - addition to the rights granted under the User Data License, You - acknowledge and agree that ActiveState has the right to (i) - publicly disclose, in any manner whatsoever, User Data that have - been anonymized; and (ii) review or analyze the User Data and - publicly disclose any results of such review or analysis, - including in the form of reports, blog posts, newsletters, - marketing materials, or otherwise, provided You will not be - identified in such publicly disclosed materials. - -8. Term. This Agreement will be effective upon Your agreement to be - bound by the terms and conditions of this Agreement and will - continue in effect unless otherwise terminated in accordance with - the terms and conditions of this Agreement. - -9. Termination. If You breach any term or condition of this - Agreement, ActiveState may immediately terminate this Agreement - with respect to the Software that You have licensed under this - Agreement by providing notice to You. ActiveState may also - terminate this Agreement, without any liability to You, if any - law, regulations, orders, or legal requirements prohibits - ActiveState’s provision or licensing of the Software to You. Upon - termination of this Agreement by ActiveState, You will immediately - cease all use of the Software and return all copies of the - Software that are under Your control to ActiveState or to delete - all such copies. - -10. Infringement Indemnification. You indemnify, hold harmless, and - defend ActiveState, its licensors, and their respective employees, - agents and distributors against any and all claims, proceedings, - demands and costs resulting from or in any way connected with Your - use of the Software and arising from Your breach of this - Agreement; provided, however, that ActiveState will notify You in - writing of any such claim. ActiveState will not enter into any - settlement or compromise any such claim without Your prior written - consent. You will have sole control of any such action and - settlement negotiations; and ActiveState will provide You with - commercially reasonable information and assistance, at Your - request and expense, necessary to settle or defend such claim. - -11. Disclaimer Of Warranty. - - (a) NEITHER ACTIVESTATE NOR ANY OF ITS SUPPLIERS, LICENSORS, OR - RESELLERS MAKES ANY WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - UNDER THIS AGREEMENT. TO THE MAXIMUM EXTENT PERMITTED UNDER - APPLICABLE LAW, ACTIVESTATE AND ITS SUPPLIERS, LICENSORS, AND - RESELLERS SPECIFICALLY DISCLAIM ALL WARRANTIES AND CONDITIONS - WITH RESPECT TO THE SOFTWARE, EITHER EXPRESS, IMPLIED OR - STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY OR - CONDITION OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, - DURABILITY, MERCHANTABLE QUALITY, FITNESS FOR A PARTICULAR - PURPOSE, UPDATES, UPGRADES, SUPPLEMENTS, PRODUCTS, APPLIANCES, - SYSTEM INTEGRATION, DATA ACCURACY AND ANY OTHER ITEMS PROVIDED - HEREUNDER. ACTIVESTATE MAKES NO WARRANTY OR GUARANTEE THAT THE - OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, ERROR-FREE, - OR VIRUS-FREE, OR THAT THE SOFTWARE WILL MEET ANY PARTICULAR - CRITERIA OF PERFORMANCE, QUALITY, ACCURACY, PURPOSE, OR NEED. - YOU ASSUME THE ENTIRE RISK OF SELECTION, INSTALLATION, AND USE - OF THE SOFTWARE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN - ESSENTIAL PART OF THIS AGREEMENT. - - (b) TO THE EXTENT ANY IMPLIED WARRANTIES CANNOT BE DISCLAIMED - UNDER APPLICABLE LAW, ANY IMPLIED WARRANTIES ARE LIMITED IN - DURATION TO THE PERIOD REQUIRED BY APPLICABLE LAW. - - (c) SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED - WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A - CONSUMER, AND SO SOME OR ALL OF THE EXCLUSION OF IMPLIED - WARRANTIES OR LIMITATIONS SET OUT IN THIS SECTION MAY NOT - APPLY TO YOU. - -12. Limitation Of Liability. - - (a) INDEPENDENT OF THE FOREGOING PROVISIONS, TO THE MAXIMUM EXTENT - PERMITTED UNDER APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL - THEORY, INCLUDING WITHOUT LIMITATION, TORT, CONTRACT, OR - STRICT PRODUCTS LIABILITY, WILL ACTIVESTATE, ITS DIRECTORS, - OFFICERS, EMPLOYEES, AFFILIATES, AGENTS, CONTRACTORS, - PRINCIPALS, SUPPLIERS OR LICENSORS BE LIABLE TO YOU OR ANY - OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR - CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING WITHOUT - LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, - COMPUTER MALFUNCTION, OR ANY OTHER KIND OF COMMERCIAL DAMAGE, - EVEN IF ACTIVESTATE HAS BEEN ADVISED OF THE POSSIBILITY OF - SUCH DAMAGES. - - (b) TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAW, IN NO - EVENT WILL ACTIVESTATE BE LIABLE TO YOU FOR DAMAGES UNDER THIS - AGREEMENT FOR ANY CAUSE WHATSOEVER, AND REGARDLESS OF THE FORM - OF ACTION. - -13. Export Controls. You must comply with all export laws and - restrictions and regulations of Canada, the United States or - foreign agencies or authorities, and not to export or re-export - the Software or any direct product thereof in violation of any - such restrictions, laws or regulations, or without all necessary - approvals. As applicable, each party will obtain and bear all - expenses relating to any necessary licenses and/or exemptions with - respect to its own export of the Software from Canada or the U.S. - Neither the Software nor the underlying information or technology - may be electronically transmitted or otherwise exported or - re-exported: into any country subject to Canada or U.S. trade - sanctions covering the Software, to individuals or entities - controlled by such countries, or to nationals or residents of such - countries other than nationals who are lawfully admitted permanent - residents of countries not subject to such sanctions; to anyone on - Canada's Area Control List of the Export and Import Permits Act; - or to anyone on the U.S. Treasury Department's list of Specially - Designated Nationals and Blocked Persons or the U.S. Commerce - Department's Table of Denial Orders. By installing or using the - Software, You agree to the foregoing and represent and warrant - that it complies with these conditions. - -14. U.S. Government End-Users. The Software is a "commercial item," as - that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of - "commercial computer software" and "commercial computer software - documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. - 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 - through 227.7202-4 (June 1995), all U.S. Government End Users - acquire the Software with only those rights as are granted to - all other end users pursuant to the terms and conditions herein. - Unpublished rights are reserved under the copyright laws of Canada - and the United States. - -15. Licensee Outside The U.S. If You are located outside the U.S., - then the following provisions will apply: (a) Les parties aux - presentes confirment leur volonte que cette convention de meme que - tous les documents y compris tout avis qui siy rattache, soient - rediges en langue anglaise (translation: "The parties confirm that - this Agreement and all related documentation is and will be in the - English language."); and (b) You are responsible for complying - with any local laws in Your jurisdiction which might impact Your - right to import, export or use the Software, and You represent - that You have complied with any regulations or registration - procedures required by applicable law to make this license - enforceable. - -16. Entire Agreement. This Agreement constitutes the entire - understanding of the parties with respect to the subject matter of - this Agreement and merges all prior communications, - representations, and agreements. - -17. Severability. If any provision of this Agreement is declared - invalid or unenforceable, such provision will be deemed modified - to the extent necessary and possible to render it valid and - enforceable. In any event, the unenforceability or invalidity of - any provision will not affect any other provision of this - Agreement, and this Agreement will continue in full force and - effect, and be construed and enforced, as if such provision had - not been included, or had been modified as above provided, as the - case may be. - -18. Entire Agreement & Amendment. This Agreement constitutes the - complete agreement between the parties and supersedes all prior or - contemporaneous agreements or representations, written or oral, - concerning the subject matter of this Agreement, appendices and - attachments. ActiveState reserves the right to change this - Agreement at any time, which change shall be effective as of the - effective date for the terms and conditions of this Agreement as - shown on ActiveState’s Website (the “Change Effective Date”). Your - continued use of the Software after the Change Effective Date - constitutes Your acceptance of such changes. This Agreement may - not be otherwise amended without ActiveState's prior written - agreement. You agree to periodically review the terms and - conditions of this Agreement as updated from time to time on - ActiveState’s website. - -19. Arbitration. Except for actions to protect intellectual property - rights and to enforce an arbitrator's decision hereunder, all - disputes, controversies, or claims arising out of or relating to - this Agreement or a breach thereof will be submitted to and be - finally resolved by arbitration under the rules of the American - Arbitration Association ("AAA") then in effect. There will be one - arbitrator, and such arbitrator will be chosen by mutual agreement - of the parties in accordance with AAA rules. The arbitration will - take place in Vancouver, BC, Canada, and may be conducted by - telephone or online. The arbitrator will apply the laws of the - Province of British Columbia, Canada to all issues in dispute. The - controversy or claim will be arbitrated on an individual basis, - and will not be consolidated in any arbitration with any claim or - controversy of any other party. The findings of the arbitrator - will be final and binding on the parties, and may be entered in - any court of competent jurisdiction for enforcement. Enforcements - of any award or judgment will be governed by the United Nations - Convention on the Recognition and Enforcement of Foreign Arbitral - Awards. Should either party file an action contrary to this - provision, the other party may recover legal fees and costs up to - $1,000.00. - -20. Jurisdiction And Venue. The superior courts of Vancouver in the - Province of British Columbia, Canada will be the exclusive - jurisdiction and venue for all legal proceedings that are not - arbitrated under this Agreement. - -21. Force Majeure. Neither party will be liable for damages for any - delay or failure of delivery arising out of causes beyond their - reasonable control and without their fault or negligence, - including, but not limited to, Acts of God, acts of civil or - military authority, fires, riots, wars, embargoes, Internet - disruptions, hacker attacks, or communications failures. - Notwithstanding anything to the contrary contained herein, if - either party is unable to perform hereunder for a period of - thirty (30) consecutive days, then the other party may terminate - this Agreement immediately without liability by ten (10) days’ - written notice to the other. - -22. Publicity And Audit Rights. - - (a) You grant ActiveState the right to include Your name, trade - name, trademark, service mark or logo in its Software - promotional material. You may retract this grant at any time - in writing to marcom@activestate.com, requesting Your name, - trade name, trademark, service mark or logo be excluded from - future releases of ActiveState Software promotional material. - Requests cannot be complied with retroactively and may require - up to thirty (30) days to process. - - (b) If You entered into this Agreement on behalf of a Person, - where such Person has more than 100 employees, if requested by - ActiveState, You will furnish ActiveState with a signed - certification (i) verifying that the Software is being used - pursuant to the terms of this Agreement, including any user - limitations and (ii) listing the locations where the Software - is being used, the version(s) of the Software being used, how - long and how the Software is being used, and the number - computing devices and operating systems the Software is being - used with. You agree to grant ActiveState reasonable access to - Your site(s) and/or systems, upon prior notice during normal - business hours, to audit the use of the Software. Any such - audit shall be at ActiveState’s expense. - -23. Assignment. Except as expressly provided herein, neither this - Agreement nor any rights granted hereunder, nor the use of any of - the Software may be assigned, or otherwise transferred, in whole - or in part, by You, without the prior written consent of - ActiveState. Any permitted assignment by You under this Section - will be conditional upon You delivering all copies of the Software - to the transferee along with a copy of this Agreement, the - transferee accepting the terms and conditions of this Agreement, - and Your license to the Software terminating upon transfer. Any - attempted assignment by You will be void and of no effect unless - permitted by the foregoing. You acknowledge and agree that - ActiveState may assign this Agreement to any third party without - Your prior consent. - -24. Enurement. This Agreement will enure to the benefit of the - parties’ permitted successors and assigns. - -25. Governing Law. This Agreement will be construed under the laws of - the Province of British Columbia and the federal laws of Canada - applicable therein, without regard to the conflict of law rules. - The application of the United Nations Convention of Contracts for - the International Sale of Goods and any local implementations - thereof are expressly excluded. The parties agree that the Uniform - Computer - -Transactions Act or any version thereof, adopted by any jurisdiction, -in any form ("UCITA"), will not apply to this Agreement, and to the -extent that UCITA may be applicable, the parties agree to opt out of -the applicability of UCITA pursuant to the opt-out provision(s) -contained therein. - - - -EXHIBIT A - -Tcl/tk License Terms - - -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, and other -parties. The following terms apply to all files associated with the -software unless explicitly disclaimed in individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, -provided that existing copyright notices are retained in all copies -and that this notice is included verbatim in any distributions. No -written agreement, license, or royalty fee is required for any of the -authorized uses. Modifications to this software may be copyrighted by -their authors and need not follow the licensing terms described here, -provided that the new terms are clearly indicated on the first page of -each file where they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND -THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE -MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, -the software shall be classified as "Commercial Computer Software" -and the Government shall have only "Restricted Rights" as defined -in Clause 252.227-7013 (c)(1) of DFARs. Notwithstanding the foregoing, -the authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. diff --git a/test/integration/testdata/offline-install/assets/IntegrationTest/installer_config.json b/test/integration/testdata/offline-install/assets/IntegrationTest/installer_config.json deleted file mode 100644 index 615cac0a65..0000000000 --- a/test/integration/testdata/offline-install/assets/IntegrationTest/installer_config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "org_name": "ActiveState-Test", - "project_id": "00000000-0000-0000-0000-000000000000", - "project_name": "IntegrationTest", - "commit_id": "00000000-0000-0000-0000-000000000000" -}