-
Notifications
You must be signed in to change notification settings - Fork 0
/
repo.sh
executable file
·162 lines (136 loc) · 3.65 KB
/
repo.sh
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
151
152
153
154
155
156
157
158
159
160
161
#!/bin/bash
#Repository management script
#Author: Bernhard Kiesbauer <bernhard@kiesbauer.com>
function printUsage {
echo "Usage: $0 <distribution> <component> <command> [<packageFile> <packageFile> ... | <packageName>]"
echo -e "\tWhere <command> is of:"
echo -e "\t\t-r: Rebuild for all packages"
echo -e "\t\t-a: Add new package <packageFile>"
echo -e "\t\t-l: List all info about repo. When <packageName> is supplied: "
echo -e "\t\t List only version info about <packageName>"
}
if [ $# -lt 3 ]; then
printUsage $0
exit -1
fi
#Vars
company="mycomp"
reporoot=/srv/repo
arch=i386
secretkeyringlocation=/srv/repo/gpg/secring.gpg
dist=$1
component=$2
pkgsrc=$reporoot/$dist/$component
override=$pkgsrc/override
packagesDest=$reporoot/dists/$dist/$component/binary-$arch
#Retrieve field of control file from package
function getField {
echo `dpkg --info $1 | grep "$2" | awk '{print $2}'`
}
function addToOverride {
f=$1
override=$2
prio=`getField $f Priority`
section=`getField $f Section`
name=`getField $f Package`
#Write override file
echo -e "$name\t$prio\t$section" >> $override
}
#Recreate Packages.gz
function updatePackages {
pkgsrc=$1
override=$2
packagesDest=$3
mkdir -p $packagesDest
echo "Running scanpackages..."
#Info: reporoot needs to be stripped from pkgsrc because the client wont find the
#absolute path.
#The path specified for scanpackages must be accessible relative to the url of the
#repository in the clients sources.list.
apt-ftparchive packages ${pkgsrc/"$reporoot/"/} > $packagesDest/Packages
cat $packagesDest/Packages | gzip > $packagesDest/Packages.gz
}
#Rebuild the override file
function rebuildOverride {
override=$1
pkgsrc=$2
#We recreate the override file
rm -f $override
#Loop over all packages
debs=`find $pkgsrc -iname "*.deb"`
for f in $debs; do
addToOverride $f $override
done
}
function createContentsFile {
contentsSrc=$1
contentsDest=dists/$2
apt-ftparchive contents $contentsSrc | gzip > $contentsDest/Contents-$arch.gz
}
#Create the release file for pinning
function createReleaseFile {
packagesDest=$1
components=$2
dist=$3
arch=$4
release=dists/$dist/Release
echo "Origin: $company
Label: repo-server
Codename: $dist
Architectures: $arch
Components: $components
Version: 1.0" > $release
apt-ftparchive release dists/$dist >> $release
# for component in $components; do
# for file in `cd dists/$dist; find $component/binary-$arch/ -type f`; do
# fullpath=dists/$dist/$file
# md5=`md5sum $fullpath | awk '{print $1}'`
# size=`ls -all $fullpath | awk '{print $5}'`
# echo -e " $md5 $size $file" >> $release
# done
# done
releasesec="$release.gpg"
rm -f $releasesec
gpg --no-default-keyring --secret-keyring $secretkeyringlocation --output $releasesec -ba $release
}
case $3 in
"-r")
#Rebuild
#rebuildOverride $override $pkgsrc
updatePackages $pkgsrc $override $packagesDest
createContentsFile $pkgsrc $dist
createReleaseFile $packagesDest $component $dist $arch
;;
"-a")
#Add package
if [ $# -lt 4 ]; then
printUsage $0
exit -2
fi
while [ $# -ge 4 ]; do
newpkg=$4
pkgname=`echo $newpkg | awk -F/ '{print $NF}'`
firstLetter=`echo $pkgname | cut -b1`
mkdir $pkgsrc/$firstLetter/ 2>/dev/null
cp $newpkg $pkgsrc/$firstLetter/
addToOverride $newpkg $override
shift
done
updatePackages $pkgsrc $override $packagesDest
createReleaseFile $packagesDest $component $dist $arch
;;
"-l")
#List packages
case $# in
3)
zcat $packagesDest/Packages.gz
;;
4)
zcat $packagesDest/Packages.gz | grep "Package: $4" -A 1
;;
esac
;;
*)
printUsage
exit -3
esac