1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
#!/bin/bash
# taken from the quickinst script. cd/net code merged together
target_write_pacman_conf ()
{
PKGFILE=/tmp/packages.txt
echo "[core]" >/tmp/pacman.conf
if [ "$var_PKG_SOURCE_TYPE" = "net" ]
then
wget $PKG_SOURCE/packages.txt -O /tmp/packages.txt || die_error " Could not fetch package list from server"
echo "Server = $PKGARG" >>/tmp/pacman.conf
fi
if [ "$var_PKG_SOURCE_TYPE" = "cd" ]
then
[ -f $PKG_SOURCE/packages.txt ] || die_error "error: Could not find package list: $PKGFILE"
cp $PKG_SOURCE/packages.txt /tmp/packages.txt
echo "Server = file://$PKGARG" >>/tmp/pacman.conf
fi
mkdir -p $var_TARGET_DIR/var/cache/pacman/pkg /var/cache/pacman &>/dev/null
rm -f /var/cache/pacman/pkg &>/dev/null
[ "$var_PKG_SOURCE_TYPE" = "net" ] && ln -sf $var_TARGET_DIR/var/cache/pacman/pkg /var/cache/pacman/pkg &>/dev/null
[ "$var_PKG_SOURCE_TYPE" = "cd" ] && ln -sf $PKGARG /var/cache/pacman/pkg &>/dev/null
}
# target_prepare_pacman() taken from setup. modified a bit
# configures pacman and syncs for the first time on destination system
#
# $@ repositories to enable (optional. default: core)
# returns: 1 on error
target_prepare_pacman() {
[ "$var_PKG_SOURCE_TYPE" = "cd" ] && local serverurl="${var_FILE_URL}"
[ "$var_PKG_SOURCE_TYPE" = "net" ] && local serverurl="${var_SYNC_URL}"
[ -z "$1" ] && repos="libre core"
[ -n "$1" ] && repos="$@"
# Setup a pacman.conf in /tmp
cat << EOF > /tmp/pacman.conf
[options]
CacheDir = ${var_TARGET_DIR}/var/cache/pacman/pkg
CacheDir = /src/core/pkg
Architecture = auto
EOF
for repo in $repos
do
#TODO: this is a VERY, VERY dirty hack. we fall back to net for any non-core repo because we only have core on the CD. also user maybe didn't pick a mirror yet
if [ "$repo" != core ] && [ "$repo" != libre ]
then
add_pacman_repo target ${repo} "Include = $var_MIRRORLIST" || return 1
else
# replace literal '$repo' in the serverurl string by "$repo" where $repo is our variable.
add_pacman_repo target ${repo} "Server = ${serverurl/\$repo/$repo}" || return 1
fi
done
# Set up the necessary directories for pacman use
for dir in var/cache/pacman/pkg var/lib/pacman
do
if [ ! -d "${var_TARGET_DIR}/$dir" ]
then
mkdir -m 755 -p "${var_TARGET_DIR}/$dir" || return 1
fi
done
inform "Refreshing package database..."
$PACMAN_TARGET -Sy >$LOG 2>&1 || return 1
return 0
}
# $1 target/runtime
list_pacman_repos ()
{
[ "$1" != runtime -a "$1" != target ] && die_error "list_pacman_repos needs target/runtime argument"
[ "$1" = target ] && conf=/tmp/pacman.conf
[ "$1" = runtime ] && conf=/etc/pacman.conf
grep '\[.*\]' $conf | grep -v options | grep -v '^#' | sed 's/\[//g' | sed 's/\]//g'
}
# $1 target/runtime
# $2 repo name
# $3 string
add_pacman_repo ()
{
[ "$1" != runtime -a "$1" != target ] && die_error "add_pacman_repo needs target/runtime argument"
[ -z "$3" ] && die_error "target_add_repo needs \$2 repo-name and \$3 string (eg Server = ...)"
[ "$1" = target ] && conf=/tmp/pacman.conf
[ "$1" = runtime ] && conf=/etc/pacman.conf
cat << EOF >> $conf
[${2}]
${3}
EOF
}
# not sorted
list_package_groups ()
{
echo -e "base\nbase-devel"
}
# List the packages in one or more repos or groups. output is one or more lines, each line being like this:
# <repo/group name> packagename [version, if $1=repo]
# lines are sorted by packagename
# $action repo or group
# $@ one or more repo or group names
list_packages ()
{
action=$1; shift
[ "$action" = repo -o "$action" = group ] || die_error "list_packages \$action must be repo or group. not $action!"
[ "$action" = repo ] && $PACMAN_TARGET -Sql $@
[ "$action" = group ] && $PACMAN_TARGET -Sqg $@
}
# find out the group to which one or more packages belong
# arguments: packages
# output format: multiple lines, each line like:
# <pkgname> <group>
# order is the same as the input
which_group ()
{
PACKAGE_GROUPS=`LANG=C $PACMAN_TARGET -Si "$@" | awk '/^Name/{ printf("%s ",$3) } /^Group/{ print $3 }'`
}
# get group and packagedesc for packages
# arguments: packages
# output format: multiple lines, each line like:
# <pkgname> <version> <group> <desc>
# order is the same as the input
# note that space is used as separator, but desc is the only thing that will contain spaces.
pkginfo ()
{
PACKAGE_INFO=`LANG=C $PACMAN_TARGET -Si "$@" | awk '/^Name/{ printf("%s ",$3) } /^Version/{ printf("%s ",$3) } /^Group/{ printf("%s", $3) } /^Description/{ for(i=3;i<=NF;++i) printf(" %s",$i); printf ("\n")}'`
}
target_configure_mirrorlist () {
# add installer-selected mirror to the top of the mirrorlist, unless it's already at the top. previously added mirrors are kept (a bit lower), you never know..
if [ "$var_PKG_SOURCE_TYPE" = "net" -a -n "${var_SYNC_URL}" ]; then
if ! grep "^Server =" -m 1 "${var_TARGET_DIR}/$var_MIRRORLIST" | grep "${var_SYNC_URL}"
then
debug 'PACMAN PROCEDURE' "Adding choosen mirror (${var_SYNC_URL}) to ${var_TARGET_DIR}/$var_MIRRORLIST"
mirrorlist=`awk "BEGIN { printf(\"# Mirror used during installation\nServer = "${var_SYNC_URL}"\n\n\") } 1 " "${var_TARGET_DIR}/$var_MIRRORLIST"` || return $?
echo "$mirrorlist" > "${var_TARGET_DIR}/$var_MIRRORLIST" || return $?
fi
fi
return 0
}
|