From 9593ab95437f75c83b07944e1297e5e6877e04a9 Mon Sep 17 00:00:00 2001 From: Filippo Squillace Date: Sat, 18 Oct 2014 16:49:04 +0100 Subject: [PATCH] Add script juju and change the README file --- README.md | 36 ++++++++- bin/.juju.swp | Bin 0 -> 12288 bytes bin/arch-chroot | 198 ++++++++++++++++++++++++++++++++++++++++++++++++ bin/juju | 63 +++++++++++++++ 4 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 bin/.juju.swp create mode 100755 bin/arch-chroot create mode 100755 bin/juju diff --git a/README.md b/README.md index 2d4450d..902a6d0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ -juju +JuJu ==== +**JuJu**: the portable GNU/Linux distribution. + +Description +----------- +**JuJu** is a small and portable GNU/Linux distribution based on ArchLinux. + +JuJu can be used inside another GNU/Linx OS via chroot. It only contains the package manager (called pacman) in order to access to a wide range of packages from ArchLinux repositories. + +The main advantage of using JuJu is because you have an isolated environment in which you can install +packages without affecting a production system. Another advantage is that with JuJu +you can access to a really wide range of packages inside GNU/Linux systems that contains +limited repositories (such as CentOS and RedHat). + +Quickstart +---------- +After installing JuJu (See next section) just run the main juju script: +```bash +juju +``` +The first time you execute it, the script will download the JuJu image and place it +to the default directory ~/.juju. +You will need root privileges in order to acces to the chroot. + +Installation +------------ +Just clone JuJu somewhere (for example in ~/juju): + +```bash +git clone git://github.com/fsquillace/juju ~/juju +export PATH=~/juju/bin:$PATH +``` + +JuJu can only works on GNU/Linux OS with kernel version greater or equal +2.6.32 in 32 or 64 bit. diff --git a/bin/.juju.swp b/bin/.juju.swp new file mode 100644 index 0000000000000000000000000000000000000000..f0bb30527cf5f00611570316d00c500cc56130da GIT binary patch literal 12288 zcmeI2&u`mg7{}jETsAg9Z~}37>RDBSaGWfYHnqy=s)muQX-AZ9liE=^&YQ%ofARV? zSyyG_#+?&aCjNlkIPycBIDo_jxNu+sA#K`?3n#v|lQeW9zEU9lx*N$M5HP zY_-bUE?%uQ=v?6}!}bzmAAYpddgR_?53e%T<=jn9AGUeBmazMW^Q z&21T(+wpd6N)h`z*FEXd3pWl*Q=h& zfHI&ACdRRqd1kWk4BF29yD1Kp9X5 zlmTTx8Bhk40cGGBG+=cY`{FobKc2wN1$+($;62a)E8sFX3r>Q& zFEI8gaKIW^1tvHS{y4?h_uxBl4}1cAa0$E(-UQEqV_*g_@Zcn4-+-^dSKv!<7kmsl z;2Kx~b#NY>0KYxY*nRK=_zc_uL*Rl7;C1jCcoqDGx&8@$2lv6R;Aij?NIZNC)TRt5 z1ImChpbRJj%78NP{~Ev&(XC{$C|0F9jEER};+e;rDdI8?voU0!`^@Rm2F;SD=iG>l zi=@}r>+4(ZtTn26jc(wt$0Q7KyC0CjN!u)z%NwPI@;OgmOplA6#!i#II8R>Gqnu~? z9ZLpcH%|sdQp{6>N0HUzBm)YC<4e|!eOo$#PmbRWa{0Zf5L}3VL@7UoC<9CQPmWT0 z3Q=(9ftU(&(~(rl)Fmwt^j|G?9G;AuWB@^OdD_deq3Menl`hPkS)d_`GRu>`m!@y2 zwmLME)yRh37eOGWvbwK-Tsg_;R ERROR:" "$@"; } >&2 +msg() { out "==>" "$@"; } +msg2() { out " ->" "$@";} +die() { error "$@"; exit 1; } + +ignore_error() { + "$@" 2>/dev/null + return 0 +} + +in_array() { + local i + for i in "${@:2}"; do + [[ $1 = "$i" ]] && return + done +} + +track_mount() { + if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then + CHROOT_ACTIVE_MOUNTS=() + trap 'chroot_umount' EXIT + fi + + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} + +mount_conditionally() { + local cond=$1; shift + if eval "$cond"; then + track_mount "$@" + fi +} + +api_fs_mount() { + mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind && + track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && + track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && + ignore_error mount_conditionally "[[ -d '$1/sys/firmware/efi/efivars' ]]" \ + efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && + track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && + track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && + track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid +} + +chroot_umount() { + umount "${CHROOT_ACTIVE_MOUNTS[@]}" +} + +valid_number_of_base() { + local base=$1 len=${#2} i= + + for (( i = 0; i < len; i++ )); do + { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null + done + + return 0 +} + +mangle() { + local i= chr= out= + + unset {a..f} {A..F} + + for (( i = 0; i < ${#1}; i++ )); do + chr=${1:i:1} + case $chr in + [[:space:]\\]) + printf -v chr '%03o' "'$chr" + out+=\\ + ;; + esac + out+=$chr + done + + printf '%s' "$out" +} + +unmangle() { + local i= chr= out= len=$(( ${#1} - 4 )) + + unset {a..f} {A..F} + + for (( i = 0; i < len; i++ )); do + chr=${1:i:1} + case $chr in + \\) + if valid_number_of_base 8 "${1:i+1:3}" || + valid_number_of_base 16 "${1:i+1:3}"; then + printf -v chr '%b' "${1:i:4}" + (( i += 3 )) + fi + ;; + esac + out+=$chr + done + + printf '%s' "$out${1:i}" +} + +dm_name_for_devnode() { + read dm_name <"/sys/class/block/${1#/dev/}/dm/name" + if [[ $dm_name ]]; then + printf '/dev/mapper/%s' "$dm_name" + else + # don't leave the caller hanging, just print the original name + # along with the failure. + print '%s' "$1" + error 'Failed to resolve device mapper name for: %s' "$1" + fi +} + +fstype_is_pseudofs() { + (( pseudofs_types["$1"] )) +} + +fstype_has_fsck() { + (( fsck_types["$1"] )) +} + + +usage() { + cat <&2; } +function die(){ +# $@: msg (mandatory) - str: Message to print + error $@ + exit 1 +} +function error(){ +# $@: msg (mandatory) - str: Message to print + echoerr -e "\033[1;31m$@\033[0m" +} +function warn(){ +# $@: msg (mandatory) - str: Message to print + echoerr -e "\033[1;33m$@\033[0m" +} +function info(){ +# $@: msg (mandatory) - str: Message to print + echo -e "\033[1;37m$@\033[0m" +} + +if [ ! "$(ls -A $JUJU_HOME)" ] +then + setup_juju +fi + +run_juju + +