virtualbox: add update script
This commit is contained in:
parent
d4d6d26588
commit
93e8f5d90f
@ -19,9 +19,8 @@ with stdenv.lib;
|
|||||||
let
|
let
|
||||||
python = python3;
|
python = python3;
|
||||||
buildType = "release";
|
buildType = "release";
|
||||||
# Remember to change the extpackRev and version in extpack.nix and
|
# Use maintainers/scripts/update.nix to update the version and all related hashes or
|
||||||
# guest-additions/default.nix as well.
|
# change the hashes in extpack.nix and guest-additions/default.nix as well manually.
|
||||||
main = "59f8f5774473f593e3eb5940e2a337e0674bcd9854164b2578fd43f896260c99";
|
|
||||||
version = "6.1.4";
|
version = "6.1.4";
|
||||||
|
|
||||||
iasl' = iasl.overrideAttrs (old: rec {
|
iasl' = iasl.overrideAttrs (old: rec {
|
||||||
@ -39,7 +38,7 @@ in stdenv.mkDerivation {
|
|||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://download.virtualbox.org/virtualbox/${version}/VirtualBox-${version}.tar.bz2";
|
url = "https://download.virtualbox.org/virtualbox/${version}/VirtualBox-${version}.tar.bz2";
|
||||||
sha256 = main;
|
sha256 = "59f8f5774473f593e3eb5940e2a337e0674bcd9854164b2578fd43f896260c99";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = [ "out" "modsrc" ];
|
outputs = [ "out" "modsrc" ];
|
||||||
@ -216,6 +215,7 @@ in stdenv.mkDerivation {
|
|||||||
passthru = {
|
passthru = {
|
||||||
inherit version; # for guest additions
|
inherit version; # for guest additions
|
||||||
inherit extensionPack; # for inclusion in profile to prevent gc
|
inherit extensionPack; # for inclusion in profile to prevent gc
|
||||||
|
updateScript = ./update.sh;
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
#!/usr/bin/env nix-shell
|
|
||||||
#!nix-shell -i python3 -p python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import json
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
from distutils.version import LooseVersion
|
|
||||||
|
|
||||||
UPSTREAM_INFO_FILE = os.path.join(
|
|
||||||
os.path.dirname(os.path.abspath(__file__)),
|
|
||||||
"upstream-info.json"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_latest_version():
|
|
||||||
url = "http://download.virtualbox.org/virtualbox/LATEST.TXT"
|
|
||||||
return urllib.request.urlopen(url).read().strip().decode()
|
|
||||||
|
|
||||||
|
|
||||||
def load_upstream_info():
|
|
||||||
try:
|
|
||||||
with open(UPSTREAM_INFO_FILE, 'r') as fp:
|
|
||||||
return json.load(fp)
|
|
||||||
except FileNotFoundError:
|
|
||||||
return {'version': "0"}
|
|
||||||
|
|
||||||
|
|
||||||
def save_upstream_info(contents):
|
|
||||||
remark = "Generated using update.py from the same directory."
|
|
||||||
contents['__NOTE'] = remark
|
|
||||||
data = json.dumps(contents, indent=2, sort_keys=True)
|
|
||||||
with open(UPSTREAM_INFO_FILE, 'w') as fp:
|
|
||||||
fp.write(data + "\n")
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_file_table(version):
|
|
||||||
url = "http://download.virtualbox.org/virtualbox/{}/SHA256SUMS"
|
|
||||||
url = url.format(version)
|
|
||||||
result = {}
|
|
||||||
for line in urllib.request.urlopen(url):
|
|
||||||
sha, name = line.rstrip().split()
|
|
||||||
result[name.lstrip(b'*').decode()] = sha.decode()
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
def update_to_version(version):
|
|
||||||
extpack_start = 'Oracle_VM_VirtualBox_Extension_Pack-'
|
|
||||||
version_re = version.replace('.', '\\.')
|
|
||||||
attribute_map = {
|
|
||||||
'extpack': r'^' + extpack_start + r'[^-]+-[^.]+.vbox-extpack$',
|
|
||||||
'extpackRev': r'^' + extpack_start + r'[^-]+-([^.]+).vbox-extpack$',
|
|
||||||
'main': r'^VirtualBox-' + version_re + r'.tar.bz2$',
|
|
||||||
'guest': r'^VBoxGuestAdditions_' + version_re + r'.iso$',
|
|
||||||
}
|
|
||||||
table = fetch_file_table(version)
|
|
||||||
new_attrs = {'version': version}
|
|
||||||
for attr, searchexpr in attribute_map.items():
|
|
||||||
result = [re.search(searchexpr, key) for key in table.keys()]
|
|
||||||
filtered = filter(lambda m: m is not None, result)
|
|
||||||
found = [m.groups()[0] if len(m.groups()) > 0 else table[m.group(0)]
|
|
||||||
for m in filtered if m is not None]
|
|
||||||
|
|
||||||
if len(found) == 0:
|
|
||||||
msg = "No package found for attribute {}".format(attr)
|
|
||||||
raise AssertionError(msg)
|
|
||||||
elif len(found) != 1:
|
|
||||||
msg = "More than one package found for attribute {}: ".format(attr)
|
|
||||||
msg += ', '.join(found)
|
|
||||||
raise AssertionError(msg)
|
|
||||||
else:
|
|
||||||
new_attrs[attr] = found[0]
|
|
||||||
return new_attrs
|
|
||||||
|
|
||||||
|
|
||||||
info = load_upstream_info()
|
|
||||||
latest = fetch_latest_version()
|
|
||||||
if LooseVersion(info['version']) < LooseVersion(latest):
|
|
||||||
print("Updating to version {}...".format(latest), end="", flush=True)
|
|
||||||
new_attrs = update_to_version(latest)
|
|
||||||
save_upstream_info(new_attrs)
|
|
||||||
print(" done.")
|
|
||||||
else:
|
|
||||||
print("Version {} is already the latest one.".format(info['version']))
|
|
44
pkgs/applications/virtualization/virtualbox/update.sh
Executable file
44
pkgs/applications/virtualization/virtualbox/update.sh
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -i bash -p curl common-updater-scripts nix-prefetch-scripts jq
|
||||||
|
|
||||||
|
set -xeuo pipefail
|
||||||
|
|
||||||
|
nixpkgs="$(git rev-parse --show-toplevel)"
|
||||||
|
|
||||||
|
attr=virtualbox
|
||||||
|
oldVersion="$(nix-instantiate --eval -E "with import $nixpkgs {}; $attr.version or (builtins.parseDrvName $attr.name).version" | tr -d '"')"
|
||||||
|
latestVersion="$(curl -sS https://download.virtualbox.org/virtualbox/LATEST.TXT)"
|
||||||
|
|
||||||
|
function fileShaSum() {
|
||||||
|
echo "$1" | grep -w $2 | cut -f1 -d' '
|
||||||
|
}
|
||||||
|
function oldHash() {
|
||||||
|
nix-instantiate --eval --strict -A "$1.drvAttrs.outputHash" | tr -d '"'
|
||||||
|
}
|
||||||
|
function nixFile() {
|
||||||
|
nix-instantiate --eval --strict -A "${1}.meta.position" | sed -re 's/^"(.*):[0-9]+"$/\1/'
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! "$oldVersion" = "$latestVersion" ]; then
|
||||||
|
shaSums=$(curl -sS https://download.virtualbox.org/virtualbox/$latestVersion/SHA256SUMS)
|
||||||
|
|
||||||
|
virtualBoxShaSum=$(fileShaSum "$shaSums" "VirtualBox-$latestVersion.tar.bz2")
|
||||||
|
extpackShaSum=$(fileShaSum "$shaSums" "Oracle_VM_VirtualBox_Extension_Pack-$latestVersion.vbox-extpack")
|
||||||
|
guestAdditionsShaSum=$(fileShaSum "$shaSums" "*VBoxGuestAdditions_$latestVersion.iso")
|
||||||
|
|
||||||
|
virtualboxNixFile=$(nixFile ${attr})
|
||||||
|
extpackNixFile=$(nixFile ${attr}Extpack)
|
||||||
|
guestAdditionsNixFile=$(nixFile linuxPackages.${attr}GuestAdditions)
|
||||||
|
|
||||||
|
extpackOldShaSum=$(oldHash ${attr}Extpack)
|
||||||
|
guestAdditionsOldShaSum=$(oldHash linuxPackages.${attr}GuestAdditions.src)
|
||||||
|
|
||||||
|
update-source-version $attr $latestVersion $virtualBoxShaSum
|
||||||
|
sed -i -e 's|value = "'$extpackOldShaSum'"|value = "'$extpackShaSum'"|' $extpackNixFile
|
||||||
|
sed -i -e 's|sha256 = "'$guestAdditionsOldShaSum'"|sha256 = "'$guestAdditionsShaSum'"|' $guestAdditionsNixFile
|
||||||
|
|
||||||
|
git add $virtualboxNixFile $extpackNixFile $guestAdditionsNixFile
|
||||||
|
git commit -m "$attr: ${oldVersion} -> ${latestVersion}"
|
||||||
|
else
|
||||||
|
echo "$attr is already up-to-date"
|
||||||
|
fi
|
Loading…
x
Reference in New Issue
Block a user