Package#

NAME#

Kernel::System::Package - to manage application packages/modules

DESCRIPTION#

All functions to manage application packages/modules.

PUBLIC INTERFACE#

new()#

create an object

my $PackageObject = $Kernel::OM->Get('Kernel::System::Package');

RepositoryList()#

returns a list of repository packages

my @List = $PackageObject->RepositoryList();

my @List = $PackageObject->RepositoryList(
    Result => 'short',  # will only return name, version, install_status md5sum, vendor and build commit ID
    instead of the structure
);

RepositoryGet()#

get a package from local repository

my $Package = $PackageObject->RepositoryGet(
    Name    => 'Application A',
    Version => '1.0',
);

my $PackageScalar = $PackageObject->RepositoryGet(
    Name            => 'Application A',
    Version         => '1.0',
    Result          => 'SCALAR',
    DisableWarnings => 1,                 # optional
);

RepositoryAdd()#

add a package to local repository

$PackageObject->RepositoryAdd(
    String => $FileString,
);

RepositoryRemove()#

remove a package from local repository

$PackageObject->RepositoryRemove(
    Name    => 'Application A',
    Version => '1.0',
);

PackageInstall()#

install a package

$PackageObject->PackageInstall(
    String => $FileString,
    Force  => 1,             # optional 1 or 0, for to install package even if validation fails
);

PackageReinstall()#

reinstall files of a package

$PackageObject->PackageReinstall( String => $FileString );

PackageUpgrade()#

upgrade a package

$PackageObject->PackageUpgrade(
    String => $FileString,
    Force  => 1,             # optional 1 or 0, for to install package even if validation fails
);

PackageUninstall()#

uninstall a package

$PackageObject->PackageUninstall( String => $FileString );

GetRequiredPackages()#

This function returns an array of hashes that contains information about RequiredPackages of the .sopm-file.

my $PackageRequired = $PackageObject->GetRequiredPackages(
    Structure => \%Structure,       # return of PackageParse()
);

Returns:

my $PackageRequired = (
  {
    'Name'                       => 'ITSMCore',
    'Version'                    => '',
    'IsInstalled'                => 'Problem',
    'IsRequiredVersionInstalled' => 0,
  },
  {
    'Name'                       => 'Survey',
    'Version'                    => '6.5.0',
    'IsInstalled'                => 'OK',
    'IsRequiredVersionInstalled' => 1,
  }
);

RootRepositoryListGet()#

Returns a list of available root repositories. These are the ones contained in the XML file configured in SysConfig option Package::RepositoryRoot.

my %List = $PackageObject->RootRepositoryListGet();

ConfiguredRepositoryListGet()#

Returns the combined configuration of all configured repositories from Package::RepositoryRoot and Package::RepositoryList.

my %RepositoryList = $PackageObject->ConfiguredRepositoryListGet();

Returns:

my %RepositoryList = (
    'Freebie Features' => {
        URL   => 'https://download.znuny.org/releases/packages',
    },
    'Znuny Open Source Add-ons' => {
        URL   => 'https://addons.znuny.com/public',
    },
    'Znuny GmbH' => {
        URL   => 'https://addons.znuny.com/private',
        AuthHeaderKey   => '...',
        AuthHeaderValue => '...',
    },
    'Customer Z' => {
        URL             => 'https://addons.znuny.com/private',
        AuthHeaderKey   => '...',
        AuthHeaderValue => '...',
    },
);

RepositoryPackageListGet()#

Returns a list of available packages for the given source repository.

my @List = $PackageObject->RepositoryPackageListGet(
    Source             => 'Example repository 1',   # the value of key 'Name' in item of SysConfig option Package::RepositoryList or a direct download URL
    Lang               => 'en',
    Cache              => 0,                        # (optional) use cached data
    IncludeSameVersion => 1,                        # (optional) also get packages already installed and with the same version
);

PackageOnlineGet()#

download online package and put it into the local repository

$PackageObject->PackageOnlineGet(
    Source => 'http://host.example.com/', # or the name of a configured repository in Package::RepositoryList
    File   => 'SomePackage-1.0.opm',
);

DeployCheck()#

check if package (files) is deployed, returns true if it’s ok

$PackageObject->DeployCheck(
    Name    => 'Application A',
    Version => '1.0',
    Log     => 1,       # Default: 1
);

DeployCheckInfo()#

returns the info of the latest DeployCheck(), what’s not deployed correctly

my %Hash = $PackageObject->DeployCheckInfo();

PackageBuild()#

build an opm package

my $Package = $PackageObject->PackageBuild(
    Name => {
        Content => 'SomePackageName',
    },
    Version => {
        Content => '1.0',
    },
    Vendor => {
        Content => 'OTRS AG',
    },
    URL => {
        Content => 'L<http://otrs.org/>',
    },
    License => {
        Content => 'GNU GENERAL PUBLIC LICENSE Version 3, November 2007',
    }
    Description => [
        {
            Lang    => 'en',
            Content => 'english description',
        },
        {
            Lang    => 'de',
            Content => 'german description',
        },
    ],
    Filelist = [
        {
            Location   => 'Kernel/System/Lala.pm',
            Permission => '644',
            Content    => $FileInString,
        },
        {
            Location   => 'Kernel/System/Lulu.pm',
            Permission => '644',
            Content    => $FileInString,
        },
    ],
);

PackageParse()#

parse a package

my %Structure = $PackageObject->PackageParse( String => $FileString );

PackageExport()#

export files of an package

$PackageObject->PackageExport(
    String => $FileString,
    Home   => '/path/to/export'
);

PackageIsInstalled()#

returns true if the package is already installed

$PackageObject->PackageIsInstalled(
    String => $PackageString,    # Attribute String or Name is required
    Name   => $NameOfThePackage,
);

PackageInstallDefaultFiles()#

returns true if the distribution package (located under ) can get installed

$PackageObject->PackageInstallDefaultFiles();

PackageFileGetMD5Sum()#

generates a MD5 Sum for all files in a given package

my $MD5Sum = $PackageObject->PackageFileGetMD5Sum(
    Name    => 'Package Name',
    Version => 123.0,
);

returns:

$MD5SumLookup = {
    'Direcoty/File1' => 'f3f30bd59afadf542770d43edb280489',
    'Direcoty/File2' => 'ccb8a0b86adf125a36392e388eb96778',
};

AnalyzePackageFrameworkRequirements()#

Compare a framework array with the current framework.

my %CheckOk = $PackageObject->AnalyzePackageFrameworkRequirements(
    Framework => $Structure{Framework},     # [ { 'Content' => '4.0.x', 'Minimum' => '4.0.4'} ]
    NoLog     => 1, # optional
);

%CheckOK = (
    Success                  => 1,           # 1 || 0
    RequiredFramework        => '5.0.x',
    RequiredFrameworkMinimum => '5.0.10',
    RequiredFrameworkMaximum => '5.0.16',
);

PackageUpgradeAll()#

Updates installed packages to their latest version.

my %Result = $PackageObject->PackageUpgradeAll(
    Force           => 1,     # optional 1 or 0, Upgrades packages even if validation fails.
    SkipDeployCheck => 1,     # optional 1 or 0, If active it does not check file deployment status
                              #     for already updated packages.
);

%Result = (
    Updated => {                # updated packages to the latest remote repository version
        PackageA => 1,
        PackageB => 1,
        PackageC => 1,
        # ...
    },
    Installed => {              # packages installed as a result of missing dependencies
        PackageD => 1,
        # ...
    },
    AlreadyInstalled {          # packages that are already installed with the latest version
        PackageE => 1,
        # ...
    }
    Undeployed {                # packages not correctly deployed
        PackageK => 1,
        # ...
    }
    Failed => {                 # or {} if no failures
        Cyclic => {             # packages with cyclic dependencies
            PackageF => 1,
            # ...
        },
        NotFound => {           # packages not listed in the remote repositories
            PackageG => 1,
            # ...
        },
        WrongVersion => {       # packages that require a major version that is not available in the remote repositories
            PackageH => 1,
            # ...
        },
        DependencyFail => {     # packages with dependencies that fail on any of the above reasons
            PackageI => 1,
            # ...
        },
    },
);

PackageInstallOrderListGet()#

Gets a list of packages and its corresponding install order including is package dependencies. Higher

install order means to install first.

my %Result = $PackageObject->PackageInstallOrderListGet(
    InstalledPackages => \@PackageList,      # as returned from RepositoryList(Result => 'short')
    OnlinePackages    => \@PackageList,      # as returned from PackageOnlineList()
);

%Result = (
    InstallOrder => {
        PackageA => 3,
        PackageB => 2,
        PackageC => 1,
        PackageD => 1,
        # ...
    },
    Failed => {                 # or {} if no failures
        Cyclic => {             # packages with cyclic dependencies
            PackageE => 1,
            # ...
        },
        NotFound => {           # packages not listed in the remote repositories
            PackageF => 1,
            # ...
        },
        WrongVersion => {        # packages that require a major version that is not available in the remote repositories
            PackageG => 1,
            # ...
        },
        DependencyFail => {     # packages with dependencies that fail on any of the above reasons
            PackageH => 1,
            # ...
        }
    },
);

PackageUpgradeAllDataDelete()#

Removes all Package Upgrade All data from the database.

my $Success = $PackageObject->PackageUpgradeAllDataDelete();

PackageUpgradeAllIsRunning()#

Check if there is a Package Upgrade All process running by checking the scheduler tasks and the system data.

my %Result = $PackageObject->PackageUpgradeAllIsRunning();
Returns:
%Result = (

IsRunning => 1, # or 0 if it is not running UpgradeStatus => ‘Running’, # (optional) ‘Running’ or ‘Finished’ or ‘TimedOut’, UpgradeSuccess => 1, # (optional) 1 or 0,

);

CheckVersion()#

Compare the two version strings $VersionNew and $VersionInstalled. The type is either ‘Min’ or ‘Max’. ‘Min’ returns a true value if $VersionInstalled >= $VersionNew. ‘Max’ returns a true value if $VersionInstalled < $VersionNew. Otherwise undef is returned in scalar context.

my $CheckOk = $PackageObject->CheckVersion(
    VersionNew       => '1.3.92',
    VersionInstalled => '1.3.91',
    Type             => 'Min',     # 'Min' or 'Max'
    ExternalPackage  => 1,         # optional
)

GetRequiredModules()#

This function returns an array of hashes that contains information about RequiredModules of the .sopm-file.

my $ModuleRequired = $PackageObject->GetRequiredModules(
    Structure => \%Structure,       # return of PackageParse()
);

Returns:

my $ModuleRequired = (
    {
      'Name'        => 'GD::Graph',
      'Version'     => undef,
      'IsInstalled' => 'Problem',
    },
    {
      'Name'        => 'Data::Dumper',
      'Version'     => '2.179',
      'IsInstalled' => 'OK',
    }
);

_CheckVersion()#

Deprecated. Please use the new CheckVersion() instead of this.

_PackageUninstallMerged()#

ONLY CALL THIS METHOD FROM A DATABASE UPGRADING SCRIPT DURING FRAMEWORK UPDATES OR FROM A CODEUPGRADE SECTION IN AN SOPM FILE OF A PACKAGE THAT INCLUDES A MERGED FEATURE ADDON.

Uninstall an already framework (or module) merged package.

Package files that are not in the framework ARCHIVE file will be deleted, DatabaseUninstall() and CodeUninstall are not called.

$Success = $PackageObject->_PackageUninstallMerged(
    Name        => 'some package name',
    Home        => 'OTRS Home path',      # Optional
    DeleteSaved => 1,                     # or 0, 1 Default, Optional: if set to 1 it also
                                          # delete .save files
);

_PackageInstallOrderListGet()#

Helper function for PackageInstallOrderListGet() to process the packages and its dependencies recursively.

my $Success = $PackageObject->_PackageInstallOrderListGet(
    Callers           => {      # packages in the recursive chain
        PackageA => 1,
        # ...
    },
    InstalledVersions => {      # list of installed packages and their versions
        PackageA => '1.0.1',
        # ...
    },
    TargetPackages => {
        PackageA => '1.0.1',    # list of packages to process
        # ...
    }
    InstallOrder => {           # current install order
        PackageA => 2,
        PacakgeB => 1,
        # ...
    },
    Failed => {                 # current failed packages or dependencies
        Cyclic => {},
        NotFound => {},
        WrongVersion => {},
        DependencyFail => {},
    },
    OnlinePackageLookup => {
        PackageA => {
            Name    => 'PackageA',
            Version => '1.0.1',
            PackageRequired => [
                {
                    Content => 'PackageB',
                    Version => '1.0.2',
                },
                # ...
            ],
        },
    },
    IsDependency => 1,      # 1 or 0
);

_PackageOnlineListGet()#

Helper function that gets the full list of available remote packages.

my %OnlinePackages = $PackageObject->_PackageOnlineListGet();

Returns:

%OnlinePackages = (
    PackageList => [
        {
            Name        => 'Test',
            Version     => '6.0.20',
            File        => 'Test-6.0.20.opm',
            ChangeLog   => 'InitialRelease',
            Description => 'Test package.',
            Framework   => [
                {
                    Content => '6.0.x',
                    Minimum => '6.0.2',
                    # ... ,
                }
            ],
            License => 'GNU GENERAL PUBLIC LICENSE Version 3, November 2007',
            PackageRequired => [
                {
                    Content => 'TestRequitement',
                    Version => '6.0.20',
                    # ... ,
                },
            ],
            URL    => 'http://otrs.org/',
            Vendor => 'OTRS AG',
        },
        # ...
    ];
    PackageLookup  => {
        Test => {
               URL        => 'http://otrs.org/',
                Version   => '6.0.20',
                File      => 'Test-6.0.20.opm',
        },
        # ...
    },
);

_RepositoryCacheClear()#

Remove all caches related to the package repository.

my $Success = $PackageObject->_RepositoryCacheClear();

_ConfigurationFilesDeployCheck()#

check if package configuration files are deployed correctly.

my $Success = $PackageObject->_ConfigurationFilesDeployCheck(
    Name    => 'Application A',
    Version => '1.0',
);