Snipe-IT is a web-based open source asset management system. https://snipeitapp.com/main
parent
ae8508867d
commit
b9a74a1b67
@ -0,0 +1,244 @@ |
|||||||
|
# This file originates from composer2nix |
||||||
|
|
||||||
|
{ stdenv, lib, writeTextFile, fetchurl, php, unzip, phpPackages }: |
||||||
|
|
||||||
|
let |
||||||
|
inherit (phpPackages) composer; |
||||||
|
|
||||||
|
filterSrc = src: |
||||||
|
builtins.filterSource (path: type: type != "directory" || (baseNameOf path != ".git" && baseNameOf path != ".git" && baseNameOf path != ".svn")) src; |
||||||
|
|
||||||
|
buildZipPackage = { name, src }: |
||||||
|
stdenv.mkDerivation { |
||||||
|
inherit name src; |
||||||
|
nativeBuildInputs = [ unzip ]; |
||||||
|
buildCommand = '' |
||||||
|
shopt -s dotglob |
||||||
|
unzip $src |
||||||
|
baseDir=$(find . -type d -mindepth 1 -maxdepth 1) |
||||||
|
cd $baseDir |
||||||
|
mkdir -p $out |
||||||
|
mv * $out |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
buildPackage = |
||||||
|
{ name |
||||||
|
, src |
||||||
|
, packages ? {} |
||||||
|
, devPackages ? {} |
||||||
|
, buildInputs ? [] |
||||||
|
, symlinkDependencies ? false |
||||||
|
, executable ? false |
||||||
|
, removeComposerArtifacts ? false |
||||||
|
, postInstall ? "" |
||||||
|
, noDev ? false |
||||||
|
, composerExtraArgs ? "" |
||||||
|
, unpackPhase ? "true" |
||||||
|
, buildPhase ? "true" |
||||||
|
, ...}@args: |
||||||
|
|
||||||
|
let |
||||||
|
reconstructInstalled = writeTextFile { |
||||||
|
name = "reconstructinstalled.php"; |
||||||
|
executable = true; |
||||||
|
text = '' |
||||||
|
#! ${php}/bin/php |
||||||
|
<?php |
||||||
|
if(file_exists($argv[1])) |
||||||
|
{ |
||||||
|
$composerLockStr = file_get_contents($argv[1]); |
||||||
|
|
||||||
|
if($composerLockStr === false) |
||||||
|
{ |
||||||
|
fwrite(STDERR, "Cannot open composer.lock contents\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
$config = json_decode($composerLockStr, true); |
||||||
|
|
||||||
|
if(array_key_exists("packages", $config)) |
||||||
|
$allPackages = $config["packages"]; |
||||||
|
else |
||||||
|
$allPackages = array(); |
||||||
|
|
||||||
|
${lib.optionalString (!noDev) '' |
||||||
|
if(array_key_exists("packages-dev", $config)) |
||||||
|
$allPackages = array_merge($allPackages, $config["packages-dev"]); |
||||||
|
''} |
||||||
|
|
||||||
|
$packagesStr = json_encode($allPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); |
||||||
|
print($packagesStr); |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
print("[]"); |
||||||
|
?> |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
constructBin = writeTextFile { |
||||||
|
name = "constructbin.php"; |
||||||
|
executable = true; |
||||||
|
text = '' |
||||||
|
#! ${php}/bin/php |
||||||
|
<?php |
||||||
|
$composerJSONStr = file_get_contents($argv[1]); |
||||||
|
|
||||||
|
if($composerJSONStr === false) |
||||||
|
{ |
||||||
|
fwrite(STDERR, "Cannot open composer.json contents\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
$config = json_decode($composerJSONStr, true); |
||||||
|
|
||||||
|
if(array_key_exists("bin-dir", $config)) |
||||||
|
$binDir = $config["bin-dir"]; |
||||||
|
else |
||||||
|
$binDir = "bin"; |
||||||
|
|
||||||
|
if(array_key_exists("bin", $config)) |
||||||
|
{ |
||||||
|
if(!file_exists("vendor/".$binDir)) |
||||||
|
mkdir("vendor/".$binDir); |
||||||
|
|
||||||
|
foreach($config["bin"] as $bin) |
||||||
|
symlink("../../".$bin, "vendor/".$binDir."/".basename($bin)); |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
bundleDependencies = dependencies: |
||||||
|
lib.concatMapStrings (dependencyName: |
||||||
|
let |
||||||
|
dependency = dependencies.${dependencyName}; |
||||||
|
in |
||||||
|
'' |
||||||
|
${if dependency.targetDir == "" then '' |
||||||
|
vendorDir="$(dirname ${dependencyName})" |
||||||
|
mkdir -p "$vendorDir" |
||||||
|
${if symlinkDependencies then |
||||||
|
''ln -s "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"'' |
||||||
|
else |
||||||
|
''cp -av "${dependency.src}" "$vendorDir/$(basename "${dependencyName}")"'' |
||||||
|
} |
||||||
|
'' else '' |
||||||
|
namespaceDir="${dependencyName}/$(dirname "${dependency.targetDir}")" |
||||||
|
mkdir -p "$namespaceDir" |
||||||
|
${if symlinkDependencies then |
||||||
|
''ln -s "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"'' |
||||||
|
else |
||||||
|
''cp -av "${dependency.src}" "$namespaceDir/$(basename "${dependency.targetDir}")"'' |
||||||
|
} |
||||||
|
''} |
||||||
|
'') (builtins.attrNames dependencies); |
||||||
|
|
||||||
|
extraArgs = removeAttrs args [ "packages" "devPackages" "buildInputs" ]; |
||||||
|
in |
||||||
|
stdenv.mkDerivation ({ |
||||||
|
buildInputs = [ php composer ] ++ buildInputs; |
||||||
|
|
||||||
|
inherit unpackPhase buildPhase; |
||||||
|
|
||||||
|
installPhase = '' |
||||||
|
${if executable then '' |
||||||
|
mkdir -p $out/share/php |
||||||
|
cp -av $src $out/share/php/$name |
||||||
|
chmod -R u+w $out/share/php/$name |
||||||
|
cd $out/share/php/$name |
||||||
|
'' else '' |
||||||
|
cp -av $src $out |
||||||
|
chmod -R u+w $out |
||||||
|
cd $out |
||||||
|
''} |
||||||
|
|
||||||
|
# Remove unwanted files |
||||||
|
rm -f *.nix |
||||||
|
|
||||||
|
export HOME=$TMPDIR |
||||||
|
|
||||||
|
# Remove the provided vendor folder if it exists |
||||||
|
rm -Rf vendor |
||||||
|
|
||||||
|
# If there is no composer.lock file, compose a dummy file. |
||||||
|
# Otherwise, composer attempts to download the package.json file from |
||||||
|
# the registry which we do not want. |
||||||
|
if [ ! -f composer.lock ] |
||||||
|
then |
||||||
|
cat > composer.lock <<EOF |
||||||
|
{ |
||||||
|
"packages": [] |
||||||
|
} |
||||||
|
EOF |
||||||
|
fi |
||||||
|
|
||||||
|
# Reconstruct the installed.json file from the lock file |
||||||
|
mkdir -p vendor/composer |
||||||
|
${php}/bin/php ${reconstructInstalled} composer.lock > vendor/composer/installed.json |
||||||
|
|
||||||
|
# Copy or symlink the provided dependencies |
||||||
|
cd vendor |
||||||
|
${bundleDependencies packages} |
||||||
|
${lib.optionalString (!noDev) (bundleDependencies devPackages)} |
||||||
|
cd .. |
||||||
|
|
||||||
|
# Reconstruct autoload scripts |
||||||
|
# We use the optimize feature because Nix packages cannot change after they have been built |
||||||
|
# Using the dynamic loader for a Nix package is useless since there is nothing to dynamically reload. |
||||||
|
composer dump-autoload --optimize ${lib.optionalString noDev "--no-dev"} ${composerExtraArgs} |
||||||
|
|
||||||
|
# Run the install step as a validation to confirm that everything works out as expected |
||||||
|
composer install --optimize-autoloader ${lib.optionalString noDev "--no-dev"} ${composerExtraArgs} |
||||||
|
|
||||||
|
${lib.optionalString executable '' |
||||||
|
# Reconstruct the bin/ folder if we deploy an executable project |
||||||
|
${php}/bin/php ${constructBin} composer.json |
||||||
|
ln -s $(pwd)/vendor/bin $out/bin |
||||||
|
''} |
||||||
|
|
||||||
|
${lib.optionalString (!symlinkDependencies) '' |
||||||
|
# Patch the shebangs if possible |
||||||
|
if [ -d $(pwd)/vendor/bin ] |
||||||
|
then |
||||||
|
# Look for all executables in bin/ |
||||||
|
for i in $(pwd)/vendor/bin/* |
||||||
|
do |
||||||
|
# Look for their location |
||||||
|
realFile=$(readlink -f "$i") |
||||||
|
|
||||||
|
# Restore write permissions |
||||||
|
chmod u+wx "$(dirname "$realFile")" |
||||||
|
chmod u+w "$realFile" |
||||||
|
|
||||||
|
# Patch shebang |
||||||
|
sed -e "s|#!/usr/bin/php|#!${php}/bin/php|" \ |
||||||
|
-e "s|#!/usr/bin/env php|#!${php}/bin/php|" \ |
||||||
|
"$realFile" > tmp |
||||||
|
mv tmp "$realFile" |
||||||
|
chmod u+x "$realFile" |
||||||
|
done |
||||||
|
fi |
||||||
|
''} |
||||||
|
|
||||||
|
if [ "$removeComposerArtifacts" = "1" ] |
||||||
|
then |
||||||
|
# Remove composer stuff |
||||||
|
rm -f composer.json composer.lock |
||||||
|
fi |
||||||
|
|
||||||
|
# Execute post install hook |
||||||
|
runHook postInstall |
||||||
|
''; |
||||||
|
} // extraArgs); |
||||||
|
in |
||||||
|
{ |
||||||
|
inherit filterSrc; |
||||||
|
composer = lib.makeOverridable composer; |
||||||
|
buildZipPackage = lib.makeOverridable buildZipPackage; |
||||||
|
buildPackage = lib.makeOverridable buildPackage; |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
{pkgs ? import <nixpkgs> { |
||||||
|
inherit system; |
||||||
|
}, system ? builtins.currentSystem, noDev ? false, php ? pkgs.php, phpPackages ? pkgs.phpPackages}: |
||||||
|
|
||||||
|
let |
||||||
|
composerEnv = import ./composer-env.nix { |
||||||
|
inherit (pkgs) stdenv lib writeTextFile fetchurl unzip; |
||||||
|
inherit php phpPackages; |
||||||
|
}; |
||||||
|
in |
||||||
|
import ./php-packages.nix { |
||||||
|
inherit composerEnv noDev; |
||||||
|
inherit (pkgs) fetchurl fetchgit fetchhg fetchsvn; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,47 @@ |
|||||||
|
{ pkgs, stdenv, lib, fetchFromGitHub, dataDir ? "/var/lib/snipe-it" }: |
||||||
|
|
||||||
|
let |
||||||
|
package = (import ./composition.nix { |
||||||
|
inherit pkgs; |
||||||
|
inherit (stdenv.hostPlatform) system; |
||||||
|
noDev = true; # Disable development dependencies |
||||||
|
# Requires PHP >= 7.4 and PHP < 8.0 as of v5.4.3 |
||||||
|
# https://snipe-it.readme.io/docs/requirements |
||||||
|
php = pkgs.php74; |
||||||
|
phpPackages = pkgs.php74Packages; |
||||||
|
}).overrideAttrs (attrs : { |
||||||
|
installPhase = attrs.installPhase + '' |
||||||
|
rm -R $out/storage $out/public/uploads $out/bootstrap/cache |
||||||
|
ln -s ${dataDir}/.env $out/.env |
||||||
|
ln -s ${dataDir}/storage $out/ |
||||||
|
ln -s ${dataDir}/public/uploads $out/public/uploads |
||||||
|
ln -s ${dataDir}/bootstrap/cache $out/bootstrap/cache |
||||||
|
chmod +x $out/artisan |
||||||
|
''; |
||||||
|
}); |
||||||
|
|
||||||
|
in package.override rec { |
||||||
|
pname = "snipe-it"; |
||||||
|
version = "5.4.3"; |
||||||
|
|
||||||
|
src = fetchFromGitHub { |
||||||
|
owner = "snipe"; |
||||||
|
repo = pname; |
||||||
|
rev = "v${version}"; |
||||||
|
sha256 = "053cm5vb0806sj61g0zf0xqqzlchgkdj8zwkry07mhjdbp1k8k7n"; |
||||||
|
}; |
||||||
|
|
||||||
|
meta = with lib; { |
||||||
|
description = "A free open source IT asset/license management system "; |
||||||
|
longDescription = '' |
||||||
|
Snipe-IT was made for IT asset management, to enable IT departments to track |
||||||
|
who has which laptop, when it was purchased, which software licenses and accessories |
||||||
|
are available, and so on. |
||||||
|
Details for snipe-it can be found on the official website at https://snipeitapp.com/. |
||||||
|
''; |
||||||
|
homepage = "https://snipeitapp.com/"; |
||||||
|
license = licenses.agpl3Only; |
||||||
|
maintainers = with maintainers; [ yayayayaka ]; |
||||||
|
platforms = platforms.linux; |
||||||
|
}; |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,50 @@ |
|||||||
|
#!/usr/bin/env nix-shell |
||||||
|
#! nix-shell -i bash -p nix curl jq nix-update |
||||||
|
|
||||||
|
# check if composer2nix is installed |
||||||
|
if ! command -v composer2nix &> /dev/null; then |
||||||
|
echo "Please install composer2nix (https://github.com/svanderburg/composer2nix) to run this script." |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
CURRENT_VERSION=$(nix eval --raw '(with import ../../../.. {}; snipe-it.version)') |
||||||
|
TARGET_VERSION_REMOTE=$(curl ${GITHUB_TOKEN:+" -u \":$GITHUB_TOKEN\""} https://api.github.com/repos/snipe/snipe-it/releases/latest | jq -r ".tag_name") |
||||||
|
TARGET_VERSION=${TARGET_VERSION_REMOTE:1} |
||||||
|
SNIPE_IT=https://github.com/snipe/snipe-it/raw/$TARGET_VERSION_REMOTE |
||||||
|
SHA256=$(nix-prefetch-url --unpack "https://github.com/snipe/snipe-it/archive/v$TARGET_VERSION/snipe-it.tar.gz") |
||||||
|
|
||||||
|
if [[ "$CURRENT_VERSION" == "$TARGET_VERSION" ]]; then |
||||||
|
echo "snipe-it is up-to-date: ${CURRENT_VERSION}" |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
curl -LO "$SNIPE_IT/composer.json" |
||||||
|
curl -LO "$SNIPE_IT/composer.lock" |
||||||
|
|
||||||
|
composer2nix --name "snipe-it" \ |
||||||
|
--composition=composition.nix \ |
||||||
|
--no-dev |
||||||
|
rm composer.json composer.lock |
||||||
|
|
||||||
|
# change version number |
||||||
|
sed -e "s/version =.*;/version = \"$TARGET_VERSION\";/g" \ |
||||||
|
-e "s/sha256 =.*;/sha256 = \"$SHA256\";/g" \ |
||||||
|
-i ./default.nix |
||||||
|
|
||||||
|
# fix composer-env.nix |
||||||
|
sed -e "s/stdenv\.lib/lib/g" \ |
||||||
|
-e '3s/stdenv, writeTextFile/stdenv, lib, writeTextFile/' \ |
||||||
|
-i ./composer-env.nix |
||||||
|
|
||||||
|
# fix composition.nix |
||||||
|
sed -e '7s/stdenv writeTextFile/stdenv lib writeTextFile/' \ |
||||||
|
-i composition.nix |
||||||
|
|
||||||
|
# fix missing newline |
||||||
|
echo "" >> composition.nix |
||||||
|
echo "" >> php-packages.nix |
||||||
|
|
||||||
|
cd ../../../.. |
||||||
|
nix-build -A snipe-it |
||||||
|
|
||||||
|
exit $? |
Loading…
Reference in new issue