# ProteanOS architecture detection and feeds lists. # # Copyright (C) 2013-2016, 2021 Patrick McDermott # # This file is part of the ProteanOS Development Kit. # # The ProteanOS Development Kit is free software: you can redistribute # it and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # The ProteanOS Development Kit is distributed in the hope that it # will be useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the ProteanOS Development Kit. If not, see # . _PROF_PROTEANOS_FSTAB_LINUX="\ proc /proc proc defaults sys /sys sysfs defaults /dev /dev none bind devpts /dev/pts devpts noexec,nosuid,gid=5,mode=0620 " _PROF_PROTEANOS_INSTALL_SERVICE=\ '#!/bin/sh /etc/rc.common start() { log "Configuring packages" printf "disabled\n" >/etc/rc.policy opkg install $(opkg list-installed | busybox cut -d " " -f 1) printf "enabled\n" >/etc/rc.policy rm -f "${SCRIPT}" } ' _prof_proteanos_mirror= _prof_proteanos_suite= _prof_proteanos_platforms='' _prof_proteanos_platforms_platform='' _prof_proteanos_platforms_type='' _prof_proteanos_platforms_sections='' _prof_proteanos_platforms_field() { local name="${1}" local value="${2}" shift 2 case "${name}" in 'Platform') _prof_proteanos_platforms_platform="${value}" ;; 'Type') _prof_proteanos_platforms_type="${value}" ;; 'Sections') _prof_proteanos_platforms_sections="${value}" ;; esac } _prof_proteanos_platforms_paragraph() { local platform= local archplat= platform="${_prof_proteanos_platforms_platform}" archplat="$(printf '%s' "${platform}" | tr -c '[a-z0-9/]' '_')" eval "_prof_proteanos_archplat_arches_${archplat#*/}=$(: \ )\"\${_prof_proteanos_archplat_arches_${archplat#*/}-}$(: \ )\${platform%/*}\"" archplat="${archplat%/*}__${archplat#*/}" _prof_proteanos_platforms="${_prof_proteanos_platforms}${platform} " eval "_prof_proteanos_archplat_type_${archplat}=$(: \ )\"\${_prof_proteanos_platforms_type}\"" eval "_prof_proteanos_archplat_sections_${archplat}=$(: \ )\"\${_prof_proteanos_platforms_sections}\"" } prof_proteanos_detect_root() { local root="${1}" shift 1 if grep "^ID='proteanos'\$" "${root}/etc/os-release" >/dev/null 2>&1 then return 0 else return 1 fi } prof_proteanos_normalize_suite() { local suite="${1}" shift 1 case "${suite}" in '') printf 'rel/trunk\n';; */*) printf '%s\n' "${suite}";; *) printf 'rel/%s\n' "${suite}";; esac return 0 } prof_proteanos_detect_arch() { local uname_m= local uname_s= local arch= uname_m="$( (uname -m) 2>/dev/null)" || uname_m='unknown' uname_s="$( (uname -s) 2>/dev/null)" || uname_s='unknown' case "${uname_m}:${uname_s}" in 'x86_64:Linux') arch='amd64-linux-glibc' ;; 'i686:Linux') arch='i686-linux-glibc' ;; *) arch='' esac printf '%s\n' "${arch}" } prof_proteanos_default_plat() { printf 'dev\n' } prof_proteanos_plat_arches() { local plat="${1}" shift 1 plat="$(printf '%s' "${plat}" | tr -c '[a-z0-9]' '_')" eval "printf '%s\\n' \${_prof_proteanos_archplat_arches_${plat}}" } prof_proteanos_select_mirror() { local mirrors= local mirrors_count= local mirror_num= mirrors="$(${WGET} -q -O - -- \ 'http://files.proteanos.com/pub/proteanos-mirrors-http' \ 'ftp://files.proteanos.com/pub/proteanos-mirrors-ftp' )" mirrors_count=$(printf '%s\n' "${mirrors}" | wc -l) rand mirror_num=$((${rand_x} % ${mirrors_count} + 1)) printf '%s\n' "${mirrors}" | sed -n "${mirror_num}p" } prof_proteanos_prepare_install() { local mirror="${1}" local suite="${2}" shift 2 _prof_proteanos_mirror="${mirror}" _prof_proteanos_suite="${suite}" parse_control - _prof_proteanos_platforms_field \ _prof_proteanos_platforms_paragraph 0<<-EOF $(${WGET} -q -O - -- "${mirror}/feeds/${suite}/Platforms") EOF } prof_proteanos_installer_type() { local arch="${1}" local plat="${2}" shift 2 local arch_clean= local plat_clean= local archplat= local installer_type= arch_clean="$(printf '%s' "${arch}" | tr -c '[a-z0-9/]' '_')" plat_clean="$(printf '%s' "${plat}" | tr -c '[a-z0-9/]' '_')" archplat="${arch_clean}__${plat_clean}" eval "installer_type=\"\${_prof_proteanos_archplat_type_${archplat}}\"" printf '%s' "${installer_type}" } prof_proteanos_validate_archplat() { local arch="${1}" local plat="${2}" shift 2 local archplat= case " ${_prof_proteanos_platforms} " in *" ${arch}/${plat} "*) return 0 ;; esac return 1 } prof_proteanos_opkg_state_dir() { printf '/var/lib/opkg' return 0 } prof_proteanos_opkg_conf_file() { printf '/etc/opkg.conf' return 0 } prof_proteanos_feeds() { local arch="${1}" local plat="${2}" shift 2 local arch_clean= local plat_clean= local archplat= local sects= local manifest= local a= local p= local s= arch_clean="$(printf '%s' "${arch}" | tr -c '[a-z0-9/]' '_')" plat_clean="$(printf '%s' "${plat}" | tr -c '[a-z0-9/]' '_')" archplat="${arch_clean}__${plat_clean}" eval "sects=\"\${_prof_proteanos_archplat_sections_${archplat}}\"" manifest="$(${WGET} -q -O - -- "${_prof_proteanos_mirror}/feeds/$(: \ )${_prof_proteanos_suite}/Manifest")" for a in "${arch}" 'all'; do for p in "${plat}" 'all'; do for s in ${sects}; do case "${LF}${manifest}${LF}" in *"${LF}${a}/${p}/${s}${LF}"*) ;; *) continue;; esac printf 'src/gz proteanos_%s_%s_%s_%s_%s.gz ' \ "${_prof_proteanos_suite%/*}" \ "${_prof_proteanos_suite#*/}" \ "${a}" "${p}" "${s}" printf '%s/feeds/%s/%s/%s/%s\n' \ "${_prof_proteanos_mirror}" \ "${_prof_proteanos_suite}" \ "${a}" "${p}" "${s}" done done done for s in 'base' 'src'; do printf 'src/gz proteanos_%s_%s_%s_%s_%s.gz ' \ "${_prof_proteanos_suite%/*}" \ "${_prof_proteanos_suite#*/}" \ 'src' 'all' "${s}" printf '%s/feeds/%s/%s/%s/%s\n' \ "${_prof_proteanos_mirror}" \ "${_prof_proteanos_suite}" \ 'src' 'all' "${s}" done } prof_proteanos_get_cert_url() { printf '%s/archive.cert' "${_prof_proteanos_mirror}" return 0 } prof_proteanos_get_root_key() { cat <<-EOF untrusted comment: ProteanOS archive root key RWSG2r6ZwINj8pcScRd4nc9HVZ9zjP5oajMPfTm+dIk67btIsCZaf3SN EOF } prof_proteanos_dep_fields() { printf 'Depends Pre-Depends' } prof_proteanos_include_pkg() { local name="${1}" local value="${2}" shift 2 if [ "x${name}" = 'xpackage' ]; then case "${value}" in 'base-files' | 'config-base') return 0;; esac fi return 1 } prof_proteanos_get_fstab() { local arch="${1}" local plat="${2}" shift 2 case "${arch}" in *-linux-*) printf '%s\n' "${_PROF_PROTEANOS_FSTAB_LINUX}" ;; esac } prof_proteanos_file_systems_mounted() { local root="${1}" local arch="${2}" local plat="${3}" shift 3 [ -e "${root}/dev/null" ] } prof_proteanos_bind_mount() { local arch="${1}" local plat="${2}" local olddir="${3}" local newdir="${4}" shift 4 case "${arch}" in *-linux-*) mount -o bind -- "${olddir}" "${newdir}" ;; esac } prof_proteanos_bind_umount() { local arch="${1}" local plat="${2}" local olddir="${3}" local newdir="${4}" shift 4 case "${arch}" in *-linux-*) umount -- "${newdir}" ;; esac } prof_proteanos_configure_system_native() { local root="${1}" local arch="${2}" local plat="${3}" shift 3 printf 'disabled\n' >"${root}/etc/rc.policy" opkg_install_all "${root}" if [ "x${plat}" = 'xdev' ]; then [ -r /etc/resolv.conf ] && cp -- /etc/resolv.conf "${root}/etc" [ -r /etc/hostname ] && cp -- /etc/hostname "${root}/etc" else printf 'enabled\n' >"${root}/etc/rc.policy" printf 'proteanos\n' >"${root}/etc/hostname" fi [ -e "${root}/etc/passwd" ] || printf \ 'root::0:0:root:/root:/bin/sh\n' >"${root}/etc/passwd" [ -e "${root}/etc/group" ] || printf \ 'root:x:0:\n' >"${root}/etc/group" } prof_proteanos_configure_system_foreign() { local root="${1}" local arch="${2}" local plat="${3}" shift 3 printf '%s' "${_PROF_PROTEANOS_INSTALL_SERVICE}" \ >"${root}/etc/rc.d/S00install" chmod -- 0755 "${root}/etc/rc.d/S00install" printf 'proteanos\n' >"${root}/etc/hostname" [ -e "${root}/etc/passwd" ] || printf \ 'root::0:0:root:/root:/bin/sh\n' >"${root}/etc/passwd" [ -e "${root}/etc/group" ] || printf \ 'root:x:0:\n' >"${root}/etc/group" } prof_proteanos_find_kernel() { local root="${1}" local arch="${2}" local plat="${3}" shift 3 local kernel= case "${arch}" in *-linux-*) for kernel in vmlinuz; do if [ -e "${root}/boot/${kernel}" ]; then printf '%s' "/boot/${kernel}" return 0 fi done ;; esac return 1 } prof_proteanos_make_initramfs() { local arch="${1}" local plat="${2}" shift 2 local init_created= case "${arch}" in amd64-linux-* | i686-linux-*) if ! [ -e init ]; then ln -s /sbin/init init init_created=true else init_created=false fi find . -xdev -a \! -path './boot/*' -a \ \! -path './prokit/*' | \ ${CPIO} -o -H newc | \ ${XZ} -c --check=crc32 --x86 --lzma2 \ 1>boot/initrd.img if ${init_created}; then rm -f init fi ;; esac # Hack to rerun install-lilo: session_begin . . true session_exec run-parts /etc/kernel/postinst.d session_end find . -xdev -a \! -path './boot/*' -a \ \! -path './prokit/*' -a \! -type d | \ xargs rm -f find . -xdev -depth -type d -a \! -name '.' \ -a \! -name 'boot' -a \! -path './boot/*' \ -a \! -name 'prokit' -a \! -path './prokit/*' \ | xargs rmdir return 0 } prof_proteanos_register() { register_profile 'proteanos' } __init prof_proteanos_register