Move tar_fix from Python to Only Bash
This commit is contained in:
parent
d199f5a255
commit
6f292fc47a
14
README.md
14
README.md
@ -10,16 +10,14 @@ Hyperbola Docker images.
|
|||||||
Usage
|
Usage
|
||||||
======
|
======
|
||||||
|
|
||||||
- `git clone` this repository.
|
- `git clone` this repository and move to directory where you have cloned it.
|
||||||
|
|
||||||
- `cd` to a directory where you have cloned it.
|
- Generate bootstrap image with [hyperbola-bootstrap](https://git.sr.ht/~heckyel/hyperbola-bootstrap) or download file from [archive.fridu.us](https://archive.fridu.us/hyperbola/iso/)
|
||||||
|
|
||||||
- Generate bootstrap image with [hyperbola-bootstrap](https://git.sr.ht/~heckyel/hyperbola-bootstrap)
|
|
||||||
|
|
||||||
- Converter hyperbola-bootstrap to bootstrap image valid for docker
|
- Converter hyperbola-bootstrap to bootstrap image valid for docker
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ python3 tar_fix.py --input=hyperbola-bootstrap.tar.gz --output=bootstrap.tar.gz
|
$ bash tar_fix.sh --input=hyperbola-bootstrap.tar.gz --output=bootstrap.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
- Make sure you have my `Dockerfile`, `.dockerignore` and the `bootstrap.tar.gz` in one directory.
|
- Make sure you have my `Dockerfile`, `.dockerignore` and the `bootstrap.tar.gz` in one directory.
|
||||||
@ -30,12 +28,6 @@ Usage
|
|||||||
$ docker build --tag hyperbola:0.4 -f Dockerfile-Hyperbola-v04 .
|
$ docker build --tag hyperbola:0.4 -f Dockerfile-Hyperbola-v04 .
|
||||||
```
|
```
|
||||||
|
|
||||||
or for Hyperbola Milky Way v0.3
|
|
||||||
|
|
||||||
```console
|
|
||||||
$ docker build --tag hyperbola:0.3 -f Dockerfile-Hyperbola-v03 .
|
|
||||||
```
|
|
||||||
|
|
||||||
License
|
License
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
92
tar_fix.py
92
tar_fix.py
@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import tarfile
|
|
||||||
import os
|
|
||||||
|
|
||||||
|
|
||||||
class Tarball:
|
|
||||||
def __init__(self, infile, outfile):
|
|
||||||
self.infile = infile
|
|
||||||
self.outfile = outfile
|
|
||||||
|
|
||||||
def drop_lead_comp(self):
|
|
||||||
"""Removes leading path component (top-level dir)
|
|
||||||
from input tar file."""
|
|
||||||
with tarfile.open(self.infile) as tarin, tarfile.open(self.outfile, 'w:gz') as tarout:
|
|
||||||
|
|
||||||
# Identify common top-level dir for all tarball
|
|
||||||
# components, and proceed if it's set.
|
|
||||||
lead_comp_name = os.path.commonpath(tarin.getnames())
|
|
||||||
|
|
||||||
if lead_comp_name:
|
|
||||||
prefix_len = len(lead_comp_name + '/')
|
|
||||||
# Remove top-level dir (eg. "root.x86_64" or "root.i686"
|
|
||||||
# in Hyperbola bootstrap tarballs) from the archive.
|
|
||||||
tarin.members.remove(tarin.getmember(lead_comp_name))
|
|
||||||
|
|
||||||
for m in tarin.members:
|
|
||||||
# Drop top-level dir prefix in all tarball
|
|
||||||
# component's paths.
|
|
||||||
m.path = m.path[prefix_len:]
|
|
||||||
# If component is a link, don't fetch its content.
|
|
||||||
# There's no point to that, and it helps avoiding
|
|
||||||
# KeyError("linkname 'something' not found") on "broken"
|
|
||||||
# symlinks, which are perfectly normal in a
|
|
||||||
# root FS tarball. And for hard links, the link
|
|
||||||
# target needs to be stripped of the prefix same as
|
|
||||||
# the file name.
|
|
||||||
if m.linkname:
|
|
||||||
if m.islnk():
|
|
||||||
m.linkname = m.linkname[prefix_len:]
|
|
||||||
tarout.addfile(m)
|
|
||||||
else:
|
|
||||||
tarout.addfile(m, tarin.extractfile(m))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="Remove leading path component from input tarball contents and save "
|
|
||||||
"the result in output tarball.", add_help=False)
|
|
||||||
|
|
||||||
group = parser.add_argument_group("Arguments")
|
|
||||||
group.add_argument("--help", action='store_true',
|
|
||||||
help="Show this help message and exit.")
|
|
||||||
|
|
||||||
args = parser.parse_known_args()
|
|
||||||
|
|
||||||
group.add_argument("--input", metavar='PATH', dest='infile',
|
|
||||||
type=str, help="Input tar[.gz/xz/bz2] file path.",
|
|
||||||
required=True)
|
|
||||||
group.add_argument("--output", metavar='PATH', dest='outfile',
|
|
||||||
type=str, help="Output tar.gz file path.",
|
|
||||||
required=True)
|
|
||||||
|
|
||||||
if args[0].help:
|
|
||||||
parser.exit(parser.print_help())
|
|
||||||
else:
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
tarball = Tarball(args.infile, args.outfile)
|
|
||||||
tarball.drop_lead_comp()
|
|
||||||
|
|
||||||
# An error handling attempt I would like to remember. Note to self: it skips symlinks altogether.
|
|
||||||
#
|
|
||||||
# # Handle broken symlinks. They are perfectly normal in a root fs tarball, but tarfile module is not
|
|
||||||
# # prepared for that. Trying hard not to catch anything other than "linkname 'something' not found".
|
|
||||||
# try:
|
|
||||||
# # Write each modified component to output tarball.
|
|
||||||
# tarout.addfile(m, tarin.extractfile(m))
|
|
||||||
#
|
|
||||||
# except KeyError as error:
|
|
||||||
# if "linkname '" and "' not found" in str(error):
|
|
||||||
# print("Warning: the input tarball contains a dead symlink: '%s' to non-existent '%s'. No "
|
|
||||||
# "biggy, but you might want to know. It will be included in the output tarball as it "
|
|
||||||
# "is. Proceeding..." % (m.name, m.linkname), file=sys.stderr)
|
|
||||||
# else:
|
|
||||||
# raise
|
|
||||||
|
|
||||||
# And a compound list for all tar members:
|
|
||||||
#
|
|
||||||
# [m.path[prefix_len:] for m in tarin.members]
|
|
54
tar_fix.sh
Normal file
54
tar_fix.sh
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Uso: bash $0 --input=<archivo_entrada> --output=<archivo_salida>"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' 'Get the current directory path...' '\e[m'
|
||||||
|
current_dir=$(pwd)
|
||||||
|
|
||||||
|
# Check arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--input=*)
|
||||||
|
input_file="${1#*=}"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--output=*)
|
||||||
|
output_file="${1#*=}"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$input_file" ] || [ -z "$output_file" ]; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' 'Unzip the input file to a temporary directory...' '\e[m'
|
||||||
|
temp_dir=$(mktemp -d)
|
||||||
|
|
||||||
|
tar -xzvf "$input_file" -C "$temp_dir" || echo "Info: some tar failed, but the script will continue."
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' 'Rename files ending in .pacnew...' '\e[m'
|
||||||
|
find "$temp_dir" -type f -name "*.pacnew" -exec sh -c 'mv -f "$1" "${1%.pacnew}"' _ {} \;
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' 'Copy the contents of 'x86_64' to the root...' '\e[m'
|
||||||
|
rsync -a "$temp_dir/x86_64/" "$temp_dir/"
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' 'Delete the x86_64 directory using doas (requires privileges)...' '\e[m'
|
||||||
|
doas rm -rf "$temp_dir/x86_64"
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' "Make $output_file..." '\e[m'
|
||||||
|
(cd "$temp_dir" && tar -czvf "$current_dir/$output_file" *)
|
||||||
|
|
||||||
|
printf '%b%s%b%s%b\n' '\e[1;32m' '==> ' '\e[0m\033[1m' 'Clean the temporary directory using doas (requires privileges)...' '\e[m'
|
||||||
|
doas rm -rf "$temp_dir"
|
||||||
|
|
||||||
|
echo "The file $output_file has been successfully created! <3"
|
Loading…
x
Reference in New Issue
Block a user