# ProteanOS architecture detection and feeds lists.
#
# Copyright (C) 2013, 2014 Patrick "P. J." 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
# .
use opkg
# TODO: This should be replaced with a prof_proteanos_validate_archplat()
# function that gets valid architectures and platforms from the package archive
# (which pro-archman needs to list in the distribution).
prof_proteanos_archplats='
amd64-linux-glibc dev
i686-linux-glibc dev
i686-linux-glibc ao751h
i686-linux-glibc dimension2400
i686-linux-glibc x60
'
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 | cut -d " " -f 1)
printf "enabled\n" >/etc/rc.policy
rm "${SCRIPT}"
}
'
prof_proteanos_normalize_suite()
{
local suite="${1}"
case "${suite}" in
*/*) printf '%s\n' "${suite}";;
*) printf 'dev/%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_select_mirror()
{
local rand=
local mirror=
rand=$(date '+%S')
rand=$(($rand % 2))
case ${rand} in
0)
mirror='http://mirror.gnu.dk/pub/proteanos'
;;
1)
mirror='http://mirror.oss.maxcdn.com/proteanos'
;;
esac
printf '%s\n' "${mirror}"
}
prof_proteanos_feeds()
{
local mirror="${1}"
local arch="${2}"
local plat="${3}"
local suite="${4}"
local a=
local p=
local s=
for a in "${arch}" 'all'; do
for p in "${plat}" 'all'; do
for s in 'base'; do
printf 'src proteanos_%s_%s_%s_%s_%s ' \
"${suite%/*}" "${suite#*/}" \
"${a}" "${p}" "${s}"
printf '%s/feeds/%s/%s/%s/%s/Packages\n' \
"${mirror}" "${suite}" \
"${a}" "${p}" "${s}"
done
done
done
for s in 'base'; do
printf 'src proteanos_%s_%s_%s_%s_%s ' \
"${suite%/*}" "${suite#*/}" \
'src' 'all' "${s}"
printf '%s/feeds/%s/%s/%s/%s/Packages\n' \
"${mirror}" "${suite}" \
'src' 'all' "${s}"
done
}
prof_proteanos_dep_fields()
{
printf 'Depends Pre-Depends'
}
prof_proteanos_include_pkg()
{
local name="${1}"
local value="${2}"
if [ "x${name}" = 'xessential' ]; then
if [ "x${value}" = 'xyes' ]; then
return 0
fi
elif [ "x${name}" = 'xpackage' ]; then
# TODO: Drop this code once:
# * At least one essential package depends on libc.6 on
# any-any-glibc architectures,
# * linux-image is marked "Essential: yes", and
# * Each config- source package builds a config-base
# binary package marked "Essential: yes" that depends on
# proteanos-branding.
case "${value}" in
libc.6|linux-image|proteanos-branding)
return 0
;;
esac
fi
return 1
}
prof_proteanos_get_fstab()
{
local arch="${1}"
local plat="${2}"
case "${arch}" in
*-linux-*)
printf '%s\n' "${prof_proteanos_fstab_linux}"
;;
esac
}
prof_proteanos_configure_system_native()
{
local root="${1}"
printf 'disabled\n' >"${root}/etc/rc.policy"
opkg_install_all "${root}"
printf 'enabled\n' >"${root}/etc/rc.policy"
[ -r /etc/resolv.conf ] && cp /etc/resolv.conf "${root}/etc"
[ -r /etc/hostname ] && cp /etc/hostname "${root}/etc"
[ -e "${root}/etc/passwd" ] || printf \
'root::0:0:root:/root:/bin/sh\n' >"${root}/etc/passwd"
}
prof_proteanos_configure_system_foreign()
{
local root="${1}"
printf '%s' "${prof_proteanos_install_service}" >"${root}/etc/rc.d/S10install"
chmod 0755 "${root}/etc/rc.d/S10install"
printf 'proteanos\n' >"${root}/etc/hostname"
[ -e "${root}/etc/passwd" ] || printf \
'root::0:0:root:/root:/bin/sh\n' >"${root}/etc/passwd"
}