From b9c230aa292d218765e752517e7ea4d3a74bd8b5 Mon Sep 17 00:00:00 2001 From: rhatto Date: Fri, 6 Mar 2009 02:11:03 +0000 Subject: simplepkg 0.6rc1 git-svn-id: svn+slack://slack.fluxo.info/var/svn/simplepkg@799 04377dda-e619-0410-9926-eae83683ac58 --- tags/0.6rc1/Makefile | 76 + tags/0.6rc1/README | 2 + tags/0.6rc1/conf/repos.conf | 40 + tags/0.6rc1/conf/simplepkg.conf | 265 +++ tags/0.6rc1/doc/CHANGELOG | 769 ++++++++ tags/0.6rc1/doc/COPYING | 340 ++++ tags/0.6rc1/doc/TODO | 5 + tags/0.6rc1/doc/mkbuild-pt_BR.tex | 854 +++++++++ tags/0.6rc1/doc/simplaret-en.tex | 312 ++++ tags/0.6rc1/doc/simplaret-pt_BR.tex | 376 ++++ tags/0.6rc1/doc/simplepkg-en.tex | 390 ++++ tags/0.6rc1/doc/simplepkg-pt_BR.tex | 397 ++++ tags/0.6rc1/install/slack-desc | 19 + tags/0.6rc1/lib/common.sh | 1870 +++++++++++++++++++ tags/0.6rc1/mkbuild/generic.mkSlackBuild | 527 ++++++ tags/0.6rc1/mkbuild/kde4.mkSlackBuild | 521 ++++++ tags/0.6rc1/mkbuild/model.mkbuild | 185 ++ tags/0.6rc1/mkbuild/perl.mkSlackBuild | 444 +++++ tags/0.6rc1/mkbuild/sample-Pyrex-large.mkbuild | 176 ++ tags/0.6rc1/mkbuild/sample-Pyrex-small.mkbuild | 65 + tags/0.6rc1/src/createpkg | 1070 +++++++++++ tags/0.6rc1/src/jail-commit | 175 ++ tags/0.6rc1/src/jail-update | 62 + tags/0.6rc1/src/lspkg | 143 ++ tags/0.6rc1/src/mkbuild | 1902 ++++++++++++++++++++ tags/0.6rc1/src/mkjail | 115 ++ tags/0.6rc1/src/mkpatch | 144 ++ tags/0.6rc1/src/rebuildpkg | 87 + tags/0.6rc1/src/simplaret | 1185 ++++++++++++ tags/0.6rc1/src/simpletrack | 66 + tags/0.6rc1/src/templatepkg | 987 ++++++++++ .../openoffice/files/etc/profile.d/lang.csh | 33 + .../openoffice/files/etc/profile.d/lang.sh | 33 + .../templates/openoffice/files/opt/OpenOffice.org | 1 + tags/0.6rc1/templates/openoffice/packages | 60 + tags/0.6rc1/templates/openoffice/perms | 0 .../templates/openoffice/scripts/post-install.sh | 22 + tags/0.6rc1/templates/slackware-12.1/packages | 947 ++++++++++ tags/0.6rc1/templates/slackware-12.2/packages | 970 ++++++++++ tags/0.6rc1/templates/slamd64-11.0/packages | 627 +++++++ .../templates/slamd64-11.0/scripts/post-install.sh | 5 + tags/0.6rc1/templates/slamd64-12.0/packages | 910 ++++++++++ .../templates/slamd64-12.0/scripts/post-install.sh | 5 + tags/0.6rc1/templates/slamd64-12.1/packages | 844 +++++++++ tags/0.6rc1/templates/slamd64-12.1/perms | 0 .../templates/slamd64-12.1/scripts/post-install.sh | 5 + .../vserver-legacy/files/etc/apache/httpd.conf | 1046 +++++++++++ .../vserver-legacy/files/etc/apache/php.ini | 1122 ++++++++++++ .../vserver-legacy/files/etc/apache/vhosts | 0 .../templates/vserver-legacy/files/etc/hosts | 21 + .../vserver-legacy/files/etc/logrotate.d/apache | 11 + .../templates/vserver-legacy/files/etc/profile | 87 + .../templates/vserver-legacy/files/etc/rc.d/rc.0 | 110 ++ .../templates/vserver-legacy/files/etc/rc.d/rc.4 | 256 +++ .../templates/vserver-legacy/files/etc/rc.d/rc.6 | 110 ++ .../templates/vserver-legacy/files/etc/rc.d/rc.K | 88 + .../templates/vserver-legacy/files/etc/rc.d/rc.M | 256 +++ .../templates/vserver-legacy/files/etc/rc.d/rc.S | 294 +++ .../vserver-legacy/files/etc/rc.d/rc.httpd | 21 + .../vserver-legacy/files/etc/rc.d/rc.inet2 | 129 ++ .../vserver-legacy/files/etc/rc.d/rc.inetd | 36 + .../vserver-legacy/files/etc/rc.d/rc.ip_forward | 64 + .../vserver-legacy/files/etc/rc.d/rc.local | 5 + .../vserver-legacy/files/etc/rc.d/rc.mysqld | 80 + .../vserver-legacy/files/etc/rc.d/rc.postfix | 45 + .../vserver-legacy/files/etc/rc.d/rc.sendmail | 38 + .../vserver-legacy/files/etc/rc.d/rc.serial | 132 ++ .../vserver-legacy/files/etc/rc.d/rc.sshd | 50 + .../vserver-legacy/files/etc/rc.d/rc.syslog | 42 + .../vserver-legacy/files/etc/rc.d/rc.sysvinit | 58 + .../templates/vserver-legacy/files/etc/rssh.conf | 48 + .../vserver-legacy/files/etc/ssh/sshd_config | 103 ++ .../files/var/www/htdocs/missing.html | 12 + .../vserver-legacy/files/var/www/missing.html | 12 + tags/0.6rc1/templates/vserver-legacy/packages | 251 +++ tags/0.6rc1/templates/vserver-legacy/perms | 36 + .../templates/vserver-legacy/scripts/GPG-KEY | 88 + .../vserver-legacy/scripts/devices.tar.gz | Bin 0 -> 322 bytes .../templates/vserver-legacy/scripts/skel.conf | 70 + .../vserver-legacy/scripts/vserver-legacy.sh | 49 + .../templates/vserver/files/etc/apache/httpd.conf | 1046 +++++++++++ .../templates/vserver/files/etc/apache/php.ini | 1122 ++++++++++++ .../templates/vserver/files/etc/apache/vhosts | 0 tags/0.6rc1/templates/vserver/files/etc/hosts | 21 + .../templates/vserver/files/etc/logrotate.d/apache | 11 + tags/0.6rc1/templates/vserver/files/etc/profile | 87 + tags/0.6rc1/templates/vserver/files/etc/rc.d/rc | 11 + tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.0 | 110 ++ tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.4 | 256 +++ tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.6 | 110 ++ tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.K | 88 + tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.M | 256 +++ tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.S | 294 +++ .../templates/vserver/files/etc/rc.d/rc.httpd | 21 + .../templates/vserver/files/etc/rc.d/rc.inet2 | 129 ++ .../templates/vserver/files/etc/rc.d/rc.inetd | 36 + .../templates/vserver/files/etc/rc.d/rc.ip_forward | 64 + .../templates/vserver/files/etc/rc.d/rc.local | 5 + .../templates/vserver/files/etc/rc.d/rc.mysqld | 80 + .../templates/vserver/files/etc/rc.d/rc.postfix | 45 + .../templates/vserver/files/etc/rc.d/rc.sendmail | 38 + .../templates/vserver/files/etc/rc.d/rc.serial | 132 ++ .../templates/vserver/files/etc/rc.d/rc.sshd | 50 + .../templates/vserver/files/etc/rc.d/rc.syslog | 42 + .../templates/vserver/files/etc/rc.d/rc.sysvinit | 58 + tags/0.6rc1/templates/vserver/files/etc/rssh.conf | 48 + .../templates/vserver/files/etc/ssh/sshd_config | 103 ++ .../vserver/files/var/www/htdocs/missing.html | 12 + .../templates/vserver/files/var/www/missing.html | 12 + tags/0.6rc1/templates/vserver/packages | 250 +++ tags/0.6rc1/templates/vserver/perms | 37 + tags/0.6rc1/templates/vserver/scripts/GPG-KEY | 88 + .../templates/vserver/scripts/devices.tar.gz | Bin 0 -> 320 bytes tags/0.6rc1/templates/vserver/scripts/vserver.sh | 55 + tags/0.6rc1/utils/README | 2 + tags/0.6rc1/utils/add-gpl | 33 + tags/0.6rc1/utils/add-slack-required | 63 + tags/0.6rc1/utils/convert-template-scheme | 35 + tags/0.6rc1/utils/enable-mkbuild-section | 40 + tags/0.6rc1/utils/merge-template | 37 + tags/0.6rc1/utils/metapkg | 72 + tags/0.6rc1/utils/repos | 87 + tags/0.6rc1/utils/searchpkg | 36 + tags/0.6rc1/utils/slackbuild-versions | 30 + 124 files changed, 27953 insertions(+) create mode 100644 tags/0.6rc1/Makefile create mode 100644 tags/0.6rc1/README create mode 100644 tags/0.6rc1/conf/repos.conf create mode 100644 tags/0.6rc1/conf/simplepkg.conf create mode 100644 tags/0.6rc1/doc/CHANGELOG create mode 100644 tags/0.6rc1/doc/COPYING create mode 100644 tags/0.6rc1/doc/TODO create mode 100644 tags/0.6rc1/doc/mkbuild-pt_BR.tex create mode 100644 tags/0.6rc1/doc/simplaret-en.tex create mode 100644 tags/0.6rc1/doc/simplaret-pt_BR.tex create mode 100644 tags/0.6rc1/doc/simplepkg-en.tex create mode 100644 tags/0.6rc1/doc/simplepkg-pt_BR.tex create mode 100644 tags/0.6rc1/install/slack-desc create mode 100644 tags/0.6rc1/lib/common.sh create mode 100644 tags/0.6rc1/mkbuild/generic.mkSlackBuild create mode 100644 tags/0.6rc1/mkbuild/kde4.mkSlackBuild create mode 100644 tags/0.6rc1/mkbuild/model.mkbuild create mode 100644 tags/0.6rc1/mkbuild/perl.mkSlackBuild create mode 100644 tags/0.6rc1/mkbuild/sample-Pyrex-large.mkbuild create mode 100644 tags/0.6rc1/mkbuild/sample-Pyrex-small.mkbuild create mode 100644 tags/0.6rc1/src/createpkg create mode 100755 tags/0.6rc1/src/jail-commit create mode 100755 tags/0.6rc1/src/jail-update create mode 100755 tags/0.6rc1/src/lspkg create mode 100755 tags/0.6rc1/src/mkbuild create mode 100755 tags/0.6rc1/src/mkjail create mode 100644 tags/0.6rc1/src/mkpatch create mode 100755 tags/0.6rc1/src/rebuildpkg create mode 100755 tags/0.6rc1/src/simplaret create mode 100755 tags/0.6rc1/src/simpletrack create mode 100755 tags/0.6rc1/src/templatepkg create mode 100755 tags/0.6rc1/templates/openoffice/files/etc/profile.d/lang.csh create mode 100755 tags/0.6rc1/templates/openoffice/files/etc/profile.d/lang.sh create mode 120000 tags/0.6rc1/templates/openoffice/files/opt/OpenOffice.org create mode 100644 tags/0.6rc1/templates/openoffice/packages create mode 100644 tags/0.6rc1/templates/openoffice/perms create mode 100755 tags/0.6rc1/templates/openoffice/scripts/post-install.sh create mode 100644 tags/0.6rc1/templates/slackware-12.1/packages create mode 100644 tags/0.6rc1/templates/slackware-12.2/packages create mode 100644 tags/0.6rc1/templates/slamd64-11.0/packages create mode 100755 tags/0.6rc1/templates/slamd64-11.0/scripts/post-install.sh create mode 100644 tags/0.6rc1/templates/slamd64-12.0/packages create mode 100755 tags/0.6rc1/templates/slamd64-12.0/scripts/post-install.sh create mode 100644 tags/0.6rc1/templates/slamd64-12.1/packages create mode 100644 tags/0.6rc1/templates/slamd64-12.1/perms create mode 100755 tags/0.6rc1/templates/slamd64-12.1/scripts/post-install.sh create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/apache/httpd.conf create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/apache/php.ini create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/apache/vhosts create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/hosts create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/logrotate.d/apache create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/profile create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.0 create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.4 create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.6 create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.K create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.M create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.S create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.httpd create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.inet2 create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.inetd create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.ip_forward create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.local create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.mysqld create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.postfix create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.sendmail create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.serial create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.sshd create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.syslog create mode 100755 tags/0.6rc1/templates/vserver-legacy/files/etc/rc.d/rc.sysvinit create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/rssh.conf create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/etc/ssh/sshd_config create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/var/www/htdocs/missing.html create mode 100644 tags/0.6rc1/templates/vserver-legacy/files/var/www/missing.html create mode 100644 tags/0.6rc1/templates/vserver-legacy/packages create mode 100644 tags/0.6rc1/templates/vserver-legacy/perms create mode 100644 tags/0.6rc1/templates/vserver-legacy/scripts/GPG-KEY create mode 100644 tags/0.6rc1/templates/vserver-legacy/scripts/devices.tar.gz create mode 100644 tags/0.6rc1/templates/vserver-legacy/scripts/skel.conf create mode 100644 tags/0.6rc1/templates/vserver-legacy/scripts/vserver-legacy.sh create mode 100644 tags/0.6rc1/templates/vserver/files/etc/apache/httpd.conf create mode 100644 tags/0.6rc1/templates/vserver/files/etc/apache/php.ini create mode 100644 tags/0.6rc1/templates/vserver/files/etc/apache/vhosts create mode 100644 tags/0.6rc1/templates/vserver/files/etc/hosts create mode 100644 tags/0.6rc1/templates/vserver/files/etc/logrotate.d/apache create mode 100644 tags/0.6rc1/templates/vserver/files/etc/profile create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.0 create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.4 create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.6 create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.K create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.M create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.S create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.httpd create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.inet2 create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.inetd create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.ip_forward create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.local create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.mysqld create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.postfix create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.sendmail create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.serial create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.sshd create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.syslog create mode 100755 tags/0.6rc1/templates/vserver/files/etc/rc.d/rc.sysvinit create mode 100644 tags/0.6rc1/templates/vserver/files/etc/rssh.conf create mode 100644 tags/0.6rc1/templates/vserver/files/etc/ssh/sshd_config create mode 100644 tags/0.6rc1/templates/vserver/files/var/www/htdocs/missing.html create mode 100644 tags/0.6rc1/templates/vserver/files/var/www/missing.html create mode 100644 tags/0.6rc1/templates/vserver/packages create mode 100644 tags/0.6rc1/templates/vserver/perms create mode 100644 tags/0.6rc1/templates/vserver/scripts/GPG-KEY create mode 100644 tags/0.6rc1/templates/vserver/scripts/devices.tar.gz create mode 100644 tags/0.6rc1/templates/vserver/scripts/vserver.sh create mode 100644 tags/0.6rc1/utils/README create mode 100755 tags/0.6rc1/utils/add-gpl create mode 100755 tags/0.6rc1/utils/add-slack-required create mode 100755 tags/0.6rc1/utils/convert-template-scheme create mode 100755 tags/0.6rc1/utils/enable-mkbuild-section create mode 100755 tags/0.6rc1/utils/merge-template create mode 100755 tags/0.6rc1/utils/metapkg create mode 100755 tags/0.6rc1/utils/repos create mode 100755 tags/0.6rc1/utils/searchpkg create mode 100755 tags/0.6rc1/utils/slackbuild-versions diff --git a/tags/0.6rc1/Makefile b/tags/0.6rc1/Makefile new file mode 100644 index 0000000..3f67e3a --- /dev/null +++ b/tags/0.6rc1/Makefile @@ -0,0 +1,76 @@ +# +# Simplepkg Makefile by Silvio Rhatto (rhatto at riseup.net). +# +# This Makefile 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 2 of the License, or any later version. +# +# This Makefile 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +PACKAGE = simplepkg +VERSION = 0.6rc1 +BUILD = 1rha +PREFIX = /usr +INSTALL = /usr/bin/install + +clean: + find . -name *~ | xargs rm -f # clean local backups + +install_lib: + $(INSTALL) -D --mode=0644 lib/common.sh $(DESTDIR)/$(PREFIX)/libexec/$(PACKAGE)/common.sh + +install_bin: + $(INSTALL) -D --mode=0755 src/simplaret $(DESTDIR)/$(PREFIX)/bin/simplaret + $(INSTALL) -D --mode=0755 src/lspkg $(DESTDIR)/$(PREFIX)/bin/lspkg + $(INSTALL) -D --mode=0755 src/mkbuild $(DESTDIR)/$(PREFIX)/bin/mkbuild + $(INSTALL) -D --mode=0755 src/mkpatch $(DESTDIR)/$(PREFIX)/bin/mkpatch + +install_sbin: + $(INSTALL) -D --mode=0755 src/mkjail $(DESTDIR)/$(PREFIX)/sbin/mkjail + $(INSTALL) -D --mode=0755 src/templatepkg $(DESTDIR)/$(PREFIX)/sbin/templatepkg + $(INSTALL) -D --mode=0755 src/jail-update $(DESTDIR)/$(PREFIX)/sbin/jail-update + $(INSTALL) -D --mode=0755 src/jail-commit $(DESTDIR)/$(PREFIX)/sbin/jail-commit + $(INSTALL) -D --mode=0755 src/rebuildpkg $(DESTDIR)/$(PREFIX)/sbin/rebuildpkg + $(INSTALL) -D --mode=0755 src/createpkg $(DESTDIR)/$(PREFIX)/sbin/createpkg + $(INSTALL) -D --mode=0755 src/simpletrack $(DESTDIR)/$(PREFIX)/sbin/simpletrack + @cd $(DESTDIR)/usr/sbin && ln -sf jail-upgrade vserver-upgrade + +install_doc: + $(INSTALL) -D --mode=0644 doc/COPYING $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/COPYING + $(INSTALL) -D --mode=0644 doc/TODO $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/TODO + $(INSTALL) -D --mode=0644 doc/CHANGELOG $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/CHANGELOG + #$(INSTALL) -D --mode=0644 doc/README $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/README + #$(INSTALL) -D --mode=0644 doc/README.pt_BR $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/README.pt_BR + #$(INSTALL) -D --mode=0644 doc/README.simplaret $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/README.simplaret + #$(INSTALL) -D --mode=0644 doc/README.simplaret.pt_BR $(DESTDIR)/$(PREFIX)/doc/$(PACKAGE)-$(VERSION)/README.simplaret.pt_BR + +install_config: + $(INSTALL) -D --mode=0644 conf/$(PACKAGE).conf $(DESTDIR)/etc/$(PACKAGE)/defaults/$(PACKAGE).conf + $(INSTALL) -D --mode=0644 conf/repos.conf $(DESTDIR)/etc/$(PACKAGE)/defaults/repos.conf + @mkdir -p $(DESTDIR)/etc/$(PACKAGE)/defaults/mkbuild/ + @cp mkbuild/* $(DESTDIR)/etc/$(PACKAGE)/defaults/mkbuild/ + +install_defaults: + @mkdir -p $(DESTDIR)/etc/$(PACKAGE)/{defaults/mkbuild,templates} + @rsync -av --exclude=.svn templates/* $(DESTDIR)/etc/$(PACKAGE)/defaults/templates/ + @chmod +x $(DESTDIR)/etc/$(PACKAGE)/defaults/templates/vserver/scripts/*.sh + @chmod +x $(DESTDIR)/etc/$(PACKAGE)/defaults/templates/vserver-legacy/scripts/*.sh + +install: clean + @make install_lib install_bin install_sbin install_doc install_config install_defaults + $(INSTALL) -D --mode=0644 install/slack-desc $(DESTDIR)/install/slack-desc + #$(INSTALL) -D --mode=0755 install/doinst.sh $(DESTDIR)/install/doinst.sh + +package: + echo "Remember to run this option as root!" + @rm -rf /tmp/package-$(PACKAGE) + @mkdir -p /tmp/package-$(PACKAGE) + @make DESTDIR=/tmp/package-$(PACKAGE) install + @cd /tmp/package-$(PACKAGE) && makepkg -c y -l y /tmp/$(PACKAGE)-$(VERSION)-noarch-$(BUILD).tgz && cd - && rm -rf /tmp/package-$(PACKAGE) diff --git a/tags/0.6rc1/README b/tags/0.6rc1/README new file mode 100644 index 0000000..d4d1463 --- /dev/null +++ b/tags/0.6rc1/README @@ -0,0 +1,2 @@ +See doc/README for more information. +Portuguese documentation at doc/README.pt_BR. diff --git a/tags/0.6rc1/conf/repos.conf b/tags/0.6rc1/conf/repos.conf new file mode 100644 index 0000000..480a0f8 --- /dev/null +++ b/tags/0.6rc1/conf/repos.conf @@ -0,0 +1,40 @@ +# +# repository definitions for simplaret +# please dont use any spaces inside a repository definition +# + +# local integration: the following lines makes packages created with +# createpkg automatic available to simplaret +ROOT-i386="local%file:///var/simplepkg/repos/slackware" +ROOT-x86_64="local%file:///var/simplepkg/repos/slamd64" +ROOT-powerpc="local%file:///var/simplepkg/repos/slackintosh" +ROOT-s390="local%file:///var/simplepkg/repos/slack390" + +# slackware root repositories +ROOT-i386="sarava%http://slack.sarava.org/packages/slackware/" +ROOT-i386="tds%http://slackware.mirrors.tds.net/pub/slackware/" +ROOT-i386="easynews%http://slackware.mirrors.easynews.com/linux/slackware/" +ROOT-i386="gwdg%http://ftp.gwdg.de/pub/linux/slackware/" + +# powerpc root definitions +ROOT-powerpc="workaround%http://slackintosh.workaround.ch/pub/slackintosh/" + +# s390 root definitions +ROOT-s390="ibiblio%http://distro.ibiblio.org/pub/linux/distributions/slack390/" + +# slamd64 root repositories +#ROOT-x86_64="sarava%http://slack.sarava.org/packages/slamd64/" +ROOT-x86_64="slackadelic%http://mirror1.slackadelic.com/slamd64/" +ROOT-x86_64="heanet%http://ftp.heanet.ie/pub/slamd64/" + +# If you want to use Bluewhite64 instead of Slamd64, please uncoment the +# next line and make sure to comment out all other slamd64 repository definitions +#ROOT-x86_64="bluewhite64%http://mirror.inode.at/data/bluewhite64/" + +# If you want to use Sflack instead of Slamd64 or Bluewhite64, please uncoment +# the next line and make sure to comment out all other slamd64 and Bluewhite64 +# repository definitions +#ROOT-x86_64="bluewhite64%http://webftp.slackarea.net/pub/sflack/" + +# noarch +NOARCH="sarava%http://slack.sarava.org/packages/noarch" diff --git a/tags/0.6rc1/conf/simplepkg.conf b/tags/0.6rc1/conf/simplepkg.conf new file mode 100644 index 0000000..0c0fc73 --- /dev/null +++ b/tags/0.6rc1/conf/simplepkg.conf @@ -0,0 +1,265 @@ +#--------------------------------------------------------------------- +# Default simplepkg configuration. +# File: /etc/simplepkg/default/simplepkg.conf +# +# This file contains the default behaviour of simplepkg scripts. +# Please do not edit this file. Use /etc/simplepkg/simplepkg.conf +# instead for overriding the default configuration. +#--------------------------------------------------------------------- + +#--------------------------------------------------------------------- +# GENERAL SECTION +#--------------------------------------------------------------------- +# Default architecture: set this option if you dont want simplepkg +# to use the value from /etc/slackware-version +# DEFAULT_ARCH="i486" + +# Default version: set this option if you dont want simplepkg +# to use the value from /etc/slackware-version +# DEFAULT_VERSION="12.2" + +# Temporary folder +TMP="/tmp/simplepkg" + +#--------------------------------------------------------------------- +# MKBUILD AND CREATEPKG SECTION +#--------------------------------------------------------------------- + +# Set default directory for mkbuilds +MKBUILDS_DIR="/var/simplepkg/mkbuilds" + +# Set SlackBuilds default directory for scripts +SLACKBUILDS_DIR="/var/simplepkg/slackbuilds" + +# Set packages default repository directory +PACKAGES_DIR="/var/simplepkg/repos" + +# Set mkbuilds svn default repository +MKBUILDS_SVN="http://slack.sarava.org/mkbuilds" + +# Set SlackBuilds svn default repository +SLACKBUILDS_SVN="http://slack.sarava.org/slackbuilds" + +# Set packages svn default repository +PACKAGES_SVN="http://slack.sarava.org/packages" + +# Set the binaries default repository nested folder, useful if you manage +# packages from different distribution versions and architectures in the +# same parent folder. +# +# You can use any string here and also de special parameters none, distro, +# arch and version. You can also mix more than one parameter, like +# "distro-version". +# +# Default value is "distro/distro-version" and you should change this just +# if you know what are you doing. +PACKAGES_REPOS_STYLE="distro/distro-version" + +# Se this to "yes" if you want createpkg to put noarch packages also in +# a noarch/ folder. +PACKAGES_REPOS_NOARCH="on" + +# If your packages repository is under svn and you plan to manage it with an +# user different than root, then set this parameter with the username +# owning the repository working copy. +PACKAGES_SVN_USER="" + +# Same as the previous option, but for svn repository group. +PACKAGES_SVN_GROUP="" + +# If your mkbuild and slackbuild repositories is under svn and you plan to +# manage it with an user different than root, then set this parameter with the +# username owning the repository working copy. +MKBUILDS_SVN_USER="" + +# Same as the previous option, but for svn repository group. +MKBUILDS_SVN_GROUP="" + +# Set sources default directory +SOURCE_DIR="/var/simplepkg/sources" + +# Set SOURCE_DIR folder owner +SOURCE_DIR_USER="" + +# Set SOURCE_DIR folder group +SOURCE_DIR_GROUP="" + +# Set color style. Possible values are: color,gray, none. +COLOR_MODE="none" + +# Createpkg architecture. Use this to force createpkg to a given arch. +# CREATEPKG_ARCH="i486" + +# Remove build files +CREATEPKG_CLEANUP="yes" + +# Remove old packages from repository tree by createpkg +REMOVE_OLD_PACKAGE="off" + +# Move package to SlackBuilds-like tree +MOVE_BIN_PACKAGE="on" + +# Move package's slack-required to binary repository +MOVE_SLACK_REQUIRED="on" + +# Set this to override the default author on each SlackBuild. Use alphabetic +# characters only and no spaces. +CREATEPKG_AUTHOR="" + +# Set this to get author information automatically when creating a new mkbuild +MKBUILD_AUTHOR="" + +# Set this to get author initials automatically when creating a new mkbuild +MKBUILD_AUTHOR_INITIALS="" + +# Whether createpkg should sign packages. +SIGN_PACKAGES="off" + +# Username used for package signatures. +SIGN_PACKAGES_USER="" + +# GPG key id used for package signature, leave blank to use default key. +SIGN_PACKAGES_KEYID="" + +# Whether to use gpg-agent to sign packages +SIGN_PACKAGES_WITH_GPG_AGENT="off" + +# Whether mkbuild should sign Manifests. +SIGN_MANIFESTS="off" + +# GPG key id used for Manifest signature, leave blank to use default key. +SIGN_MANIFESTS_KEYID="" + +# Whether to use gpg-agent to sign Manifests +SIGN_MANIFESTS_WITH_GPG_AGENT="off" + +# Whether to just build packages that have Manifest files. +FORCE_MANIFEST_CHECK="off" + +# Whether to just build packages that have signed Manifest files. +FORCE_MANIFEST_CHECK_SIGNATURE="off" + +#--------------------------------------------------------------------- +# SIMPLARET SECTION +#--------------------------------------------------------------------- + +# Whether mkjail should clean the package cache before installation +# to enable it, set to "1" or "yes" +SIMPLARET_CLEAN="1" + +# whether mkjail should clean the package cache after the installation; +# to enable it, set to "1" or "yes" +SIMPLARET_DELETE_DOWN="1" + +# Whether mkjail should issue a simplaret --update before install the jail; +# to enable it, set to "1" or "yes" +SIMPLARET_UPDATE="1" + +# Wheter try to download from the next repository on failed download. +SIMPLARET_DOWNLOAD_FROM_NEXT_REPO="1" + +# Wheter delete also patches when simplaret --purge is called; +# to enable it, set to "1" or "yes" +SIMPLARET_PURGE_PATCHES="0" + +# Whether delete each package rigth after its installation; +# to enable it, set to "1" or "yes" +SIMPLARET_DELETE_DURING="0" + +# Delete packages older than N weeks from the cache +SIMPLARET_PURGE_WEEKS="3" + +# Where patches are placed +PATCHES_DIR="/var/simplepkg/patches" + +# Place to store your packages +STORAGE="/var/simplepkg/packages" + +# Whether to use passive ftp transfers; +# to enable it, set to "1" or "yes" +PASSIVE_FTP="1" + +# Http retrieval tool; +# available parameters are "wget" or "curl" +HTTP_TOOL="wget" + +# Ftp retrieval tool; +# available parameters are "wget", "curl" or "ncftpget" +FTP_TOOL="wget" + +# Set connection timeout in seconds +CONNECT_TIMEOUT="20" + +# ROOT repository package priority +ROOT_PRIORITY="patches slackware extra testing pasture" + +# REPOS repository package priority +REPOS_PRIORITY="patches slackware extra testing pasture" + +# Whether to check package signatures (you should have the repository +# maintainer key on your keyring) +SIGNATURE_CHECKING="on" + +# Whether simplaret will try to solve dependencies by looking +# for packages' slack-required +DEPENDENCY_CHECKING="1" + +# Enabling this option (i.e, setting to "1" or "yes"), simplaret will +# donwload even already applied patches, a good option when you plan +# to keep local copies of all needed patches for your system +DOWNLOAD_EVEN_APPLIED_PATCHES="0" + +# Enabling this option (i.e, setting to "1" or "yes"), simplaret will +# look at your standard repositories for new packages; if it find a +# package with different version of your current installed package and +# also this package isnt in the packages folder, then the new package +# is applied; if in doubt, just say no or leave blank. Otherwise set it +# either to "yes" or "1" and remember that if enabling this feature can +# cause problems if you use more than one REPOS definition for each +# ARCH and VERSION. Also, this option can be very slow. +CONSIDER_ALL_PACKAGES_AS_PATCHES="0" + +# Enabling this option (i.e, setting to "1" or "yes"), simplaret will +# store patches it finds on ROOT repositories on +# +# $PATCHES_DIR/$ARCH/$VERSION/root-$repository_name. +# +# By default this option is turned off because it breaks the standard +# way to store packages and can cause some confusion, but its an useful +# feature if you like to see all patches apart from common packages and/or +# stored in the same tree. +STORE_ROOT_PATCHES_ON_PATCHES_DIR="0" + +#--------------------------------------------------------------------- +# TEMPLATEPKG SECTION +#--------------------------------------------------------------------- + +# Set to yes if your templates will be placed in a subversion repository +# This just work if TEMPLATE_STORAGE_STYLE is set to own-folder or compact. +TEMPLATES_UNDER_SVN="no" + +# Where your templates will be located. +# Dont change it except you know what you're doing. +TEMPLATE_FOLDER="/etc/simplepkg/templates" + +# This variable controls in which folder / subfolder your templates will +# be stored. Possible values are: +# +# - simplepkg-folder: templates are stored at /etc/simplepkg +# - templates-folder: templates are stored at /etc/simplepkg/templates +# - own-folder or compact: each template stored at its own folder +# at /etc/simplepkg/templates/template-name +# +# This variable has backwards purposes only, so dont change it. +TEMPLATE_STORAGE_STYLE="compact" + +#--------------------------------------------------------------------- +# MKJAIL SECTION +#--------------------------------------------------------------------- + +# Where jails are placed +JAIL_ROOT="/vservers" + +# Wheter mkjail should add new jails in the jail list; +# to enable it, set to "1" or "yes" +ADD_TO_JAIL_LIST="1" diff --git a/tags/0.6rc1/doc/CHANGELOG b/tags/0.6rc1/doc/CHANGELOG new file mode 100644 index 0000000..0a95640 --- /dev/null +++ b/tags/0.6rc1/doc/CHANGELOG @@ -0,0 +1,769 @@ +simplepkg changelog +=================== + +0.6pre31 +======== + + - repos script moved to utils/ folder + - new "compact" template storage format + - common.sh: + - default arch when its not present at /etc/slackware-version is now assumed to be "i486" + - other minor changes and new functions + - repository metainformationg is now added at svn control if applicable + - new functions svn_remove_empty_folders, svn_del, su_svn, chown_svn, chgrp_svn, + regexp_slash, default_distro and svn_add + - new config parameter "TMP" + - renamed function use_svn to templates_under_svn + - simplaret: + - support for HTTPS + - simplaret_search_and_process_patch do not donwload a package with the same + package name twice in any case + - simplaret_set_arch: mapping non-present architectures to i486 + - default simplepkg.conf and repos.conf moved to defaults/ folder + - templatepkg and mkjail: minor changes + - templates: + - removed slackware and added slackware-12.1, slackware-12.2 + - added slamd64-11.0, slamd64-12.0 and slamd64-12.1 templates + - repos.conf and simplepkg.conf: + - default configuration making createpkg repository integrated with simplaret + - new repositories + - mkbuild: + - added --edit command line options, among others + - code cleanup + - all previous "commit" functions and command line options changed to "submit" as they + don't really commit files into the svn repository + - function svn_mkdir moved to common.sh + - function svn_add moved to common.sh and renamed as svn_copy + - some svn check routines extended for git + - perl.mkSlackBuild + - added sections copy_init_scripts and copy_config_files + - generic.mkSlackBuild, perl.mkSlackBuild and kde4.mkSlackBuild + - clean_builds now compliant with standard --cleanup behaviour + - new section slack-required, download_patches, manifest_check + - generic.mkSlackBuild: + - config() on postinstall_script now accepting .dist and .sample config file extensions + - added git_source section + - createpkg: + - command line support for creating multiple packages + - fakeroot support + - new options --import, --status, --update and --commit to manage subversion repository, among others + - subversion integration + - minor changes + - renamed config parameter CREATE_ARCH to CREATEPKG_ARCH + - renamed all "MAKEPKG" config parameters to "PACKAGES", "MAKEPKG_REPOS" to "PACKAGES_DIR" + - cleaner -s option output + - new config parameters PACKAGES_REPOS_STYLE, MOVE_SLACK_REQUIRED, MKBUILDS_SVN_USER, + PACKAGES_SVN_USER, PACKAGES_SVN_GROUP, MKBUILDS_SVN_GROUP, PACKAGES_REPOS_NOARCH, + PACKAGES_SVN, CREATEPKG_AUTHOR, SIGN_PACKAGES, SIGN_PACKAGES_USER. SIGN_PACKAGES_KEYID, + SIGN_PACKAGES_WITH_GPG_AGENT, SOURCE_DIR_USER, SOURCE_DIR_GROUP, SIGN_MANIFESTS, + SIGN_MANIFESTS_KEYID, SIGN_MANIFESTS_WITH_GPG_AGENT, FORCE_MANIFEST_CHECK, + FORCE_MANIFEST_CHECK_SIGNATURE, MKBUILD_AUTHOR, MKBUILD_AUTHOR_INITIALS + - lspkg: fix on package search routine + - jail-commit: using unified diff + +0.6pre30 +======== + + - common.sh: fixed package_name when dealing with files under /var/log/packages + +0.6pre29 +======== + + - templatepkg: fixed issue on adding files in a template. + - simplaret: "--sync" and "sync" now synonyms to "--update" and "update". + +0.6pre28 +======== + + - generic.mkSlackBuild: new section copy_config_files + - lspkg: change ls /var/log/packages/$1 to ...$1-[0-9] + - mkjail: fixed #27 + - jail-update: installs/remove packages according the template (closes #10) + - simplaret: + - option --install working for multiple packages (closes #1) + - option --remove working for multiple packages + - mkpatch: fixed infinite loop on invalid diff action + - mkbuild 1.2.7: + - new ACTION bugfix + - search result bugfix + - protect MKBUILD_NAME and ACTION variables with "" in line 266 + - createpkg 1.1.13: + - severals EXIT_CODE corrections + - search result bugfix + +0.6pre27 +======== + + - using Makefile instead of simplepkg.SlackBuild + - generic.mkSlackBuild: fix on svn_source + - createpkg 1.1.12: + - change indentation do two spaces; + - add option --debug|-d to debug SlackBuilds scripts; + - add EXIT_CODE to output status from createpkg; + - mkbuild 1.2.6: + - add --search|-s option; + - mkbuild copy all file in current directory different of *.SlackBuild, + *.old, *.tmp, and slack-required to mkbuild directory, in + commit_mkbuild function; + - mkbuild copy all file in current directory different of *.mkbuild, + *.old, and *.tmp to slackbuild repository, in commit_slackbuild + function; + - add EXIT_CODE to output status from mkbuild; + +0.6pre26 +======== + + - createpkg: + - add LANG=en_US in SlackBuild command line + - mkbuild: + - bugfix: add "" to protect all parameters in edit_file function call; + - change line 346-346 with "sed -i" command; + - add SVN_MOD variable to control svn source code; + - add control to SVN_MOD and URL "none" in activate_sections function; + - desable sections download_source, md5sum_download_and_check_0, + md5sum_download_and_check_1, gpg_signature_check untar_source, in + SVN_MOD or URL "none"; + - enable section get_svn_source in SVN_MOD; + - EXTENSION, UNPACKER, UNPACKER_FLAGS, DECOMPRESSOR, and DECOMPRESSOR_TEST_FLAG + desable in SVN_MOD or URL "none"; + - generic.mkSlackBuild: + - change PKG_SRC="$PWD...{ print $8 }'`" to ...{ print $NF }'`" + - add svn_source section to grab subversion sources; + - comment lines limited to 79 columns; + - model.mkbuild: + - add "off:svn_source" line; + +0.6pre25 +======== + + - generic.mkSlackBuild: + - fixed gziped patch support at patch_source section + - added LDFLAGS for x86_64 + +0.6pre24 +======== + + - mkbuild: added LICENSE and SIGNATURE on default [[DOCUMENTATION FILES]] + - perl.mkSlackBuild: + - gpg_signature_check: support for [[SIGNING KEY ID]] parameter + - minor fix + +0.6pre23 +======== + + - generic.mkSlackBuild: + - new section copy_init_scripts + - gpg_signature_check: support for [[SIGNING KEY ID]] parameter + +0.6pre22 +======== + + - generic.mkSlackBuild: + - enhanced patch_source section with [[PATCH URLS]] support + - minor changes + +0.6pre21 +======== + + - generic.mkSlackBuild: + - added -fPIC on SLKCFLAGS for x86_64 + +0.6pre20 +======== + + - generic.mkSlackBuild: + - new section create_build_user_and_group + - new section move_config_files + - more gpg_signature_check section fixes + - new functions at postinstall_script section + - perl.mkSlackBuild: + - more gpg_signature_check section fixes + +0.6pre19 +======== + + - mkbuild-1.2.3: + - help function update + - createpkg-1.1.11: + - help function update + - generic.mkSlackBuild / perl.mkSlackbuild: + - gpg_signature_check section fixes + +0.6pre18 +======== + + - mkbuild-1.2.2: + - function change_others_parameters works of the beginning of the + archive .mkbuild until the line initiated for "#>>" + - added "--sync" option + - change indent spaces to 2 + - "show slackbuild path" option (-sp) and related functions had been removed + - removed others small bugs + - common.sh: fixed default_arch + - simpletrack: error message + +0.6pre17 +======== + + - mkpatch add simple patch suport to mkbuild + - mkpatch-1.1: + - --help, -h option suport + - change select line: 'sed "#i g;d"' is 30% most fast that 'sed -n "#i p"' + - change 'while' loop to most speed in patch application + - bug fixe: replace 'return' for 'exit' command + - mkbuild-1.2.0: + - added suport to mkpatch section in .mkbuild (apply_mkpatch function) + +0.6pre14 +======== + + - simplaret: ignoring slack-required lines starting which "#" + +0.6pre13 +======== + + - mkbuild-1.1.11: + - -sp, --slackbuild-path option added + - ACTION variable added (values are: new, show-path, and build) + - MKBUILD_NAME and MK_INPUT_FILE variables are the same ones + - Several 'sed - i' applied + - Changed caracter of separation in the command 'sed' for ¦ + - Reorganized the function get_slackbuild_path + - Call for the function start_build moved of position + +0.6pre12 +======== + + - common.sh: small change + + - generic.mkSlackBuild / perl.mkSlackBuild: minor fixe + + - mkbuild-1.1.10: + - added inputs --path-files and --nps-strip + - remove old code 'let i++' in set_parameters function + - PATCH FILES parameter default set to "" + - NUMBER OF PREFIX SLASHES TO STRIP parameter default set to "1" + - change_others_parameters function minor fixe + - variable ARCH="noarch" in SlackBuild file, if [[ARCH]]="noarch" + +0.6pre11 +======== + + - common.sh: + - enhanced system arch and version detection + - minor changes + + - simplaret: + - changed distro folder routine + - added --help | help command line option + - added simplified syntax: + + simplaret ekiga # should work as simplaret install ekiga + + - generic.mkSlackBuild / perl.mkSlackBuild: minor fixes + +0.6pre1-10 +========== + + - added perl.mkSlackBuild + + - generic.mkSlackBuild-0.9.0: + - added [[BUILD NUMBER]] parameter + - added variable PKG_WORK(=$TMP/$SRC_NAME) to package work directory + - PKG_SRC now is `ls -la | awk '/^d/ { print $8 }'`, directory in $PKG_WORK + + - model.mkbuild-0.9.0: + - added [[BUILD NUMBER]]="" parameter + + - createpkg-1.1.9: + - added option --all, to build all SlackBuilds in repository + - added number of parameters check + - integrate handle_error with common.sh + - moved handle_error and error_codes to common.sh (see above) + - usage function add exit program + - change ERROR_... codes to ERROR_CREATEPKG_... + - added SLACKBUILDS_SVN variable + - called to svn functions change to send SLACKBUILDS_DIR and SLACKBUILDS_SVN variables + - error 2 (usage function) change to usage function call + + - mkbuild-1.1.9: + - added [[BUILD NUMBER]]="" parameter support + - bugfix: removed [] from is_number function call + - correction of some codes of error and calls the handle_error function + - added commit mkbuild, commit slackbuild , and commit all options + - removed error_codes and mkbuild_error to common.sh + - COMMIT variable change to COMMIT_SLACKBUILD + - added variable COMMIT_MKBUILD + - analysis of the variable NUMJOBS moved close to the reading from parameter NUMBJOBS + - reading of the variable SLACKBUILD_PATH was moved for the end of the list of parameters + - is_number function moved to common.sh + - added validate_parameter input check + - added support to the "empty parameter" in validate_parameter function + - added variables SLACKBUILDS_SVN, MKBUILDS_DIR and MKBUILDS_SVN + - added variables BASENAME (program name) + - COMMIT_SLACKBUILD and COMMIT_MKBUILD default set to off + - UNPACKER bugfix + - DECOMPRESSOR bugfix + - added most flexibility in the creation of initial ".mkbuild" file + - added commit_mkbuild function + - bugfix: input of set_parameters ($@) protected with "" + - bugfixes: -a, -u, and -ai options + + - common.sh + - ERROR_PAR_NUMBER - incorrect number of parameters + - ERROR_COMMON_NOT_FOUND - file common.sh not found + - added error_codes function + - added handle_error function + - added svn functions: + - build_repo (build a svn repository) + - check_repo (check repository) + - sync_repo (synchronize repository) + - added is_number function. + Check if input is a number + + - bugfixes: + - common.sh: added ;; in the end from line 787 + - common.sh: change handle_error exit to "is_number $1 && exit $1 || exit 1" + - createpkg: protect parameters in solve_dep call with "" + - mkbuild: change "PACKGE NAME" parameter to "PKG NAME" + - model.mkbuild: change "PACKGE NAME" parameter to "PKG NAME" + + - simplepkg.conf: + - new config variables: + - MKBUILDS_DIR (mkbuilds directory repository) + - SLACKBUILDS_SVN (SlackBuild svn source) + - MKBUILDS_SVN (Mkbuild svn source) + + - model.mkbuild: + - Some changes to integrate to applicatory the external ones: + - [[SLACKBUILD AUTHOR]] default change to "[[YOUR NAME]]" + - [[SLACKBUILD AUTHOR INITIALLS]] default change to "[[YOUR SIGNATURE]]" + - [[DONLOAD FOLDER URL]] default change to "[[DEFAULT URL]][[PACKGE NAME]]" + - all [[NAME]] change to [[PACKGE NAME]] + - added [[ARCH]]="" parameter + + - lspkg-0.4: + - added error code 1 to fail exit + +0.6pre1-8 +========= + + - common.sh: + - fixed http://slack.sarava.org/trac/ticket/19 + + - added simpletrack script + + - simplaret: + - lots of fixes (thanks Diogo for finding and reporting two of them) + - performance enhancement on --upgrade + + - createpkg: + - small fixes + - starting support for repository management + + - mkbuild: + - lots of changes + + - documentation update + +0.5pre23 +======== + + - updated documentation + +0.5pre22 +======== + + - simplaret: + - small fix + - common.sh: + - fixes on metafiles generation + +0.5pre21 +======== + + - templatepkg: + - now --delete can also remove the file from a jail + +0.5pre20 +======== + + - small changes + - jail-commit: + - template files security + +0.5pre19 +======== + + - simplaret: + - bugfixes + - options --get and --install now can work + with full file name. + +0.5pre15-18 +=========== + + - bugfixes + +0.5pre14 +======== + + - simplaret + - added variable REPOS_PRIORITY + - added variable SIMPLARET_DOWNLOAD_FROM_NEXT_REPO + + - lspkg: + - small bugfix + + - common.sh: + - on search_template, doesnt return a template from + defaults/ if the function is called with --update + + - utils/add-slack-required: + - command line enhancement + +0.5pre9 - 0.5pre13 +================== + + - bugfix releases + +0.5pre8 +======= + + - lspkg: + - bugfix + + - common.sh: + - bugfix in function slash + +0.5pre7 +======= + + - simplaret: + - fixed bug for ROOT definitions when there is packages + inside of folders different than ROOT_PRIORITY + +0.5pre6 +======= + + - repos: + - FILE_LIST generation fix + + - mkjail: + - new config variable ADD_TO_JAIL_LIST controls wheter to + add new jails into the JAIL_LIST file + +0.5pre5 +======= + + - jail-commit + - SILENT env variable to decrease verbosity + +0.5pre4 +======= + + - templatepkg: + - small fixes + - help usage summary improvements + - now using variable TEMPLATE_FOLDER + - SILENT env variable to decrease verbosity + - option -p | --post-install renamed to -b | --batch-edit + - option -p | --post-install now used to build a package from a template + - option -d | --delete now can also remove post-install scripts + + - common.sh + - small fixes + - now using variable TEMPLATE_FOLDER + + - jail-commit: + - calling templatepkg silently + - small fixes + +0.5pre3 +======= + + - again, lots of bugfixes + + - jail-commit: + - update a template just once if finds more than one entry + for a template in the jailist + +0.5pre2 +======= + + - lots of bugfixes + + - templatepkg: + - now creates missing components in a template + +0.5pre1 +======= + + Lots of changes! + + - repos: cosmetic changes + + - lspkg: + - support for $ROOT env variable + - some improvements + + - CHANGELOG cleanup + + - subversion repository support for templates + + - metapkg moved to utils/ + + - simplaret: + - new config variables: + - STORE_ROOT_PATCHES_ON_PATCHES_DIR + - SIGNATURE_CHECKING + - ROOT=/otherroot works for --install, --remove and --upgrade + - signature checking + - dependency checking through slack-required + + - mkjail: + - added support for slack-required as templates + - templates now can be stored either on + - /etc/simplepkg/template_name.template + - /etc/simplepkg/templates/template_name.template + - /etc/simplepkg/templates/template_name/template_name.template + + - jail-update + - old script renamed to jail-commit + - now update a jail from a template + - svn repository support + + - jail-commit + - new script, commit changes from a jail to the templates + - svn repository support + + - templatepkg: + - major rewrite + - svn repository support + - now supports a tagfile or slack-required as a template + - new/changed options + -c | --create: improvements + -a | --add: changed to add files into a template + -u | --update: update a template + -d | --delete: delete files or folders from a template + -s | --sync: sync /etc/simplepkg/templates working copy + -e | --export: export /etc/simplepkg/templates to a svn repository + -i | --import: grab /etc/simplepkg/templates from a svn repository + -r | --remove: remove a template + -l | --list: list templates + -p | --post-install: add or edit post-installation scripts + -t | --template-edit: edit template package list + -h | --help: display this summary + +0.4.9pre18-23 +============= + + - simplaret: + - enhanced http retrieval: curl support + - enhanced verbosity + - get-patches small changes + - various fixes + +0.4.9pre10-17 +============= + + - lots of simplaret fixes + +0.4.9pre9 +========= + + - createpkg: + - speedup + - ncftpget support + - timeout support + - sets the correct architecture + + - deleted jail-upgrade + + - removed swaret support + +0.4.9pre8 +========= + + - createpkg: bugfix + + - common.sh: + - enhanced config file evaluation + - fixed function default_arch + + - simplaret: + - config evaluation via common.sh + - new config parameter SIMPLARET_PURGE_PATCHES + +0.4.9pre7 +========= + + - repos: added patches/ metafile creation + + - jail-upgrade: + - added option CONSIDER_ALL_PACKAGES_AS_PATCHES + - merged swaret and simplaret upgrade procedures + - act recursively on patches' folder + + - simplaret: lots of changes, most important are: + - new repository scheme, take a look at repos.conf.new. + - --get looks first to PATCHES repositories, then ROOT, + then REPOS and finally at NOARCH repositories; the + firts matching package is downloaded. + - new config parameter ROOT_PRIORITY set the priority + of folder lookup at a ROOT repository, defaults to + "patches slackware extra testing pasture". + - for --get, check if an already existing package + in the local repository has the same version and + build number, otherwise erase the old and download + the new one. + - fixed --get-paches + - added --upgrade option + - added --install + - added --remove + - new config parameter DOWNLOAD_EVEN_APPLIED_PATCHES + + - createpkg: lots of changes + +0.4.9pre6 +========= + + - createpkg: + - fixes + - now with slackbuild error handling + - increased verbosity + + - small fixes on rebuildpkg + + - lspkg enhancements + + - simplaret fix on --purge + + - updated default repos.conf + +0.4.9pre5 +========= + + - added script "repos" + + - moved simplaret to /usr/bin + +0.4.9pre4 +========= + + - createpkg: better command line evaluation, + now using "upgradepkg --install-new" to + install a package and added the command + line option --no-deps so createpkg doesn't + goes down to solve all slack-required + dependencies. + +0.4.9pre3 +========= + + - small fix on createpkg when handling with + slackbuilds with similar names + +0.4.9pre2 +========= + + - fixed simplepkg.SlackBuild + + - fixed doinst.sh + + - re-organized the source repository + + - added createpkg + + - updated README and README.pt_BR + +0.4.8 +===== + + - simplaret: removed extra folder from slamd64 definition + + - fixed a typo + +0.4.7 +===== + + - templatepkg bugfix on blank template lines and on package deletion + changed simplaret working dir in simplaret.conf.new + +0.4.6 +===== + + - small bugfix on jail-update that prevented template update + +0.4.5 +===== + + - vserver template update + +0.4.4 +===== + + - WARNING option on config file for simplaret + + - SILENT env var, if a non-zero value, keeps simplaret + work silenty when purging and works like if WANRING is set + to not null. + + - added SIMPLARET_DELETE_DURING config parameter: when set + to a non-zero value deletes each package rigth after its + installation + +0.4.3 +===== + + - added openoffice.org template + +0.4.2 +===== + + - common.sh: fix on install_packages when handling + with similar package names + +0.4.1 +===== + + - templatepkg: fixed tagfiles and comment handling + +0.4 +=== + + - multi-plataform and version management + + now simplepkg supports jails with architectures and versions + others than the main system, read the docs for details. + + - added simplaret: a small script for downloading packages + + - jail-upgrade + + * arch checking via /etc/slackware-version on each jail + * supports multi-arch and multi-version repository + * integrated with simplaret + + - common.sh: improved functions to support simplaret + +0.3.7-0.3.9 +=========== + + - bugfix releases + +0.3.6 +===== + + - added "-u" option to eval_config to ask for a swaret --update + +0.3.5 +===== + + - "main" jail support for jail-update + +0.3.4 +===== + + - Started changelog :) + diff --git a/tags/0.6rc1/doc/COPYING b/tags/0.6rc1/doc/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/tags/0.6rc1/doc/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/tags/0.6rc1/doc/TODO b/tags/0.6rc1/doc/TODO new file mode 100644 index 0000000..54b686e --- /dev/null +++ b/tags/0.6rc1/doc/TODO @@ -0,0 +1,5 @@ +simplepkg todo list +------------------- + +TODO list at http://slack.sarava.org/trac/report + diff --git a/tags/0.6rc1/doc/mkbuild-pt_BR.tex b/tags/0.6rc1/doc/mkbuild-pt_BR.tex new file mode 100644 index 0000000..2b82598 --- /dev/null +++ b/tags/0.6rc1/doc/mkbuild-pt_BR.tex @@ -0,0 +1,854 @@ +\documentclass[12pt,a4paper,oneside]{article} +%\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphicx} +%\usepackage{subfigure} +\usepackage{mdwlist} +\usepackage{a4} +%\topmargin -.5in +%\addtolength{\hoffset}{-1.0cm} +%\addtolength{\textwidth}{3.0cm} +%\textwidth = 400pt +%\textheight = 680pt + +\makeatletter + +%\usepackage[pdftex]{color,graphicx} +%\DeclareGraphicsExtensions{.jpg,.pdf,.mps,.png} + +\usepackage[brazil]{babel} +\usepackage[dvips]{graphicx} +%\usepackage{textdraw} + +\input texdraw +%\newenvironment{textdraw}{\leavevmode\btexdraw}{\etexdraw} + +\newcommand{\rcap}[1]{Capítulo \ref{#1}} +\newcommand{\rfig}[1]{Figura \ref{#1}} +\newcommand{\rtab}[1]{Tabela \ref{#1}} +\newcommand{\rsec}[1]{Seção \ref{#1}} + +\makeatother + +\begin{document} + + +\title{Construindo SlackBuilds com mkbuild} + +\author{Rudson Alves\\v. 1.2} + +\date{\today} + +\maketitle + +%\pagenumbering{roman} + +\tableofcontents{} +%\listoffigures +%\listoftables + +%\abstract{...} + + +\section*{Introdução} + +O \textit{mkbuild} é um programa em \textit{script shell} que auxiliar na construção de pacotes para o \textit{Slackware}. A grosso modo, o \textit{mkbuild} é um construtor de \textit{Slackbuild}\footnote{\textit{SlackBuilds} são \textit{script} utilizado para a construção de um pacote binário de um programa, no \textit{Slackware}.}. Ele opera a partir de um arquivo de parâmetros e de modelos de \textit{Slackbuilds} parametrizados. + +Este texto apresenta informações úteis para utilização do \textit{mkbuild} na construção destes arquivos de parâmetros, bem como configurar e utilizar modelos de \textit{SlackBuilds} e outras personalizações. + +O \textit{mkbuild} é uma ferramenta distribuída juntamente com o \textit{simplepkg}, um projeto do grupo Slack.Sarava. Para a utilização desta ferramenta você deverá instalar o pacote conforme as instruções abaixo: + +\begin{verbatim} +# LASTVERSION=`lynx -dump http://slack.sarava.org/packages/noarch/ \ + | grep 'simplepkg-.*\.tgz' | awk '{print $2}'` +# wget $LASTVERSION +# installpkg simplepkg-*.tgz +\end{verbatim} + +Para mais informações veja os links abaixo: + +\begin{itemize} + \item http://slack.sarava.org/simplepkg - Descrição de todo o projeto \textit{Simplepkg}, por Rhatto - coordenador do projeto \textit{Slack.Sarava}; + \item http://slack.sarava.org/node/25 - Tutorial básico de instalação do \textit{Simplepkg}, por rafael2k - um grande colaborador. +\end{itemize} + + +\section{O modelo generic.mkSlackBuild} + +O \textit{mkbuild} utiliza o modelo padrão \textit{generic.mkSlackBuild}, armazenado em + +\begin{verbatim} +/etc/simplepkg/defaults/mkbuild/ +\end{verbatim} + +Este modelo é uma versão setorizada do \textit{generic.SlackBuild}, levemente modificada. O \textit{generic.SlackBuild} é um modelo genérico de \textit{Slackbuilds} criado por nosso colega e colaborador Luís, para servir como modelo para a construção dos \textit{Slackbuilds}. Outros modelos setorizados podem ser utilizados pelo \textit{mkbuild}, a única limitação é quanto ao nome da seção \textit{slackdesc}, que não poderá ser alterada. + + +\subsection{Os Campos} + +O modelo \textit{generic.mkSlackBuild} é um \textit{SlackBuild} genérico com vários campos destacados por duplo colchetes, [[ \dots ]], com mostra o trecho abaixo: + +\begin{verbatim} +... + all +# Set variables +CWD="$(pwd)" +SRC_NAME="[[SOURCE NAME]]" +PKG_NAME="[[PACKAGE NAME]]" +ARCH=${ARCH:=[[ARCH]]} +SRC_VERSION=${VERSION:=[[VERSION]]} +PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')" +BUILD=${BUILD:=1[[SLACKBUILD AUTHOR INITIALS]]} +... +PREFIX=${PREFIX:=[[PREFIX]]} +PKG_SRC="$TMP/$SRC_NAME-$SRC_VERSION" + +... +\end{verbatim} + +Uma breve descrição destes campos é apresentada na tabela abaixo: \\ +\\ +\begin{tabular}{l|l} +\hline \hline +\textbf{Campo} & \textbf{Descrição}\\ +\hline \hline +PROGRAM NAME & nome do programa \\ +PROGRAM URL & \textit{URL} da fonte do pacote \\ +SLACKBUILD AUTHOR & nome do autor \\ +SOURCE NAME & nome da fonte, sem versão ou extensão \\ +PACKAGE NAME & nome do pacote e ser gerado \\ +ARCH & arquitetura do pacote. Padrão i486 \\ +VERSION & versão do pacote \\ +SLACKBUILD AUTHOR INITIALS & assinatura utilizada pelo autor \\ +PREFIX & prefixo da instalação (/usr, /opt, \dots)\\ +SOURCE EXTENSION & extensão da fonte (bz2, gz, \dots) \\ +UNPACKER & programa de dessempacotamento (geralmenrte "tar") \\ +UNPACKER FLAGS & flags para o desempacotador \\ +DOWNLOAD FOLDER URL & \textit{URL} da pasta onde se encontra a fonte \\ +DECOMPRESSOR & o descompressor para a fonte (gunzip, bunzip2, \dots) \\ +DECOMPRESSOR TEST FLAG & \textit{flag} de teste do descompressor \\ +SIGNING KEY URL & \textit{URL} da chave \textit{gpg} do fonte \\ +SIGNING KEY & chave \textit{gpg} da fonte \\ +MD5SUM EXTENSION & extensão utilizada pelo arquivo \textit{md5sum}\\ +PATCH FILES & arquivo \textit{path} \\ +NUMBER OF PREFIX SLASHES TO STRIP & \dots \\ +SOURCE NAME CONSTRUCTION STRING & string para a construção do nome do arquivo. O padrão é \$SRC\_NAME-\$VERSION.tar.\$EXTENSION \\ +OTHER CONFIGURE ARGS & argumentos de configuração passados ao ./configure \\ +DOCUMENTATION FILES & lista de arquivos para a pasta /usr/doc/PACKAGE \\ +SLACK-DESC & conteúdo do slack-desc, descrição do pacote \\ +REST OF DOINST.SH & conteúdo do doinst.sh \\ +\hline +\end{tabular} +\\\\ + +Em alguns casos o nome do pacote difere do nome da fonte, como é o caso da fonte \textit{sigc++}, que gera o pacote de nome \textit{libsiggc++}. Por este motivo que existem os campos \textit{SOURCE NAME} e \textit{PACKAGE NAME}. Para uma compreensão mais profunda destes campos, aconselho fazer uma análise mais detalhada do modelo \textit{generic.mkSlackBuild}. + + +\subsection{As Seções} + +As seções no modelo \textit{generic.mkSlackBuild}, são iniciadas pela \textit{tag} e terminadas com , como em um código \textit{html}, \underline{sem espaços}. + +A única seção que não pode ter seu nome alterado é \textit{slackdesc}. Esta seção é editada de uma forma diferenciada pelo \textit{mkbuild} e a alteração de seu nome poderá gerar erro. + +Cada seção possui uma \textit{flag} com os possíveis valores: + +\begin{description} + \item[on] habilitado; + \item[off] desabilitado; + \item[all] sempre habilitado. +\end{description} + +A intenção destas \textit{flags} é gerar um padrão para as seções, deixando em \textbf{all} as seções que deverão estar sempre habilitadas e \textbf{on} ou \textbf{off} seções que podem ser habilitadas ou desabilitadas de acordo com as necessidades do \textit{SlackBuild} que será construído\footnote{Na versão 1.1.x do mkbuild, todas as seções foram configuradas como \textbf{off}, para simplificar a vizualização do script de configuração \textit{.mkbuild}.}. + +As seções padrões do \textit{generic.mkSlackBuild} são listadas na tabela abaixo: +\\\\ +\begin{tabular}{l|l|c|c} +\hline +Seção & Descrição & 1.0.x & 1.1.x\\ +\hline +head & cabeçalho do \textit{SlackBuild} & all & on \\ +slackbuildrc & carrega \textit{script} \textit{slackbuildrc} & off & off \\ +set\_variables & inicia as variáveis & all & on \\ +slkflags & carrega \textit{flags} para compilação & all & on \\ +error\_codes & códigos de erro para o \textit{createpkg} & off & off \\ +start\_structure & cria diretórios para compilação & all & on \\ +download\_source & baixa a fonte do pacote & off & off \\ +md5sum\_download\_and\_check\_0 & verifica \textit{md5sum} da fonte por código & off & off \\ +md5sum\_download\_and\_check\_1 & verifica \textit{md5sum} da fonte por arquivo & off & off \\ +gpg\_signature\_check & verifica assinatura \textit{gpg} da fonte & off & off \\ +untar\_source & desempacota a fonte & all & on \\ +path\_source & aplica \textit{path} a fonte & off & off \\ +configure & configura pacote & off & off \\ +make\_package & compila o pacote & all & on \\ +install\_package & instala o pacote em diretório temporário & all & on \\ +strip\_binaries & limpa binários & off & off \\ +compress\_manpages & comprime páginas de manuais & off & off \\ +compress\_info\_files & comprime arquivos \textit{info} & off & off \\ +install\_documentation & instala documentação & off & off \\ +slackdesc & \textit{slackdesc} do pacote & off & off \\ +postinstall\_script & \textit{script} de pós-instalação & off & off \\ +build\_package & constrói pacote & all & on \\ +clean\_builds & remove fontes e instalação temporária & off & off \\ +\hline +\end{tabular} +\\\\ + +A terceira e a quarta colunas da tebela acima apresentam o status padrão para as seções nas versões 1.0.x e 1.1.x do \textit{mkbuild}. No \textit{mkbuild} versão 1.0.x, as seções \textbf{all} são configuradas no modelo \textit{generic.mkSlackBuild}. A partir da versão 1.1.x estas seções serão definidas como \textbf{on} ou \textbf{off} no \textit{model.mkbuild}, não mais no modelo \textit{generic.mkSlackBuild}. + + +\section{Configuração} + +O \textit{mkbuild} utiliza quatro variáveis de configuração em /etc/simplepkg/simplepkg.conf. São elas: + +\begin{description} + \item[SLACKBUILDS\_DIR] diretório onde serão guardados os \textit{SlackBuilds} e \textit{slack-required} gerados. Necessário para o uso com a opção \textbf{-c}, \textit{commit}. Padrão /var/simplaret/slackbuilds; + \item[MKBUILDS\_DIR] diretório onde serão guardados os \textit{.mkbuilds} criados. Necessário para o uso com a opção \textbf{-c}, \textit{commit}. Padrão /var/simplaret/mkbuilds; + \item[SLACKBUILDS\_SVN] endereço do repositório subversion dos \textit{SlackBuilds}. Mantenha o valor padrão; + \item[MKBUILDS\_SVN] endereço do repositório subversion dos \textit{SlackBuilds}. Mantenha o valor padrão; + \item[COLOR\_MODE] define modo de cores para o \textit{mkbuild} e \textit{createpkg}. Padrão \textit{none}, preto e branco. + \end{description} + + +\section{Criando o SlackBuild do aplicativo pyrex} + +Para fazer um \textit{SlackBuild} com o \textit{mkbuild} é necessário criar um arquivo com os parâmetros que deseja que sejam passados para o modelo. Um arquivo de configuração simples, \textit{sample-Pyrex-small.mkbuild}, é apresentado abaixo: + +\begin{verbatim} +#-------------------- +# Variables +#-------------------- +# Author name +[[SLACKBUILD AUTHOR]]="Adalberto Simão Nader" + +# +# Complete URL address or URL base address ( without $SRC_NAME-$VERSION... ) +[[DOWNLOAD FOLDER URL]]="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/Pyrex-0.9.5.1a.tar.gz" + +# +# Default enable sections: +# head, set_variables, slkflags, start_structure, untar_source, +# make_package, install_package, build_package +# Warning: don't remove '#>>' and "#<<" tags. +#>> Start SlackBuild Sections: + on: head + on: slackbuildrc + on: set_variables + on: slkflags + on: error_codes + on: start_structure + on: download_source + on: md5sum_download_and_check_0 + on: untar_source + on: configure + on: make_package + on: install_package + on: strip_binaries + on: install_documentation + on: slackdesc + on: build_package + on: clean_builds +#<< End SlackBuild Sections + +#------------------ +# Sections changes +#------------------ +#>slackdesc +pyrex: Pyrex by Slack.Sarava +pyrex: +pyrex: Pyrex is a language specially designed for writing Python extension +pyrex: modules. Its designed to bridge the gap between the nice, high-level, +pyrex: easy-to-use world of Python and the messy, low-level world of C. +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +# & maior \\ +>= & maior ou igual \\ +\hline +\end{tabular} + +Os campos \textit{CONDIÇÃO} e \textit{VERSÃO} podem ser omitidos. Cada pacote da dependência deve ser separado por um ":". + +Para o \textit{SLACK REQUIRED} definido com a linha: + +\begin{verbatim} +[[SLACK REQUIRED]]="dep1 >= 1.1.1: dep2 >= 2.2.2:dep3:dep4:dep5 = 1.0" +\end{verbatim} + +\noindent será gerado o arquivo \textit{slack-required} abaixo: + +\begin{verbatim} +# Dependency list to Pyrex +# +# dependency [condition] [version]] +dep1 >= 1.1.1 +dep2 >= 2.2.2 +dep3 +dep4 +dep5 = 1.0 +\end{verbatim} + + +\subsubsection{SLACKBUILD MODEL} + +Este parâmetro contém o nome do modelo utilizado para gerar os \textit{SlackBuilds}. O valor padrão é \textit{generic.mkSlackBuild}. Outros modelos podem ser utilizados adicionando-se o arquivo do modelo no diretório /etc/simplepkg/defaults/mkbuild/. A linha abaixo + +\begin{verbatim} +[[SLACKBUILD MODEL]]="generic.mkSlackBuild.2" +\end{verbatim} + +\noindent define o modelo \textit{generic.mkSlackBuild.2} para a construção do \textit{SlackBuild}. + + +\subsubsection{SLACKBUILD PATH} + +Este parâmetro é necessário apenas para uso com a opção "\verb!-c!", \textit{commit}. Ele indica o diretório, na estrutura de diretórios do Slack.Sarava, onde o \textit{SlackBuild} construído deverá ser armasenado. Se este parâmetro não for passado, o \textit{mkbuild} irá pesquisá-lo no repositório do \textit{gentoo}, pela \textit{internet}\footnote{Esta pesquisa automática do mkbuild tem se mostrado pouco eficiente. Por isto é aconselhável verifica com um navegador a localização do \textit{SlackBuild} em http://gentoo-portage.com.}. Caso não consiga resolver com esta pesquisa, o \textit{SlackBuild} será colocado em um diretório padrão para \textit{scripts} não classificados, "\verb!others/unclassified/$PKG_NAME!". + +\begin{verbatim} +[[SLACKBUILD PATH]]="dev/python/pyrex" +\end{verbatim} + +A estrutura de diretórios para armazenamento dos \textit{SlackBuilds} adotadas pelo \textit{Slack.Sarava} segue o mesmo padrão do \textit{portage} do \textit{gentoo}. + + +\subsubsection{Outros Parâmetros} + +Outros parâmetros podem ser passados para substituição no modelo \textit{generic.mkSlackBuild}, como o parâmetro \textit{MD5SUM EXTENSION} no trecho abaixo: + +\begin{verbatim} +#[[PATCH FILES]]="" +#[[MD5SUM CODE]]="" +[[MD5SUM EXTENSION]]="047574eb5d1b7848a70d4130035f1f3c" +#[[SIGNING KEY]]="" +#[[SIGNING KEY URL]]="" +#[[PATCH FILES]]="" +\end{verbatim} + +Além destes parâmetros padrões do \textit{generic.mkSlackBuild}, qualquer outro parâmetro pode ser criado e incluído ao modelo. Para isto é necessário que seu nome seja incluído entre duplo colchetes como no exemplo abaixo: + +\begin{verbatim} +[[NEW PARAMETER]]="new value" +\end{verbatim} + +O \textit{mkbuild} irá procurar a ocorrência da seqüência \textit{[[NEW PARAMETER]]} no modelo passado por \textit{[[SLACKBUILD MODEL]]} e irá substitui-lo por "\verb!new value!". + + +\subsection{Habilitando seções} + +As seções do modelo \textit{generic.mkSlackBuild} são habilitadas na seção iniciada por "\verb!#>>!" e terminada por "\verb!#<> Start SlackBuild Sections: + on: head + on: slackbuildrc + on: set_variables + on: slkflags + on: error_codes + on: start_structure + on: download_source +off: md5sum_download_and_check_0 +off: md5sum_download_and_check_1 +off: gpg_signature_check + on: untar_source +off: patch_source + on: configure + on: make_package + on: install_package + on: strip_binaries +off: compress_manpages +off: compress_info_files + on: install_documentation + on: slackdesc +# esta linha é ignorada +off: postinstall_script + on: build_package + on: clean_builds +#<< End SlackBuild Sections +\end{verbatim} + +No caso do exemplo acima, são desabilitadas as seções: \textit{md5sum\_download\_and\_check\_0}, \textit{md5sum\_download\_and\_check\_1}, \textit{gpg\_signature\_check}, \textit{patch\_source}, \textit{compress\_manpages}, \textit{compress\_info\_files} e \textit{postinstall\_script}. Linhas iniciadas por uma tralha, \#, são ignoradas. Como no modelo generic.mkSlackBuild todas as seções estão desabilitadas ("off"), apenas as seções ligadas necessitam ser habilitadas. + + +\subsection{Substituição de seções no modelo} + +Em algumas situações pode ser necessário substituir o conteúdo de uma seção. Estas mudanças são feitas iniciando uma seção, no arquivo de parâmetros, pela \textit{tag} "\verb!#>nome_da_seção!" e terminar pela \textit{tag} "\verb!#untar_source +# Untar program + +# Change to temp dir +cd "$TMP" + +# Uncompress e untar source +gunzip "$SRC_DIR/$SRC" | tar --no-same-owner --no-same-permissions -xvf || exit $ERROR_TAR + +# Change to source dir +cd "$PKG_SRC" +#slackdesc +pyrex: Pyrex by Slack.Sarava +pyrex: +pyrex: Pyrex is a language specially designed for writing Python extension +pyrex: modules. Its designed to bridge the gap between the nice, high-level, +pyrex: easy-to-use world of Python and the messy, low-level world of C. +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +#slackdesc!" e "\verb!#>" -ai "<>" -n dosbox +\end{verbatim} + +Não é necessário o nome e assinatura passados pelas opções \textbf{-a} e \textbf{-ai}, mas é aconselhável. A opção \textbf{-n} diz ao \textit{mkbuild} para copiar o modelo em \textit{/etc/simplepkg/\dots/model.mkbuild}, para o diretório atual com o nome \textit{dosbox.mkbuild}, e aplicar o nome "dosbox" a este modelo. + +Em seguida, edite o arquivo \textit{dosbox.mkbuild}, com um editor de sua escolha, e preencha os campos com os valores abaixo: + +\begin{verbatim} +[[DOWNLOAD FOLDER URL]]="http://downloads.sourceforge.net/dosbox/dosbox-0.71.tar.gz" +[[SLACKBUILD PATH]]="games/emulation/dosbox" + +#>slackdesc +dosbox: DOSBox.slackBuild by Slack.Sarava +dosbox: +dosbox: DOSBox is a DOS-emulator that uses the SDL-library which makes DOSBox +dosbox: very easy to port to different platforms. DOSBox has already been +dosbox: ported to many different platforms, such as Windows, BeOS, Linux, +dosbox: MacOS X... +dosbox: +dosbox: DOSBox also emulates CPU:286/386 realmode/protected mode, Directory +dosbox: FileSystem/XMS/EMS, Tandy/Hercules/CGA/EGA/VGA/VESA graphics, a +dosbox: SoundBlaster/Gravis Ultra Sound card for excellent sound +dosbox: compatibility with older games... +#! e \verb!#p +... Alterações ... +#p< +... +\end{verbatim} + +As linhas com as alterações devem sempre iniciar com um \textit{caracter de controle}, seguido pelo conteúdo da linha a ser alterada, removida ou conferida ao modelo \textit{generic.mkSlackBuild}. O formato do \textit{patch} usado pelo \textit{mkbuild} segue o mesmo padrão gerado pelo comando \verb!diff -u!, com as seguintes diferenças: + +\begin{enumerate} + \item Não possui numeração de linhas. A posição das alterações é referenciada por uma ou mais linhas de referência. Uma linha de referência deve ser única, ou em caso de várias linhas, a seqüência deve ser única; + \item O número de linhas de referência é variável e não necessita de linhas de referência ao final da alteração; + \item O caracter para separar as alterações é o caracter igual, =. +\end{enumerate} + + +\subsection{Caracteres de controle} + +Os \textit{caracteres de controle} são apenas quatro. Com eles é possível fazer todas as alterações por substituição de linha necessárias em um \textit{patch}. Segue abaixo a descrição destes caracteres de controle: + +\begin{description} + \item[" " (espaço)] este caracter de controle serve para definir linhas de referência, necessárias para localizar a posição das alterações no modelo \textit{generic.mkSlackBuild}; + \item[- (menos)] serve para referenciar linhas que serão removidas do modelo. Este caracter de controle serve ainda para definir linhas de referência, entretanto lembre-se que elas serão removidas; + \item[+ (mais)] serve para indicar linhas que serão adicionadas ao modelo, logo após a referência; + \item[= (igual)] serve para indicar o final de uma alteração e iniciar a próxima. Qualquer coisa colocado após um \textit{caracter de controle} igual, será ignorado. + \end{description} + +Para simplificar a compreensão do funcionamento deste \textit{patch} simplificado, segue abaixo um exemplo para alterações hipotéticas. + + +\subsection{mkpatch: Alterando uma linha} + +Neste exemplo, será alterado o conteúdo da variável \textit{ARCH} para fixá-la em \textit{i586}. Isto pode ocorre na construção de pacotes de programas pré-compilados ou um pacote binário. Para fazer esta alteração, basta acrescentar o \textit{patch} abaixo ao final do arquivo \textit{.mkbuild}: + +\begin{verbatim} +... +#p> + PKG_NAME="[[PACKAGE NAME]]" +-ARCH=${ARCH:=[[ARCH]]} ++ARCH=i586 +#p< +\end{verbatim} + +A primeira linha, \verb!PKG_NAME="[[PACKAGE NAME]]"!, iniciada pelo \textit{caracter de controle} \textbf{espaço}, é uma linha de referência a ser procurada no modelo \textit{generic.mkSlackBuild}, posicionando a alteração ao modelo. A segunda linha, com o \textit{caracter de controle} \textbf{menos}, indica a linha que será removida: \verb!ARCH=${ARCH:=[[ARCH]]}"!. A terceira linha, com o \textit{caracter de controle} \textbf{mais}, será adicionada logo em seguida: \verb!ARCH=i586!. + +Observe que o mesmo poderia ser feito com o \textit{patch} abaixo: + +\begin{verbatim} +... +#p> +-ARCH=${ARCH:=[[ARCH]]} ++ARCH=i586 +#p< +\end{verbatim} + +Como o \textit{caracter de controle} \textbf{menos} também serve como referência e a alteração será feita da mesma forma. + + +\subsection{mkpatch: Aplicando uma segunda alteração} + +Para uma segunda alteração ao modelo, vou alterar a forma de instalação e fazer mais algumas edições a seção \textit{strip\_binaries}: + +\begin{verbatim} +#p> +-ARCH=${ARCH:=[[ARCH]]} ++ARCH=i586 +=== + off +-# Install ++# Install Setup +-make install DESTDIR="$PKG" || exit $ERROR_INSTALL +-./setup --prefix="$PKG" || exit $ERROR_INSTALL +=== + # Strip binaries + ( cd "$PKG" +- find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \ +- xargs strip --strip-unneeded 2> /dev/null +- find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \ +- xargs strip --strip-unneeded 2> /dev/null ++ find . | xargs file | grep ELF | xargs strip --strip-unneeded 2> /dev/null +#p< +\end{verbatim} + +A segunda alteração, troca a linha de comentário adicionado a palavra \verb!Setup! e por fim o comando de instalação, para a chamada \verb!./setup! \dots + +A terceira alteração é feita à seção \textit{strip\_binaries}, onde os dois comando \verb!find! são trocados por um terceiro mais simples. + + +\section{Apêndice-A} + +Vários outros parâmetros podem ser passados ao \textit{mkbuild} pela linha de comando. Um manual completo destas opções pode ser consultado passando \textit{flag} \verb!--help! ou \verb!-h!, ao \textit{mkbuild}: + +\begin{verbatim} +NAME + mkbuild - create SlackBuild script from .mkbuild input file + +SYNOPSIS + mkbuild [OPIONS] [mkbuild_file] + +DESCRIPTION + input file with build rules and variables + + Input options: + -a, --author + author name + -ai, --author_initials + author signature + -bn, --build-number + change build number + -cs, --const_string + construction string to source name + -u, --url + url address to source + -pn, --pkg_name + package name + -sn, --src_name + source name + -pv, --pkg_version + package version + -md, --model + SlackBuild model file + -j, --jobs + Number of jobs to run simultaneously + --prefix + Prefix install directory + -pf, --patch-files + List of patch files + -npss, --nps-strip + Number of prefix slashes to strip + + Program options: + -h, --help + this help mesage + -cs, --commit-slackbuild + commit SlackBuilds in local svn SlackBuild tree + -cm, --commit-mkbuild + commit .mkbuild in local svn mkbuild tree + -c, --commit-all + commit SlackBuild and .mkbuild files in local svn tree + -n, --new + start a new mkbuild configure file + -v, --version + program version + -V, --verbose + print debug information + -sp, --slackbuild-path + print SlackBuild path in Slack.Sarava tree + +EXAMPLES + mkbuild -c pyrex.mkbuild + build pyrex.SlackBuild and commit .mkbuild and .SlackBuild in + Slack.Sarava local tree. + mkbuild -a "Jose Araujo" -ai "ja" -n pyrex + make a basic pyrex.mkbuild with author name "Jose Araujo" and + author signature "ja". + mkbuild --prefix /usr/local pyrex.mkbuild + build pyrex.SlackBuild with prefix /usr/local and pyrex.mkbuild + variables and options definitions. + +AUTHOR + Written by Rduson R. Alves + +AVAILABILITY + by svn: svn checkout svn://slack.sarava.org/simplepkg + this mkbuild is found in branches/0.6/ + +REPORTING BUGS + Report bugs to + +COPYRIGHT + Copyright © 2006 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the + terms of the GNU General Public License + . There is NO WARRANTY, to the + extent permitted by law. +\end{verbatim} + +Uma opção interessante é a \verb!-c!, utilizada para adicionar e atualizar uma cópia do \textit{SlackBuild} gerado na lista de \textit{SlackBuilds} local. + +Slack.Sarava agradece a toda e qualquer contribuição que possa nos ajudar a manter e a desenvolver este projeto. + +\end{document} + diff --git a/tags/0.6rc1/doc/simplaret-en.tex b/tags/0.6rc1/doc/simplaret-en.tex new file mode 100644 index 0000000..703aae2 --- /dev/null +++ b/tags/0.6rc1/doc/simplaret-en.tex @@ -0,0 +1,312 @@ +\documentclass{article} +\usepackage[brazilian]{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphics} +\usepackage{hyperref} +\usepackage{html,makeid} + +\title{Simplaret: simplepkg retrieval tool} +\author{Silvio Rhatto} + +\begin{document}\label{start} +\maketitle + +\begin{abstract} +Simplaret is a \htmladdnormallink{simplepkg}{http://slack.sarava.org/simplepkg-en} tool used to download packages from local and remote repositories. With simplaret, one can grab packages for all archictectures and versions of slackware-like distributions that follows the mirror guidelines, allowing an easy management all jails and slackware installations in a machine, no matter wich arquiteture or version each one has. + +It was inspired in swaret behavior but don't tries to get its complexity level, but execute package download in a different way, where the local repository is organized by archictecture and version. It can also search for packages. It runs on top of pkgtool and is totally non-instrusive and can search, add, remove and upgrade packages. Portuguese version \htmladdnormallink{here}{/simplaret}. +\end{abstract} + +\section{Downloading and installing} + +Simplaret comes with simplepkg, wich installation and configuration is detailed at http://slack.sarava.org/simplepkg. Simplaret uses /etc/simplepkg/simplepkg.conf for its definitions and /etc/simplepkg/repos.conf for repository information. + +The default configuration is placed, respectively, at /etc/simplepkg/defaults/simplepkg.conf and /etc/simplepkg/defaults/repos.conf and should work for most people, but if you want to change something please don't edit the default configuration files as the default setting may change in future releases. If you have a /etc/simplepkg/repos.conf file, then simplaret will just ignore the default repos.conf. + +\section{Using simplaret} + +Simplaret stores its data in system wide folders. Then, some funcionality will just be available if its run with root user capabilities. The first thing you need to do with simplaret is to fetch repository metadata, using + +\begin{verbatim} +simplaret --update +\end{verbatim} + +or simply + +\begin{verbatim} +simplaret update +\end{verbatim} + +as simplepkg supports both command line behaviour (--update or just update). After that, you can search for packages using commands like + +\begin{verbatim} +simplaret search ekiga +\end{verbatim} + +The result should be something like + +\begin{verbatim} +REPOS repository sarava, arch: i386, version: 11.0: ekiga-2.0.5-i586-1rd.tgz +\end{verbatim} + +As we'll see afterwards, "REPOS" means the repository type, "sarava" is the repository name, "arch" is the package architecture (i386 in this case) and "version" is the repository version (11.0 in this case). + +To install this package, just type + +\begin{verbatim} +simplaret install ekiga +\end{verbatim} + +By default, if simplaret finds in the repository a slack-required file for this package (i.e, the file ekiga.slack-required in the same folder of the binary package) then it will try to install all unmet dependencies. This default behaviour can be disabled through config file parameters. + +If you just want to download the package, type + +\begin{verbatim} +simplaret get ekiga +\end{verbatim} + +In the case of simplaret finds more than one package with the same name, it will get in the order that the "search" option shows them. The search precedence can also be defined by config file parameters. For instance, the command + +\begin{verbatim} +simplaret search kernel-generic +\end{verbatim} + +can return something like + +\begin{verbatim} +ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.17.13-i486-1.tgz +ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.18-i486-1.tgz +\end{verbatim} + +So the command + +\begin{verbatim} +simplaret install kernel-generic +\end{verbatim} + +will attempt to install the package "kernel-generic-2.6.17.13-i486-1.tgz" and not the file "kernel-generic-2.6.18-i486-1.tgz". If you want to force simplaret to get and specific package, use its complete file name: + +\begin{verbatim} +simplaret install kernel-generic-2.6.18-i486-1.tgz +\end{verbatim} + +If a package is already installed in the system, the --install option will try to upgrade it if the version or build number between the installed package and the one in the repository are different. So the command + +\begin{verbatim} +simplaret install simplepkg +\end{verbatim} + +updates simplepkg in the case there's a new version. To remove a package, type + +\begin{verbatim} +simplaret remove nome-do-pacote +\end{verbatim} + +That's just an alias for the standard removepkg command. + +Simplaret stores downloaded packages in a system folder that defaults to /var/simplaret. As you get more and more packages, simplaret will consume more space ir your disk. To erase your local repository folder, use the command + +\begin{verbatim} +simplaret purge +\end{verbatim} + +This will erase just the packages from the current arch and version. Details about how to erase the repository for different arch and version are in another session. + +You can also force simplaret to erase just old packages. The following command erases just packages older than six weeks or more: + +\begin{verbatim} +simplaret purge -w 3 +\end{verbatim} + +\section{Downloading patches and upgrading the system} + +Simplaret hasn't just about package installing and removal, it has two more important features: patches retrieval and application. Assuming that the patches repository of your slackware flavour is correctly configured (what should work with almost everyone with the default configuration), you can fetch the available patches using the command + +\begin{verbatim} +simplaret get-patches +\end{verbatim} + +If you don't just donwload but also apply those patches, use + +\begin{verbatim} +simplaret upgrade +\end{verbatim} + +\section{Working with more than one architecture and version} + +Until now we just looked what is the requirement for all package management system: package retrieval, installation, search, upgrade and dependency resolution. What makes simplaret different from another tools is the ability to deal with different architectures and versions and slackware installations. + +The features descibed in this section will just make sense after you read the next section, when we'll talk about multiple slackware installations and jails in the same computer. + +Suppose you're running Slackware (arch i386) bit wants to update the package list from Slamd64 version 11.0 (arch x86\_64). To do that, just type + +\begin{verbatim} +ARCH=x86_64 VERSION=11.0 simplaret update +\end{verbatim} + +This command grabs the Slamd64 package list without confliting in any way with the standard and already downloaded i386 Slackware package list. This doesn't happens because simplaret stores metadata from different archs and versions at different folders. + +Its optional to pass ARCH and VERSION environment variables to simplaret. If one or none of them was specified, simplaret uses the standar system value, obtained from the file /etc/slackware-version, or uses config parameters to do that. + +As an example, to search for a package in the arch powerpc (Slackintosh) version 11.0, just type + +\begin{verbatim} +ARCH=powerpc VERSION=11.0 simplaret search package-name +\end{verbatim} + +All command previously mentioned can work that way, except those that install or remove packages as its dangerous to mix packages from different archs and versions in the same system. + +\section{Working with multiple installations} + +The previously section mentions a feature that just makes sense in systems where there's more than one slackware-like installation using different archs and versions. + +Say you have a x86\_64 machine with three installed systems: + +\begin{enumerate} + \item Slamd64 11.0 at the root folder + \item Slackware 11.0 at /mnt/slackware-1 + \item Slackware 10.2 at /mnt/slackware-2 +\end{enumerate} + +In the case of package install or patch retrieval and application, simplaret supports the environment variable ROOT to specify which folder simplaret should look for a system. + +Then, to install a package at /mnt/slackware-1, just type + +\begin{verbatim} +ARCH=i386 VERSION=11.0 simplaret update +ROOT=/mnt/slackware-1 simplaret install package-name +\end{verbatim} + +The first command just updates the package list and the second makes simplepkg install the package with using /mnt/slackware-1 arch and version. If you want to do the same at /mnt/slackware-2, use the analogous command + +\begin{verbatim} +ARCH=i386 VERSION=10.2 simplaret update +ROOT=/mnt/slackware-2 simplaret install package-name +\end{verbatim} + +There's also a feature to make patch retrieval and application with just one command, using the file /etc/simplepkg/jailist. This file is used by simplepkg's mkjail script to store with jails you have on your system but is also used by simplaret to upgrade all jails with just one command. + +Considering that your box has the three previously mentioned slackware installation. Then, to add /mnt/slackware-1 and /mnt/slackware-2 in the automatic upgrade list, add the following lines in your /etc/simplepkg/jailist (without spaces): + +\begin{verbatim} +/mnt/slackware-1 +/mnt/slackware-2 +\end{verbatim} + +The root system doesn't need to be added in this file. Then, you can get the patches for all your three systems with the command + +\begin{verbatim} +simplaret get-patches +\end{verbatim} + +To get the patches and/or apply them in all jails (including the root system), use + +\begin{verbatim} +simplaret upgrade +\end{verbatim} + +This feature makes easier to keep all your installations always upgraded. + +\section{The repos.conf file} + +Now that we just talked about all simplaret features, its time to take a tour at its configuration files. The first one we'll say about is the repository definition file, /etc/simplepkg/repos.conf. + +If you don't mind to make an advanced simplaret usage, then probably you can just leave this section as the default config should work for almost all standard situations and you'll just need to edit repos.conf to change repository priorities. + +The repos.conf file contains one repository definition per line using the following syntax: + +\begin{verbatim} +TYPE[-ARCH][-VERSION]="name%URL" +\end{verbatim} + +The content in brackets are optional depending on the repository type as we'll see later in this section. The repository types supported by simplaret are: + +\subsection{PATCHES} + +PATCHES: used for repositories containing patches and which file metadata is the file FILE\_LIST instead the standard FILELIST.TXT; example: + +\begin{verbatim} +PATCHES-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/patches/" +\end{verbatim} + +This defines a patches repository for arch i386 (official Slackware), version 11.0 and named as "sarava". + +Its optional to have a PATCHES definition in order to get patches: the ROOT repository definition just take care of that and you'll just need to use a PATCHES definition if you want to give precedence to some patches repository over all other definition types. + +\subsection{ROOT} + +ROOT: this type specifies the default slackware-like repository, where the content is sorted by version. An official slackware repository then is defined as + +\begin{verbatim} +ROOT-i386="tds%http://slackware.mirrors.tds.net/pub/slackware/" +\end{verbatim} + +ROOT repositories needs just the arch definition, a name and an URL. In the previous case, we have a ROOT repository called "tds". It doesn't need any version information as its already considers tha the content is sorted in folders like http://slackware.mirrors.tds.net/pub/slackware/slackware-10.2/ and http://slackware.mirrors.tds.net/pub/slackware/slackware-11.0/. + +\subsection{REPOS} + +REPOS: this repository type ir arch and version oriented, like + +\begin{verbatim} +REPOS-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/" +\end{verbatim} + +In the above case, a repository called "sarava" is defined using arch i386 and version 11.0 with URL http://slack.sarava.org/packages/slackware/slackware-11.0/. This repository type is recommended when using non-official repositories. + +\subsection{NOARCH} + +NOARCH: the last type is used to define repositories where packages are arch and version independent, like + +\begin{verbatim} +NOARCH="sarava%http://slack.sarava.org/packages/noarch" +\end{verbatim} + +In any repository type, the supperted URL schemes are http://, ftp:// or file:// (for local repositories). + +\section{Repository order and precedence} + +As simplaret supports more than one repository definition for each type, arch or version, each definition has its own name. Definitions can have the same name just if they're dont use the same repository type and/or arch and version. + +There's also a priority rule between the repository types wich defines a precedence order. Repositories are searched according the following order: + +\begin{itemize} + \item PATCHES has the highest priority: if a package from a given arch and version is not found in the first (if existent) PATCHES definition, then the next one is searched until all PATCHES definitions are searched. + \item Then, the package is searched in all ROOT defintions in the order they appear at repos.conf. + \item The next searched repository type is REPOS in the specified arch an version, in the order they appear at repos.conf. + \item At last, NOARCH type is searched in the order they're defined. +\end{itemize} + +In the case you're issuing an upgrade or just geting patches, simplaret by default will just search in PATCHES and ROOT definitions. + +At REPOS and ROOT is also possible to specify its internal search order according its subfolders. + +\section{Configuration file simplepkg.conf} + +Simplaret also stores its configurations inside simplepkg's configuration file /etc/simplepkg/simplepkg.conf. This file is well commented and you should find there a description of all supported options. + +\section{But why use that?} + +You may ask why someone wishes to use such tool. + +Simplaret was written with a *x86 environment in mind, where lots of jails with different archs and versions are installed. Suppose a x86\_64 with the following chroots installed: + +\begin{itemize} + \item slamd64 11.0 + \item slackware 10.0 + \item slackware 11.0 with additional i686 packages + \item uSlack (i386 uClibc) +\end{itemize} + +Keep all this stuff update manually is really a headache. Simplaret just tries to make it trivial. + +\section{Additional information} + +Simplaret was written by Silvio Rhatto (rhatto at riseup.net) and is released under GPL license. The code can be obtained from the subversion repository: + +\begin{verbatim} +svn checkout svn://slack.sarava.org/simplepkg +\end{verbatim} + +Simplepkg's wiki is http://slack.sarava.org/trac/wiki/Simplepkg and its mailing list address is http://listas.sarava.org/wws/info/slack. + +\end{document} diff --git a/tags/0.6rc1/doc/simplaret-pt_BR.tex b/tags/0.6rc1/doc/simplaret-pt_BR.tex new file mode 100644 index 0000000..986dbb0 --- /dev/null +++ b/tags/0.6rc1/doc/simplaret-pt_BR.tex @@ -0,0 +1,376 @@ +\documentclass{article} +\usepackage[brazilian]{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphics} +\usepackage{hyperref} +\usepackage{html,makeid} + +\title{Simplaret: ferramenta para obtenção de pacotes} +\author{Silvio Rhatto} + +\begin{document}\label{start} +\maketitle + +\begin{abstract} +O \emph{simplaret} é a ferramenta do \htmladdnormallink{simplepkg}{http://slack.sarava.org/node/12} utilizada para obter pacotes de repositórios locais ou remotos. Com ele, você pode não só baixar pacotes do seu sistema \emph{slackware} como também pode baixar de qualquer versão ou arquitetura cujo repositório siga os \htmladdnormallink{Mirror Guidelines do Slackware}{http://www.slackware.com/getslack/mirroring_guidelines.txt}, permitindo que você gerencie facilmente todas as suas jaulas e instalações de Slackware, independentemente da arquitetura ou versão que elas utilizem. English version \htmladdnormallink{here}{/node/17}. + +Além da obtenção, o \emph{simplaret} ainda pode fazer a instalação, a remoção ou a atualização dos pacotes de um sistema e também das demais jaulas existentes numa máquina. O simplaret é totalmente não-intrusivo no sistema e roda sobre o pkgtool. +\end{abstract} + +\section{Obtendo e instalando} + +O \emph{simplaret} acompanha o \htmladdnormallink{simplepkg}{http://slack.sarava.org/node/12} e por isso sua instalação é feita baixando o pacote do simplepkg +em \htmladdnormallink{http://slack.sarava.org/packages/noarch/}{http://slack.sarava.org/packages/noarch/} e em seguida instalando-o com o comando + +\begin{verbatim} +installpkg simplepkg-VERSAO-noarch-BUILD.tgz +\end{verbatim} + +A partir daí você já pode utilizar o \emph{simplaret} para baixar pacotes dos repositórios padrão ou então alterar a lista de repositórios do arquivo \emph{/etc/simplepkg/repos.conf} ou a configuração do aplicativo pelo arquivo \emph{/etc/simplepkg/simplepkg.conf}. + +A configuração padrão de repositórios no simplaret se encontra em \emph{/etc/simplepkg/defaults/repos.conf}, mas não recomendamos você editá-la. Use, ao invés disso, o \emph{/etc/simplepkg/repos.conf} para sua configuração personalizada: se o simplaret encontrar esse arquivo, ele simplesmente ingorará as definições padrão de repositório. + +\section{Usando o simplaret} + +Em geral, como o \emph{simplaret} armazena as informações em pastas do sistema, algumas funcionalidades só estarão disponíveis quando o mesmo é rodado pelo superusuário do sistema. + +Antes de explorar todas as funcionalidades do \emph{simplaret}, é necessário atualizar a lista de pacotes para sua arquitetura e versão, o que pode ser feito com o comando + +\begin{verbatim} +simplaret --update +\end{verbatim} + +ou simplesmente + +\begin{verbatim} +simplaret update +\end{verbatim} + +já que o \emph{simplaret} suporta que suas opções básicas de linha de comando sejam passas precedidas por dois hífens ou não (\emph{--update} ou \emph{update}). + +Depois de atualizar a lista de pacotes, experimente buscar por um pacote com um comando do tipo + +\begin{verbatim} +simplaret search ekiga +\end{verbatim} + +O resultado pode ser algo do tipo + +\begin{verbatim} +REPOS repository sarava, arch: i386, version: 11.0: ekiga-2.0.5-i586-1rd.tgz +\end{verbatim} + +Como veremos adiante, "REPOS" significa o tipo de repositório, "sarava" é o nome do +repositório, "arch" mostra a arquitetura do pacote e do repositório (\emph{i386}, no caso) +e "version" a versão do repositório (\emph{11.0}, no caso). + +Para instalar esse pacote, basta o comando + +\begin{verbatim} +simplaret install ekiga +\end{verbatim} + +Por padrão, se o \emph{simplaret} encontrar no repositório um arquivo \emph{slack-required} referente ao pacote en questão (ou seja, um arquivo \emph{ekiga.slack-required} na mesma pasta que o pacote do ekiga, neste caso), então o \emph{simplaret} tentará instalar todos os requisitos contidos nesse slack-required, caso já não estejam instalados no sistema. Essa resolução de dependências automática pode, no entanto, ser desabilitada através de um parâmetro de configuração, como veremos a seguir. + +Se você apenas quiser baixar o pacote, digite apenas + +\begin{verbatim} +simplaret get ekiga +\end{verbatim} + +No caso do \emph{simplaret} encontrar mais de um pacote com o mesmo nome, ele baixará na ordem que a opção "search" listá-los, sendo que essa precedência é definida de acordo com a ordem em que os repositórios estão listados no arquivo de configuração. Por exemplo, o comando + +\begin{verbatim} +simplaret search kernel-generic +\end{verbatim} + +pode retornar algo como + +\begin{verbatim} +ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.17.13-i486-1.tgz +ROOT repository sarava, arch: i386, version: 11.0: kernel-generic-2.6.18-i486-1.tgz +\end{verbatim} + +Assim, o comando + +\begin{verbatim} +simplaret install kernel-generic +\end{verbatim} + +instalará o pacote "kernel-generic-2.6.17.13-i486-1.tgz" ao invés do pacote "kernel-generic-2.6.18-i486-1.tgz". Caso você queira forçar a instalação do segundo pacote, basta especificá-lo com o nome completo: + +\begin{verbatim} +simplaret install kernel-generic-2.6.18-i486-1.tgz +\end{verbatim} + +Se um pacote já estiver instalado no sistema, a opção install fará o upgrade do mesmo, caso a versão ou o build number do pacote presente no repositório for diferente da instalada no sistema. Assim, o comando + +\begin{verbatim} +simplaret install simplepkg +\end{verbatim} + +atualiza o simplepkg caso haja uma nova versão disponível nalgum repositório. + +Para remover um pacote, digite + +\begin{verbatim} +simplaret remove nome-do-pacote +\end{verbatim} + +o que na verdade é apenas uma chamada indireta ao removepkg. + +O \emph{simplaret} armazena pacotes baixados de repositórios numa pasta local do sistema, que por padrão é \emph{/var/simplaret}. Conforme você vai baixando e instalando pacotes, essa pasta tende a crescer e ocupar muito espaço. Para apagar os pacotes, basta usar o comando + +\begin{verbatim} +simplaret purge +\end{verbatim} + +Isso apagará apenas os pacotes da arquitetura e versão usadas atualmente. Detalhes de como apagar os pacotes de todas a arquiteturas e versões serão dados numa seção seguinte. + +Você também pode forçar o \emph{simplaret} a apagar apenas pacotes antigos. O comando a seguir apaga apenas os pacotes baixados a três semanas ou mais (ou seja, os pacotes baixados a menos de três semanas continuam armazenados): + +\begin{verbatim} +simplaret purge -w 3 +\end{verbatim} + +\section{Baixando patches e atualizando o sistema} + +O \emph{simplaret} possui, além do básico do gerenciamento de pacotes, duas funcionalidades adicionais: a obtenção e a aplicação de patches (pacotes contendo atualizações e correções de segurança). + +Assumindo que os repositórios contendo patches para sua distribuição do tipo Slackware estejam corretamente configurados, o que ocorre com a configuração padrão que acompanha o \emph{simplepkg} e que veremos a seguir como alterá-la, você pode baixar os patches disponíveis para o seu sistema com o comando + +\begin{verbatim} +simplaret get-patches +\end{verbatim} + +Se você quiser não só baixar mas também atualizar seu sistema, isto é, fazer um upgrade com os patches disponíveis, use + +\begin{verbatim} +simplaret upgrade +\end{verbatim} + +\section{Trabalhando com múltiplas arquiteturas e versões} + +Até aqui vimos apenas o que é a obrigação de qualquer sistema de gerenciamento de pacotes possuir: obtenção de pacotes, instalação, busca e atualização do sistema. O que diferencia o \emph{simplaret} das outras ferramentas, além do esquema de resolução de dependências, é sua capacidade de lidar simultaneamente com múltiplas arquiteturas, versões e até instalações de sistemas do tipo Slackware. + +O uso dos seguintes comandos só fará sentido à luz da próxima seção, onde trataremos a respeito de múltiplas instalações e jaulas num mesmo computador, porém é um pré-requisito para entendê-la. + +Supondo que você esteja rodando Slackware (arquitetura \emph{i386}) mas que queira atualizar a lista de pacotes do sistema Slamd64 versão \emph{11.0} (arquitetura \emph{x86\_64}), basta usar o comando + +\begin{verbatim} +ARCH=x86_64 VERSION=11.0 simplaret update +\end{verbatim} + +Esse comando baixará a lista de pacotes para o Slamd64 sem conflitar de nenhuma forma com a lista e os pacotes já baixados para o Slackware. Isso acontece porque o \emph{simplaret} armazena as informações e os pacotes de cada repositório em pastas próprias, organizadas de acordo com a arquitetura e versão. + +Passar as variaveis \emph{ARCH} e \emph{VERSION} para o \emph{simplaret} é opcional. Se qualquer uma delas não foi especificada, o \emph{simplaret} utilizará o valor padrão do seu sistema, usualmente obtido do arquivo \emph{/etc/slackware-version} ou então especificada através do arquivo de configuração do simplepkg. + +Por exemplo, para pesquisar por um pacote da arquitetura powerpc (distribuição Slackintosh) na versão \emph{11.0}, basta o comando + +\begin{verbatim} +ARCH=powerpc VERSION=11.0 simplaret search nome-do-pacote +\end{verbatim} + +Todos os comandos apresentados anteriormente funcionarão dessa maneira, à exceção daqueles que instalam ou fazer a atualização de pacotes, já que em geral é destrutivo misturar pacotes de arquiteturas e versões diferentes num mesmo sistema. + +\section{Trabalhando com múltiplas instalações} + +A funcionalidade apresentada na seção anterior só faz sentido quando existirem sistemas, jaulas e/ou vservers instalados num mesmo computador. + +Suponha que você possua uma máquina \emph{x86\_64} com três sistemas instalados: + + - Slamd64 \emph{11.0} na raíz + - Slackware \emph{11.0} em \emph{/mnt/slackware-1} + - Slackware \emph{10.2} em \emph{/mnt/slackware-2} + +No caso da instalação de pacotes, da obtenção e aplicação de atualizações, o \emph{simplaret} suporta a variável de ambiente ROOT para especificar qual é a pasta na qual o \emph{simplaret} deve buscar o sistema. + +Para instalar um pacote no Slackware contido em /mnt/slackware-1, basta usar os comandos + +\begin{verbatim} +ARCH=i386 VERSION=11.0 simplaret update +ROOT=/mnt/slackware-1 simplaret install nome-do-pacote +\end{verbatim} + +O primeiro comando apenas atualiza a lista de pacotes e o segundo faz com que o \emph{simplaret} baixe o pacote da arquitetura e versão do sistema presente em \emph{/mnt/slackware-1} bem como efetue sua instalação. + +Para o caso da instalação em \emph{/mnt/slackware-2}, o uso é análogo: + +\begin{verbatim} +ARCH=i386 VERSION=10.2 simplaret update +ROOT=/mnt/slackware-2 simplaret install nome-do-pacote +\end{verbatim} + +Existe ainda uma facilidade para que a obtenção e aplicação de atualizações seja feita de forma única, através do arquivo \emph{/etc/simplepkg/jailist}. Esse arquivo serve, além de outros propósitos descritos na documentação do simplepkg, para que o \emph{simplaret} saiba de antemão quais são as instalações de sistema do tipo Slackware presentes numa máquina, além da instalação principal na raíz do sistema. + +Considerando que a máquina possua as três instalações citadas no início deste tópico, a atualização automática das mesmas pode ser feita quando o arquivo \emph{/etc/simplepkg/jailist} contiver as seguintes linhas (sem espaços no início de cada uma): + +\begin{verbatim} +/mnt/slackware-1 +/mnt/slackware-2 +\end{verbatim} + +O sistema principal, contido na raíz do sistema, não precisa estar listado nesse arquivo. Se todas as suas instalações de sistema do tipo Slackware estiverem constando corretamente no \emph{/etc/simplepkg/jailist}, o seguinte comando baixará as atualizações disponíveis para todas elas, incluindo o sistema contido na raíz: + +\begin{verbatim} +simplaret get-patches +\end{verbatim} + +Analogamente, o seguinte comando baixará e/ou aplicará todas as atualizações disponíveis em todas as instalações, incluindo o sistema contido na raíz: + +\begin{verbatim} +simplaret upgrade +\end{verbatim} + +Desse modo, o gerenciamento de pacotes numa máquina que contenha mais de uma instalação do tipo Slackware fica unificada e consequentemente simplificada. + +\section{O arquivo repos.conf} + +Agora que o comportamento do \emph{simplaret} foi delineado, é importante descrever o arquivo de definição de repositórios, o \emph{/etc/simplepkg/repos.conf}. Se você não pretende fazer um uso avançado do \emph{simplaret}, provavelmente pode deixar de ler esta e a próxima seção, já que para o uso corriqueiro do \emph{simplaret} você provavelmente não precisará alterar seu \emph{repos.conf}, a não ser que queira mudar o espelho de download dos seus pacotes ou montar um esquema avançado para a escolha e priorização de repositórios. + +O arquivo \emph{/etc/simplepkg/repos.conf} contém uma definição de repositório por linha e a sintaxe de cada uma delas é: + +\begin{verbatim} +TIPO[-ARQUITETURA][-VERSAO]="nome%URL" +\end{verbatim} + +O conteúdo demarcado por colchetes é opcional dependendo do tipo de repositório, como veremos a seguir. Os tipos de repositório aceitos pelo \emph{simplaret} são: + +\subsection{PATCHES} + +\emph{PATCHES}: definição para repositórios que contenham patches (pacotes de atualização) e cuja lista de arquivos é \emph{FILE\_LIST} e não \emph{FILELIST.TXT}; exemplo: + +\begin{verbatim} +PATCHES-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/patches/" +\end{verbatim} + +No caso da definição acima, temos um repositório de patches para a arquitetura \emph{i386} (distribuição Slackware), versão \emph{11.0} e o nome dado ao repositório é "sarava". + +Possuir uma definição do tipo \emph{PATCHES} é opcional para ter acesso às atualizações: a definição de repositório \emph{ROOT}, que veremos em seguida, já lida com patches: o tipo de repositório \emph{PATCHES} serve apenas se você quiser utilizar algum repositório não-oficial como fonte de patches prioritária, já que repositório \emph{PATCHES} são pesquisados pelo \emph{simplaret} antes de qualquer outro. + +Em resumo, se você não tiver um bom motivo para usar esse tipo de repositório, evite-o. + +\subsection{ROOT} + +\emph{ROOT}: são tipos de repositórios cujo conteúdo está dividido por versão. O exemplo tradicional deste caso é o próprio repositório oficial das distribuições: + +\begin{verbatim} +ROOT-i386="tds%http://slackware.mirrors.tds.net/pub/slackware/" +\end{verbatim} + +Repositórios \emph{ROOT} necessitam apenas de uma definição de arquitetura, um nome e uma URL. No caso acima, temos a definição de repositório \emph{ROOT} de nome "tds", ou seja, não há definição de versão, já que o \emph{simplaret} considerará que a versão desejada está numa subpasta dessa URL. Ou seja, definições ROOT implicam que as pastas contendo pacotes de cada versão estejam bem separadas, ou seja, pastas como http://slackware.mirrors.tds.net/pub/slackware/slackware-10.2/ e http://slackware.mirrors.tds.net/pub/slackware/slackware-11.0/. + +\subsection{REPOS} + +\emph{REPOS}: este tipo de repositório é orientado a arquitetura e versão, como por exemplo + +\begin{verbatim} +REPOS-i386-11.0="sarava%http://slack.sarava.org/packages/slackware/slackware-11.0/" +\end{verbatim} + +No caso acima, um repositório de nome "sarava" é definido para a arquitetura \emph{i386} e versão \emph{11.0} com a URL http://slack.sarava.org/packages/slackware/slackware-11.0/. Esse tipo de definição é recomendado para repositórios não-oficiais. + +\subsection{NOARCH} + +\emph{NOARCH}: o último tipo de definição é usado para repositórios cujos pacotes são independentes de arquitetura e versão da distribuição. Como exemplo temos um repositório do Projeto Slack: + +\begin{verbatim} +NOARCH="sarava%http://slack.sarava.org/packages/noarch" +\end{verbatim} + +Em qualquer tipo de repositório, a URL pode ser do tipo http://, ftp:// ou file:// (para repositórios locais). + +\section{Ordem e precedência em repositórios} + +Como podem haver mais de uma definição de repositório para cada tipo, versão e/ou arquitetura, as mesmas são diferenciadas de acordo com o nome. Definições de repositório podem ter nomes idênticos, desde que se refiram a tipo de repositório e/ou arquitetura e versão diferentes. + +Existe ainda uma prioridade dentre tipos de repositório e ordens de precedência. Numa pesquisa, repositórios são pesquisados de acordo com a seguinte ordem: + +\begin{enumerate} +\item \emph{PATCHES} tem prioridade mais alta: caso um pacote de uma dada arquitetura e versão não seja encontrado no primeiro repositório \emph{PATCHES} do \emph{repos.conf}, o próximo repositório definido na ordem em que ele aparece no arquivo é pesquisado, e assim por diante. +\item Em seguida, pacotes são procurados nas definições \emph{ROOT} da arquitetura em questão, na ordem em que aparecem no \emph{repos.conf}. +\item Depois, são os pacotes de repositórios \emph{REPOS} daquela arquitetura e versão são pesquisados, na ordem em que aparecem no repos.conf. +\item Por fim, repositórios \emph{NOARCH} são pesquisados, na ordem em que são definidos. +\end{enumerate} + +Em resumo, o \emph{simplaret} tem uma ordem de precedência e execução de repositórios e para busca e obtenção de pacotes: pacotes são exibidos de acordo com a ordem e precedência descritas acima. No caso da ontenção de pacotes, o primeiro repositório que possuí-lo será utilizado, isto é, caso o pacote não for solicitado explicitamente com seu nome de arquivo completo mas sim apenas com seu nome. + +No caso da obtenção de patches, por padrão apenas repositórios do tipo \emph{PATCHES} e \emph{ROOT} são pesquisados, a não ser que isso seja configurado como contrário. + +Em repositórios do tipo \emph{REPOS} e \emph{ROOT} ainda é possível, através de parâmetros de configuração, explicitar a ordem de pastas que são pesquisadas dentro dos repositórios, algo que veremos a seguir e facilita no caso do usuário estar interessado em dar prioridade para aplicativos em fase de testes (usualmente armazenados na pasta testing/) ou pacotes antigos (pasture). + +\section{Parâmetros de configuração do simplepkg.conf} + +Nesta seção os parâmetros do arquivo de configuração \emph{/etc/simplepkg/simplepkg.conf} relevantes ao \emph{simplaret} estão descritos. Para uma lista completa de todos os parâmetros disponíveis, consulte o simplepkg.conf contido no pacote do simplepkg. Aqui estão descritos apenas os principais, que são: + +\begin{itemize} +\item \emph{STORAGE}: local de armazenameto dos pacotes baixados e das informações de repositório. O valor padrão é \emph{/var/simplaret/packages}. + +\item \emph{PATCHES\_DIR}: local de armazenamento de pacotes que são patches (atualizações), isto é, o local de armazenamento de pacotes de repositórios do tipo PATCHES (e eventualmente de patches encontrados em repositórios do tipo \emph{ROOT}, como veremos a seguir). O valor padrão é \emph{/var/simplaret/patches}. + +\item \emph{SIMPLARET\_DOWNLOAD\_FROM\_NEXT\_REPO}: indica se o \emph{simplaret} deve tentar baixar um pacote do próximo repositório (caso exista) quando o download do repositório atual tiver falhado. Valores possíveis são "1" ou "yes" para habilitar a opção (que é o comportamento padrão) ou "0" ou "no" para desabilitá-la. + +\item \emph{SIMPLARET\_PURGE\_PATCHES}: indica se o conteúdo da pasta de patches também deve ser apagado quando o comando "simplaret --purge" é chamado. Use "yes" ou "1" para habilitar e "no" ou "0" para desabilitar. O valor padrão é "1". + +\item \emph{SIMPLARET\_PURGE\_WEEKS}: controla o número de semanas a partir do qual o \emph{simplaret} irá apagar pacotes quando chamado com o comando "simplaret --purge", o que é equivalente a usar o comando "simplaret --purge -w N". O valor padrão é "3". Para desabilitar essa opção, atribua o valor "0". + +\item \emph{PASSIVE\_FTP}: Indica se o \emph{simplaret} deve fazer as transferências de FTP no modo passivo. O valor padrão é "1" (habilitado). + +\item \emph{HTTP\_TOOL}: especifica qual a ferramenta para obtenção de arquivos via protocolo HTTP. As opções disponíveis são "curl" e "wget", sendo que a opção padrão é "curl". + +\item \emph{FTP\_TOOL}: especifica qual a ferramenta para obtenção de arquivos via protocolo FTP. As opções disponíveis são "curl", "wget" e "ncftpget", sendo que a opção padrão é "curl". + +\item \emph{CONNECT\_TIMEOUT}: tempo máximo de espera para uma conexão de rede, dado em segundos. O valor padrão é "20". + +\item \emph{ROOT\_PRIORITY}: especifica a ordem de prioridades das pastas de repositórios do tipo \emph{ROOT} numa pesquisa. O valor padrão é "patches slackware extra testing pasture", indicando que a pasta de patches tem precedência sobre todas as outras no repositório, sendo seguida pela pasta slackware e depois pelas extra, testing e pasture. Como podem existir nomes de pacotes idênticos nessas pastas, o estabelecimento de uma ordem se faz necessária. + +\item \emph{REPOS\_PRIORITY}: da mesma forma como repositorios \emph{ROOT} necessitam de uma prioridade de pesquisa em pastas, este parâmetro de configuração especifica a prioridade de pastas em repositórios do tipo \emph{REPOS}. O valor padrão é "patches slackware extra testing pasture". + +\item \emph{SIGNATURE\_CHECKING}: indica se o \emph{simplaret} deve checar pela assinatura dos pacotes baixados, caso ela esteja disponível. Você deve ter a chave pública do distribuidor dos pacotes no seu chaveiro. O valor padrão é "0" (desabilitado). + +\item \emph{DEPENDENCY\_CHECKING}: indica se o \emph{simplaret} deve trabalhar com a resuloção de dependências caso ele encontre, no repositório, um arquivo slack-required correspondente ao pacote que está sendo instalado. O valor padrão é "1" (habilitado). + +\item \emph{DOWNLOAD\_EVEN\_APPLIED\_PATCHES}: indica de o \emph{simplaret} deve baixar todos os patches disponíveis a uma dada instalação de sistema do tipo Slackware, mesmo que os mesmo já se encontrem aplicados. Esta opção é útil se você quiser manter uma cópia local das atualizações existentes para seu sistema. O valor padrão é "0" (desabilitado). + +\item \emph{CONSIDER\_ALL\_PACKAGES\_AS\_PATCHES}: especifica se o \emph{simplaret} deve, durante a obtenção de pacotes de atualização, procurar por atualizações também nos tipos de repositórios \emph{REPOS} e \emph{NOARCH}. Com essa opção, o \emph{simplaret} faz uma pesquisa pelo pacote e, se sua versão ou buildnumber da primeira ocorrência não bater com as do pacote atualmente instalado, ele baixa e o aplica, mesmo que seja um pacote de repositórios do tipo \emph{REPOS} ou \emph{NOARCH}. O valor padrão é "0" (desabilitado). O uso dessa opção não é muito recomendado por poder causar confusão e deixar o \emph{simplaret} mais lento, mas pode ser útil caso você esteja usando um repositório não-oficial que sempre atualiza seus pacotes. + +\item \emph{STORE\_ROOT\_PATCHES\_ON\_PATCHES\_DIR}: controla se o \emph{simplaret} deve armazenar os patches baixados de repositórios do tipo \emph{ROOT} na mesma pasta de armazenamento de patches provenientes de repositórios do tipo \emph{PATCHES}. É uma opção útil apenas se você quiser manter todos os patches de repositórios \emph{ROOT} e \emph{PATCHES} num mesmo local. O valor padrão é "0" (desabilitado). +\end{itemize} + +Vale lembrar que todas as opções booleanas (isto é, que podem ser apenas habilitadas ou desabilitadas) +do simplepkg.conf tem os seguintes valores permitidos: "1" e "yes" para habilitado e "0" ou "no" para +desabilitado. + +\section{Mas pra quê serve isso?} + +Você pode estar se perguntando: para que mais um gerenciador de pacotes para o Slackware e quem utilizaria +uma ferramenta que baixa pacotes de várias arquiteturas? + +O \emph{simplaret} foi escrito tendo em mente um ambiente \emph{*86} onde várias \emph{jaulas} de diferentes arquiteturas estão instaladas. Suponha por exemplo uma máquina \emph{x86\_64} que possua as seguintes jaulas: + +\begin{itemize} + \item slamd64 \emph{11.0} + \item slackware \emph{11.0} + \item slackware \emph{11.0} com pacotes adicionais em \emph{i686} + \item \htmladdnormallink{uSlack}{http://gnuden.sarava.org} (\emph{uClibc para i386}) +\end{itemize} + +O condenado/a em questão que roda todas essas jaulas, pelos mais diversos motivos, pode ter uma grande dor de cabeça para manter os pacotes em ordem de forma manual. Com o \emph{simplaret} e eventualmente com o \emph{simplepkg}, a tarefa se torna trivial. + +Além disso, as inúmeras novas tecnologias de virtualização poderão necessitar de um sistema de gerenciamento de pacotes que trabalha simultaneamente com múltiplas arquiteturas e versões. + +Mesmo que você possua apenas um único sistema do tipo Slackware em seu computador ou trabalhe apenas com uma única arquitetura e/ou versão, o \emph{simplaret} possui todas as funcionalidades necessárias para facilitar seu dia-a-dia de gerenciamento de pacotes. + +\section{Mais informações} + +O \emph{simplaret} foi escrito por Silvio Rhatto (rhatto at riseup.net) e é disponibilizado dentro do pacote do +simplepkg e sob a licença GPL. Para obter o código fonte, digite + +\begin{verbatim} +svn checkout http://slack.sarava.org/simplepkg +\end{verbatim} + +O wiki de desenvolvimento é \htmladdnormallink{http://slack.sarava.org/trac/wiki/Simplepkg}{http://slack.sarava.org/trac/wiki/Simplepkg} e o endereço da lista de discussão utilizada para discussões sobre \emph{simplaret}, simplepkg ou mesmo distribuições e pacotes do tipo Slackware é \htmladdnormallink{http://listas.sarava.org/wws/info/slack}{http://listas.sarava.org/wws/info/slack}. + +\end{document} + diff --git a/tags/0.6rc1/doc/simplepkg-en.tex b/tags/0.6rc1/doc/simplepkg-en.tex new file mode 100644 index 0000000..4d32876 --- /dev/null +++ b/tags/0.6rc1/doc/simplepkg-en.tex @@ -0,0 +1,390 @@ +\documentclass{article} +\usepackage[brazilian]{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphics} +\usepackage{hyperref} +\usepackage{html,makeid} + +\title{Simplepkg: installation manager and packaging system} +\author{Silvio Rhatto} + +\begin{document}\label{start} +\maketitle + +\begin{abstract} +Simplepkg is a non-intrusive management system running on top of pkgtool made of a set of scripts which helps the sysadmin and developing cycles of an slackware system. It can be used to create packages and repositories as long as the operational system installation and config file change tracking. Portuguese documentation \htmladdnormallink{here}{/simplepkg}. +\end{abstract} + +\section{Description} + +All GNU/Linux distributions comes with a well developed packaging system. The question now is how pratical is the way to install, configure and control any changes in a system. + +As an example, suppose you should keep a list of about 200 slackware machines, some of them used as desktops, others as mail or webservers. If you lost some hardrives or usually need to re-install or update some of those boxes. + +Using the slackware installation cd and configuring by hand all the time you got a crash is a time loss activity and you'll never know if something remained missconfigured. An alternative is to keep a complete backup of a machine or some parts of the tree, but for a large number of different boxes this procedure costs a lots of resources. + +Simplepkg offers an alternative sollution for this and other problems related to installation management, allowing you to keep templates of each machine and install a custom slackware system with just one or a few commands. Creating and upgrading chroot and vservers is easy with simplepkg. + +Package and installation management is not everything simplepkg can do. It can also be used to create vservers, create packages and store system configuration files in a subversion repository. + +Simplepkg works with any (official or not) slackware port that follows the minimum system guidelines. + +\section{Architecture} + +Simplepkg is a set of scripts wrote in the KISS philosophy. Its a pretty simple system, composed by the following commands: + +\begin{itemize} + \item mkjail: build a slackware jail/installation in a folder + \item templatepkg: create or update a package list of an installation template + \item lspkg: show installed packages and its contents + \item jail-commit: update all configuration files of a template + \item jail-update: jail-commit counterpart + \item rebuildpkg: rebuild a package based on its /var/log/packages entry + \item simplaret: package retrieval tool + \item createpkg: donwload, compile and package creation script + \item repos: creates and manages binary repositories + \item mkbuild: app to build slackware build scripts +\end{itemize} + +\section{Installation} + +The latest version of simplepkg is locate at \htmladdnormallink{http://slack.sarava.org/packages/noarch/}{http://slack.sarava.org/packages/noarch/}. Install it with the usual way: + +\begin{verbatim} +installpkg simplepkg-VERSION-noarch-BUILD.tgz +\end{verbatim} + +\section{Simplepkg usage} + +The three main simplepkg uses are: + +\begin{itemize} + \item Package managemen + \item Jail/installation creation and management + \item Package creation +\end{itemize} + +Package management is made with simplaret app, whose behaviour is detailed in its own document. The following sections will only show how simplepkg can be used to manage jails and template and create packages. + +\section{Creating templates} + +Initially, simplepkg was built to help slackware install automation. To do that, it uses installation templates -- lists of installed packages, post-installation scripts and config files -- allowing the creation of installation profiles that can be used for system replication in other partition or even custom chroot building. + +Template creation is done with "templatepkg" script. To create a template called "my-slackware" containig the installed package list of your slackware installation, just type + +\begin{verbatim} +templatepkg -c my-slackware +\end{verbatim} + +The -c (or --create) flag tells templatepkg to create the /etc/simplepkg/templates/my-slackware folder with the following components: + +\begin{itemize} + \item /etc/simplepkg/templates/my-slackware/my-slackware.d: template config files + \item /etc/simplepkg/templates/my-slackware/my-slackware.s: post-installation scripts + \item /etc/simplepkg/templates/my-slackware/my-slackware.perms: metadata for config files + \item /etc/simplepkg/templates/my-slackware/my-slackware.template: installaed package list +\end{itemize} + +This four components are enough to store all slackware installation characteristics: the package list controls with applications are installed, the config file folder can contain all desired configurations for any installed application and the post-installation scripts take care of all procedures that should be executed exactly after the system installation. The my-slackware.perms file contains metadata for the saved config files, i.e, permission and ownership. + +If you want to build a template from a installation placed in another folder or partition thats not your current root dir, just type something like + +\begin{verbatim} +templatepkg -c my-slackware /mnt/slackware +\end{verbatim} + +where /mnt/slackware is the place where this alternative system is installed. After created, the template will contain just the installed package list or that folder. As the folder /var/log/packages of your installation doesn't keep information about the package installation order, its recommended that you manually edit the template's package list. To do that, just type + +\begin{verbatim} +templatepkg -e my-slackware +\end{verbatim} + +To add configuration files inside the template, type something like + +\begin{verbatim} +templatepkg -a my-slackware /etc/hosts +\end{verbatim} + +This should add /etc/hosts file to "my-slackware" template. Beyond just automatically copy the file when you install a new system using this template, simplepkg can also take care of every change that /etc/hosts can suffer on your system, such as file content or permission and ownership change. If you're also storing your templates in a subversion repository, you'll be able to track all changes it ever had. + +WARNING: avoid the storage in a template of config files that contains important security information such as passwords or secret keys. The prefered place to put such stuff is a secured backup. + +\section{Creating jails and replicating installations} + +As long as your template was created and populated with the package list, configuration files and post-installation scripts (what will be treated in another section), your can replicate your slackware installation as simpler than typing the following command: + +\begin{verbatim} +mkjail jail my-slackware +\end{verbatim} + +This creates a fresh slackware tree at /vservers/jail with all packages listed in the template "my-slackware" and all saved config files. The package installation is made by simplaret app, that should be properly configured. The standard simplaret configuration should work for most situations. + +If you want to install your jail in a place other than /vservers (this standard location can be changed through simpleokg config file), say /mnt/hda2, just use something like that: + +\begin{verbatim} +ROOT=/mnt mkjail hda2 my-slackware +\end{verbatim} + +The above command does exactly what you think: installs slackware in /mnt/hda2 with exactly the same packages you have on your system, replacing the need of the slackware installer! + +In case no template specified, mkjail uses the one stored /etc/simplepkg/defaults, if exists. Simplepkg already came if some pre-built templates at /etc/simplepkg/defaults/templates. + +\section{Post-installation scripts} + +Optionally, its possible to keep post-installation scripts inside a template. Such scripts are executed by mkjail exactly after a jail is installed and the template config files copied. To create or edit a post-installation script, just type + +\begin{verbatim} +templatepkg -b my-slackware script-name.sh +\end{verbatim} + +This adds the script-name.sh at "my-slackware" template. Mkjail passes two command line arguments to a post-install script: the upward folder and the jail's name ("/mnt" and "hda2" from our previous example). Then, an example script is something like that: + +\begin{verbatim} +#!/bin/bash +chroot $1/$2/ sbin/ldconfig +\end{verbatim} + +\section{Listing template contents} + +To list available templates or the template content, use commands such as + +\begin{verbatim} +templatepkg -l +templatepkg -l my-slackware +\end{verbatim} + +\section{Removing files from a template} + +As you did to add files, you can easily remove then from a template, using a comand such as + +\begin{verbatim} +templatepkg -d my-slackware /etc/hosts +\end{verbatim} + +This removes the file /etc/hosts from "my-slackware" template. + +\section{Removing a template} + +To remove a template, just type + +\begin{verbatim} +templatepkg -r my-slackware +\end{verbatim} + +\section{Updating a template} + +Now that we just talked about creating templates and jails, its time to cover another application, this time used to keep a template always updated. Jail-commit is a script that copies all config file changes (content, permissions and ownership) from a installation to a simplepkg template. + +For instance, if one wants to copy all changes from /mnt/hda2 jail into "my-slackware" template, he or she just needs to type the following command: + +\begin{verbatim} +jail-commit /mnt/hda2 my-slackware +\end{verbatim} + +Not just the package list from "my-slackware" template is updated according the installed packages from /mnt/hda2/var/log/packages: all config files from "my-slackware" template are compared it the ones from the jail and in case of any difference they're copied from the jail back to the template. Permissions and file ownership commit into the template works at the same way. + +Jail-commit allows that a template to being kept always updated and mirroring the actual configuration of an installed system. But if you want just to commit into the template just the installed package list, simply type + +\begin{verbatim} +templatepkg -u my-template +\end{verbatim} + +To make life even easier, there's also a feature of keeping a list of all installed slackware system in the box in the file /etc/simplepkg/jailist. This file, despite its use by simplaret (what is described in its own text), allow jail-commit to run with no arguments. + +Suppose you have three slackware installations: the root system and two more: + +\begin{itemize} + \item /mnt/slackware-1 using "slackware-1" template + \item /mnt/slackware-2 using "slackware-2" template +\end{itemize} + +If your /etc/simplepkg/jailist has the following lines: + +\begin{verbatim} +/mnt/slackware-1 +/mnt/slackware-2 +\end{verbatim} + +then the command + +\begin{verbatim} +jail-commit +\end{verbatim} + +will update both "slackware-1" and "slackware-2" templates according, respectivelly, the contents of /mnt/slackware-1 and /mnt/slackware-2. If you also have a template called "main", then jail-commit will sync the contents of your root system with that template. + +You can even add the following line at root's crontab + +\begin{verbatim} +20 4 * * * jail-commit +\end{verbatim} + +so all your templates get updated everyday. If your system is configured to send emails, then crontab's jail-commit output you give a summary of yesterday changes your system suffered, both config file changes and package additions and removals. + +\section{Restoring changes in a jail} + +The opposite operation of jail-commit also is possible: suppose you edited some config files in your system but suddenly wants to go back and copy all config files from a template to your jail. To do that, just use the command + +\begin{verbatim} +jail-update /mnt/hda2 my-slackware +\end{verbatim} + +\section{Storing templates inside a Subversion repository} + +In order to increase once more the control and flexibility of template contents, simplepkg can also handle templates inside a subversion repository. To do that, edit first the config gile /etc/simplepkg/simplepkg.conf and set the parameter TEMPLATES\_UNDER\_SVN to "yes". + +Then, create a fresh subversion repository to keep your templates with a command like that: + +\begin{verbatim} +svnadmin create /var/svn/simplepkg --fs-type fsfs +\end{verbatim} + +Then, you just need to import your templates with + +\begin{verbatim} +templatepkg -e file:///var/svn/simplepkg +\end{verbatim} + +From now jail-commit will commit automatically any template changes to the svn repository. If, in the other hand, you wish to grab the changes from the svn repository to your local copy, use + +\begin{verbatim} +templatepkg -s +\end{verbatim} + +In case you want to import a template folder from an existing repository, use + +\begin{verbatim} +templatepkg -i file:///var/svn/simplepkg +\end{verbatim} + +where file:///var/svn/simplepkg is the repository path. + +\section{Upgrading jails} + +Jail and installed system upgrading is done through simplaret and also supports /etc/simplepkg/jailist file. +For more info on how it works, take a look at simplaret own documentation. + +\section{Different archs and versions} + +Simplepkg was idealized to permit a template to create jails from any architecture and version of a slackware-like system. Upgrading tasks also are unified. This feature just works if you use simplaret and not swaret as the package retrieval tool. + +As another example, to create an slack 10.1 installation (assuming your /etc/simplepkg/repos.conf with the right configuration), just type + +\begin{verbatim} +VERSION=10.1 mkjail my-jail server-template +\end{verbatim} + +Different archs can be used too. If you have a x86\_64 system and wants to install a slack 10.2 in a partition, try something like + +\begin{verbatim} +ARCH=i386 VERSION=10.2 ROOT=/mnt mkjail hda2 my-slackware +\end{verbatim} + +Note that the templates are arch and version independent, as they just contain package names, configuration files and scripts. For this reason, the commands templatepkg, metapkg, lspkg and jail-update can be used normaly. + +\section{Creating a package from a template} + +If, for any reason, you wish to build a package from an existing template, try the command + +\begin{verbatim} +templatepkg -p template-name +\end{verbatim} + +Although that should work smoothly, its not the recommended behaviour, as simplepkg was designed to deal easily with templates and repositories. + +\section{Building packages} + +Until now, we just showed simplepkg applications used to manage installations and packages. But simplepkg can also create packages using createpkg script: it downloads, builds and packages software that has an available script from a SlackBuild in a repository, working like a slackware ports system. + +Createpkg works with any SlackBuild repository but works better and is well integrated if they are compliant with the standards from http://slack.sarava.org/trac/wiki/SlackBuilds. + +Specifically, createpkg was built to use slackbuilds from http://slack.sarava.org/slackbuilds through a subversion repository. + +To fetch all scripts from slack.sarava.org, type + +\begin{verbatim} +createpkg --sync +\end{verbatim} + +Then, you can list all available script using + +\begin{verbatim} +createpkg --list +\end{verbatim} + +To search for a script, use something like + +\begin{verbatim} +createpkg --search latex2html +\end{verbatim} + +This searches for a SlackBuild for the program "latex2html". If you want to build that package, just type + +\begin{verbatim} +createpkg latex2html +\end{verbatim} + +The resulting package should be available at /tmp or at the folder specified by the environment variable \$REPOS. To create and install the package, type + +\begin{verbatim} +createpkg --install latex2html +\end{verbatim} + +If the package has dependencies listed in a slack-required file that aren't installed in the system, then createpkg will try to process then before the desired package's SlackBuild: if the dependencies aren't available in the SlackBuild tree, then createpkg will call simplaret and try to install the package from a binary repository. If you want to avoid createpkg's dependency checking, just use it with the flag --no-deps. + +For more information about createpkg, type + +\begin{verbatim} +createpkg --help +\end{verbatim} + +or take a look at http://slack.sarava.org/trac/wiki/SlackBuilds. + +\section{Auxiliar applications} + +Simplepkg comes also with the following tools: + +\begin{itemize} + \item lspkg: show installed packages and its contents + \item rebuildpkg: rebuild a package based on its /var/log/packages entry + \item repos: creates and manages binary repositories + \item mkbuild: app to build slackware build scripts +\end{itemize} + +The command lspkg is used to show installed packages. Also, Simplepkg comes with an additional helper tool that recover installed packages which the original .tgz file was lost. The command rebuildpkg rebuilds a package from their entry in /var/log/packages. As an example, + +\begin{verbatim} +rebuildpkg coreutils +\end{verbatim} + +rebuilds the coreutils package using the files, scripts and metainformations stored in /var/log/packages/ and /var/log/scripts/. + +For their time, scripts repos and mkbuild are used, respectivelly, to create and manage binary repositories and to create SlackBuild scripts. + +\section{Configuration parameters} + +Simplepkg's config file is /etc/simplepkg/simplepkg.conf and it keeps parameters used by all scripts. If you want to change some of its parameters, do not edit this file. Use /etc/simplepkg/simplepkg.conf instead as it overrides the default settings. + +In this section, we won't cover any parameter that's just used by simplaret, whose settings are covered in its own documentation. + +\begin{itemize} + \item JAIL\_ROOT: Where jails are placed by mkjail. Default: "/vservers". + \item ADD\_TO\_JAIL\_LIST: Wheter mkjial should add new jails to /etc/simplepkg/jailist. Default is "1" (enabled). + \item TEMPLATES\_UNDER\_SVN: Set to yes if your templates will be placed in a subversion repository. Default is "no" (disabled). + \item TEMPLATE\_FOLDER: Where your templates will be located. Default is "/etc/simplepkg/templates" and dont change it except you know what you're doing. + \item TEMPLATE\_STORAGE\_STYLE: This variable controls in which folder / subfolder your templates will be stored. Default value is "own-folder" and you'll just need to change that if you're storing your templates using an old simplepkg format and wants to keep compatibilty. +\end{itemize} + +Its important to note that all boolean parameters in the config file can be set either to "1" or "yes" to enable and "0" or "no" to disable. + +\section{Additional information} + +Simplepkg was written by Silvio Rhatto (rhatto at riseup.net) and is released under GPL license. The code can be obtained from the subversion repository: + +\begin{verbatim} +svn checkout http://slack.sarava.org/simplepkg +\end{verbatim} + +Simplepkg's wiki is http://slack.sarava.org/trac/wiki/Simplepkg and its mailing list address is http://listas.sarava.org/wws/info/slack. + +\end{document} diff --git a/tags/0.6rc1/doc/simplepkg-pt_BR.tex b/tags/0.6rc1/doc/simplepkg-pt_BR.tex new file mode 100644 index 0000000..a80f0e7 --- /dev/null +++ b/tags/0.6rc1/doc/simplepkg-pt_BR.tex @@ -0,0 +1,397 @@ +\documentclass{article} +\usepackage[brazilian]{babel} +\usepackage[latin1]{inputenc} +\usepackage[dvips]{graphics} +\usepackage{hyperref} +\usepackage{html,makeid} + +\title{Gerenciamento de instalações e metapacotes com o simplepkg} +\author{Silvio Rhatto} + +\begin{document}\label{start} +\maketitle + +\begin{abstract} +O \emph{simplepkg} é um sistema de gerenciamento de sistemas slackware que roda sobre o pkgtool. Ele é composto por vários scripts que desempenham funções de administração e desenvolvimento de sistemas do tipo Slackware, procurando fechar um circuito de produção, envolvendo a construção, a instalação de pacotes e até mesmo a instalação do sistema de forma automatizada. + +Do lado do desenvolvedor/a, ele ajuda na criação de SlackBuilds e construção de pacotes. Do lado do administrador/a, ele possibilita a instalação automatizada de sistemas, instalação de pacotes e a criação de "templates" de instalação -- que contém todos os arquivos de configuração, informações de permissões e scripts de pós-instalação de uma dada máquina ou jaula. +\end{abstract} + +\section{Descrição} + +Todas as distribuições de GNU/Linux já tem algum sistema de empacotamento amadurecido. A questão agora é a praticidade de instalar e controlar o que está instalado, tanto pacotes como arquivos de configuração de uma máquina, além da facilidade na criação de pacotes. + +Imagine por exemplo se você precisa manter uma lista de pacotes de 200 máquinas slackware, sendo que algumas são usadas como desktop, outras como servidores web, alguma sendo o servidor de email e assim por diante. Imagine agora que você perca o disco de algumas dessas máquinas ou que precise cotidianamente reinstalar ou atualizar um sistema. + +Usar o cd de instalação do slackware e configurar na mão toda a vez que der um pau faria com que você ficasse louco/a e desperdiçasse muito tempo, além do que sempre ocorre de esquecermos algum detalhe ou pacote durante a configuração do sistema. Manter um backup completo de cada máquina, por outro lado, pode ser muito custoso se o número delas for muito grande. + +O \emph{simplepkg} permite que você mantenha um template para cada grupo de máquinas e com apenas um comando instalar o template numa partição. Além do template, você precisa configurar o \emph{simplepkg} para obter pacotes de um repositório local ou remoto. + +Gerenciar instalações e pacotes não é tudo o que o \emph{simplepkg} faz. Ele pode ser usado até na criação de jaula e vservers, podendo manter toda a configuração das máquinas num repositório Subversion. + +O \emph{simplepkg} funciona não apenas com o Slackware mas com qualquer port (oficial ou não) que siga minimamente os padrões oficiais. + +\section{Arquitetura} + +O \emph{simplepkg} é um conjunto de scripts escritos com a filosofia KISS (Keep It Simple, Stupid) em mente. Ele é um sistema muito simples, composto pelos seguintes comandos: + +\begin{itemize} + \item mkjail: constrói uma jaula/instalação de slackware numa pasta + \item templatepkg: criar ou adiciona pacotes a um template + \item lspkg: lista pacotes instalados + \item jail-update: inverso do jail-commit + \item jail-commit: atualiza o template + \item rebuildpkg: reconstrói um pacote a partir de sua entrada no /var/log/packages + \item simplaret: obtém pacotes de repositórios locais ou remotos + \item createpkg: baixa, compila e empacota software de acordo com scripts presentes num repositório + \item repos: cria e mantém repositórios + \item mkbuild: cria scripts de construção de pacotes +\end{itemize} + +\section{Instalando o simplepkg} + +Para baixar o pacote do \emph{simplepkg}, vá em \htmladdnormallink{http://slack.sarava.org/packages/noarch/}{http://slack.sarava.org/packages/noarch/}. Depois, basta usar o comando + +\begin{verbatim} +installpkg simplepkg-VERSAO-noarch-BUILD.tgz +\end{verbatim} + +\section{Usando o simplepkg} + +As três principais aplicações desse conjunto são: + +\begin{itemize} + \item Gerenciamento de pacotes + \item Criação e manutenção de jaulas + \item Criação de pacotes +\end{itemize} + +O gerencamento de pacotes é feito através do \htmladdnormallink{simplaret}{http://slack.sarava.org/simplaret}, e por ser algo bem específico está detalhado no artigo correspondente. As seções a seguir mostrarão como o \emph{simplepkg} pode ser utilizado para criar e manter jaulas, assim como também criar pacotes. + +\section{Criando templates de instalação} + +Originalmente, o \emph{simplepkg} foi desenvolvido para ajudar na automatização de instalações de sistemas slackware. Para isso, ele trabalha com templates -- listas com pacotes instalados, scripts e arquivos de configuração -- permitindo criar perfis de instalação que podem ser então usados para instalar o sistema numa outra partição ou criar um chroot. + +A construção de um template é feita através do programa templatepkg. Para criar um template de nome "meu-slackware" contendo a lista de pacotes atualmente instalados no seu sistema, digite + +\begin{verbatim} +templatepkg -c meu-slackware +\end{verbatim} + +A opção -c (ou --create) criará a pasta /etc/simplepkg/templates/meu-slackware, que conterá os seguintes componentes: + +\begin{itemize} + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.d}: cópia de arquivos de configuração + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.s}: scripts de pós-instalação + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.perms}: informações sobre arquivos + \item \emph{/etc/simplepkg/templates/meu-slackware/meu-slackware.template}: lista de pacotes +\end{itemize} + +Esses quatro componentes são suficientes para armazenar todas as características de uma instalação de slackware: a lista de pacotes controla o software instalado (a partir do conteúdo da pasta \emph{/var/log/packages}), a cópia dos arquivos de configuração controla as personalizações feitas para o uso dos aplicativos e os scripts de pós-instalação cuidam de qualquer rotina que precisa ser realizada exatamente após a instalação do sistema. Já o arquivo de informações sobre arquivos contém as permissões, o dono/a e grupo de cada arquivo de configuração presente no template. + +Se você quiser criar um template a partir de uma instalação de slackware presente numa outra partição do sistema que não seja a raíz, basta usar um comando do tipo + +\begin{verbatim} +templatepkg -c meu-slackware /mnt/slackware +\end{verbatim} + +onde /mnt/slackware é o local onde o sistema alternativo está instalado. Após criado, o template possuirá apenas a lista de pacotes contendo o nome dos aplicativos instalados no seu sistema. Como a pasta /var/log/packages não preserva a ordem de instalação dos pacotes, então talvez você queira editar manualmente a lista de pacotes de um template. Para isso, use o comando + +\begin{verbatim} +templatepkg -e meu-slackware +\end{verbatim} + +Para adicionar um arquivo de configuração no seu novo template, basta dar um comando como + +\begin{verbatim} +templatepkg -a meu-slackware /etc/hosts +\end{verbatim} + +Isso adicionará o arquivo /etc/hosts no template "meu-slackware". Além de salvar o arquivo e copiá-lo automaticamente quando você instalar seu sistema, o \emph{simplepkg} ainda pode tomar conta de qualquer alteração que o /etc/hosts sofrer no sistema, seja mudança no conteúdo do arquivo, dono ou permissão. Se você ainda estiver armazenando seus templates num repositório svn (o que veremos a seguir), o \emph{simplepkg} pode ainda manter um histórico completo das alterações do arquivo. + +ATENÇÂO: evite ao máximo deixar arquivos contendo senhas ou chaves privadas num template. O lugar mais adequado para deixar esse tipo de coisa é num backup seguro. + +\section{Criando jaulas e replicando instalações} + +Uma vez que um template foi criado com uma lista de pacotes e opcionalmente com arquivos de configuração e scripts de pós-instalação (que serão detalhados a seguir), você pode replicar sua instalação de slackware utilizando o comando + +\begin{verbatim} +mkjail jaula meu-slackware +\end{verbatim} + +Isso cria uma nova árvore do slackware em /vservers/jaula contendo todos os pacotes e arquivos de configuração do template "meu-slackware". A instalação dos pacotes será feita pelo aplicativo \htmladdnormallink{simplaret}{http://slack.sarava.org/simplaret}, que deve estar configurado corretamente e cuja configuração padrão deve funcionar para a maioria dos casos. + +Se você quiser instalar essa jaula em outro local que não seja a pasta /vservers (esse local padrão pode ser mudado pelo arquivo de configuração do \emph{simplepkg}), basta usar um comando do tipo + +\begin{verbatim} +ROOT=/mnt mkjail hda2 meu-slackware +\end{verbatim} + +O comando acima faz exatamente o que você está pensando: replica sua instalação slackware em /mnt/hda2, dispensando totalmente o programa de instalação do slackware! + +Caso nenhum template for especificado, o mkjail utiliza o template /etc/simplepkg/defaults. O \emph{simplepkg} já vem com alguns templates padrões, presentes em /etc/simplepkg/defaults/templates. + +\section{Scripts de pós-instalação} + +Opcionalmente, é possível manter scripts de pós-instalação num template. Tais script são executados exatamente +após a instalação de uma jaula e cópia de arquivos de configuração pelo mkjail. Para criar ou editar um script +de pós-instalação, use um comando como + +\begin{verbatim} +templatepkg -b meu-slackware nome-do-script.sh +\end{verbatim} + +Isso adicionará o script nome-do-script.sh no template "meu-slackware". O mkjail passa dois argumentos para cada script de pós-instalação: a pasta superior e o nome da jaula ("/mnt" e "hda2" no nosso exemplo anterior). Assim, um exemplo de script seria algo como + +\begin{verbatim} +#!/bin/bash +chroot $1/$2/ sbin/ldconfig +\end{verbatim} + +\section{Listando o conteúdo de um template} + +Para listar os templates disponíveis ou o conteúdo de um template, use comandos como + +\begin{verbatim} +templatepkg -l +templatepkg -l meu-slackware +\end{verbatim} + +\section{Removendo arquivos de um template} + +Analogamente à forma como se adicona arquivos num template, removê-los pode ser feito com o seguinte comando: + +\begin{verbatim} +templatepkg -d meu-slackware /etc/hosts +\end{verbatim} + +Isso remove o arquivo /etc/hosts do template "meu-slackware". + +\section{Apagando um template} + +Para apagar um template, basta utilizar um comando como + +\begin{verbatim} +templatepkg -r meu-slackware +\end{verbatim} + +\section{Atualizando um template} + +Agora que já abordamos as opções do templatepkg, é hora de visitarmos um outro aplicativo, desta vez utilizado para manter um template atualizado. O jail-commit é um script que copia as alterações dos arquivos (conteúdo, propriedade e permissões) de um template a partir do conteúdo de uma jaula ou instalação. + +Por exemplo, caso se queira copiar as alterações da jaula /mnt/hda2 no template "meu-slackware", basta usar o comando + +\begin{verbatim} +jail-commit /mnt/hda2 meu-slackware +\end{verbatim} + +Além da lista de pacotes do template "meu-slackware" ser atualizada de acordo com a lista de pacotes presente em /mnt/hda2/var/log/packages, todos os arquivos de configuração presentes no template "meu-slackware" serão comparados com os correspondentes da pasta /mnt/hda2 e as diferenças são copiadas para o template. Da mesma forma, as permissões e informação de dono/grupo dos arquivos também é atualizada no template. + +O comando jail-commit possibilita que um template sempre esteja atualizado e refletindo a configuração atual de uma instalação de slackware. Se você quiser atualizar apenas a lista de pacotes de um template, porém, use + +\begin{verbatim} +templatepkg -u meu-template +\end{verbatim} + +Para facilitar ainda mais o controle das alterações do sistema, existe ainda uma facilidade do arquivo /etc/simplepkg/jailist. Esse arquivo serve, além de outros propósitos descritos na \htmladdnormallink{documentação do simplaret}{http://slack.sarava.org/simplaret}, para que o jail-commit saiba de antemão quais são as instalações de sistema do tipo Slackware presentes numa máquina, além da instalação principal na raíz do sistema. + +Suponha que uma máquina possua duas instalações de slackware, além da principal (raíz): + +\begin{itemize} + \item /mnt/slackware-1 usando o template "slackware-1" + \item /mnt/slackware-2 usando o template "slackware-2" +\end{itemize} + +Se o arquivo /etc/simplepkg/jailist contiver as seguintes linhas, + +\begin{verbatim} +/mnt/slackware-1 +/mnt/slackware-2 +\end{verbatim} + +então o comando + +\begin{verbatim} +jail-commit +\end{verbatim} + +atualizará o template "slackware-1" de acordo com o conteúdo da jaula /mnt/slackware-1 e o template "slackware-2" com o conteúdo da jaula /mnt/slackware-2. Se, além desses dois templates, existir um outro de nome "main", então o jail-commit sem argumentos também copiará as atualizações da instalação raíz, deixando-as no template "main". + +Você pode inclusive colocar uma entrada no crontab do tipo + +\begin{verbatim} +20 4 * * * jail-commit +\end{verbatim} + +para que seus templates sejam atualizados diariamente. Se você ainda possui o envio de emails configurado na sua máquina, então a saída do jail-commit será enviada pelo cron diariamente para seu email, contendo diffs das alterações de arquivos de configuração a lista de pacotes adicionados ou removidos no sistema. + +\section{Restaurando arquivos de configuração numa jaula} + +A operação contrária ao que o jail-commit faz também é possível: suponha que você mexeu na configuração do sistema mas se arrependeu das alterações e deseja voltar a configuração para o modo como ela se encontra no seu template, basta usar o comando + +\begin{verbatim} +jail-update /mnt/hda2 meu-slackware +\end{verbatim} + +\section{Armazenando as configurações no repositório Subversion} + +Para aumentar ainda mais a flexibilidade e o controle do conteúdo dos templates, é possível armazená-los num repositório Subversion. Para isso, edite o arquivo /etc/simplepkg/simplepkg.conf e deixe o parâmetro de configuração \emph{TEMPLATES\_UNDER\_SVN} com o valor "yes". + +Depois, crie um repositório subversion para armazenar seus templates, usando algo como + +\begin{verbatim} +svnadmin create /var/svn/simplepkg --fs-type fsfs +\end{verbatim} + +Com o repositório criado, basta importar seus templates com o comando + +\begin{verbatim} +templatepkg -e file:///var/svn/simplepkg +\end{verbatim} + +A partir daí, o comando jail-commit enviará automaticamente todas as alterações dos templates para o repositório subversion. Se, por outro lado, você quiser baixar as alterações dos templates que estão no repositório remoto para sua cópia local, use o comando + +\begin{verbatim} +templatepkg -s +\end{verbatim} + +Caso você queira importar uma pasta de templates de um repositório já existente, use + +\begin{verbatim} +templatepkg -i file:///var/svn/simplepkg +\end{verbatim} + +onde file:///var/svn/simplepkg é o camninho do repositório. + +\section{Atualização de jaulas} + +A atualização de jaulas e sistemas instalados é feita através do \htmladdnormallink{simplaret}{http://slack.sarava.org/simplaret} e também utiliza o arquivo /etc/simplepkg/jailist. Para mais informações a respeito, consulte a \htmladdnormallink{documentação do simplaret}{http://slack.sarava.org/simplaret} para mais detalhes. + +\section{Arquiteturas e versões diferentes} + +O \emph{simplepkg} foi idealizado para permitir que um mesmo template possa ser usado para criar jaulas de arquiteturas e versões diferentes de sistemas padrão slackware. A atualização desses sistemas também é unificada. Essa possibilidade só é permitida se você usa o \htmladdnormallink{simplaret}{http://slack.sarava.org/simplaret} e não o swaret como ferramenta de obtenção de pacotes. + +Por exemplo, para criar uma instalação de slackware 10.1 (assumindo que suas definições de repositórios do /etc/simplepkg/repos.conf contenham locais com slack 10.1), basta usar o comando + +\begin{verbatim} +VERSION=10.1 mkjail minha-jaula template-servidor +\end{verbatim} + +Arquiteturas diferentes também podem ser usadas. Se você está num sistema x86\_64 e quer instalar um slack 10.2 numa partição, experimente + +\begin{verbatim} +ARCH=i386 VERSION=10.2 ROOT=/mnt mkjail hda2 meu-slackware +\end{verbatim} + +Note que os templates independem de arquitetura e versão, já que eles só contém nomes de pacotes, arquivos de configuração e scripts. + +\section{Criando um pacote de um template} + +Se, por algum motivo, você quiser construir um pacote com o conteúdo de um template, experimente o comando + +\begin{verbatim} +templatepkg -p nome-do-template +\end{verbatim} + +No entanto, o \emph{simplepkg} foi criado para que esse tipo de comportamento seja evitado, já que é mais simples manter templates de configuração do que pacotes contendo a configuração de uma instalação. + +\section{Construindo pacotes} + +Até aqui, apenas mostramos os aplicativos do \emph{simplepkg} usados para a manutenção de instalações de slackware. No entanto, uma das outras finalidades desta suíte é a construção de pacotes, o que é feita pelo programa createpkg, Como dito anteriormente, o createpkg: baixa, compila e empacota software de acordo com scripts presentes num repositório de scripts, funcionando com um gerenciador de "ports" para slackware. + +O createpkg pode funcionar com qualquer tipo de script de construção de pacotes (SlackBuilds) mas funcionará melhor se os mesmos seguirem o padrão descrito na página + +\begin{verbatim} +http://slack.sarava.org/trac/wiki/SlackBuilds +\end{verbatim} + +Especificamente, o createpkg foi desenvolvido para utilizar os slackbuild disponíveis em \htmladdnormallink{http://slack.sarava.org/slackbuilds}{http://slack.sarava.org/slackbuilds}. O createpkg trabalha com repositórios do tipo subversion. + +Para obter os scripts do repositório do slack.sarava.org, digite + +\begin{verbatim} +createpkg --sync +\end{verbatim} + +Em seguida, você pode listas todos os scripts disponíveis: + +\begin{verbatim} +createpkg --list +\end{verbatim} + +Para buscar por um pacote, use + +\begin{verbatim} +createpkg --search latex2html +\end{verbatim} + +No caso, a busca é feita pelo SlackBuild do aplicativo "latex2html". Suponha agora que você queira construir o pacote desse aplicativo: + +\begin{verbatim} +createpkg latex2html +\end{verbatim} + +O pacote resultante estará na pasta /tmp ou no valor especificado pela variável de ambiente \emph{\$REPOS}. Para criar e também instalar o pacote, basta + +\begin{verbatim} +createpkg --install latex2html +\end{verbatim} + +Se o pacote possuir dependências listadas num arquivo slack-required e que não estiverem instaladas no sistema, o createpkg tentará processá-las uma a uma antes de tentar construir o pacote desejado: se as dependências não forem encontradas no repositório de scripts, então o createpkg tentará baixá-las de um repositório binário através do \htmladdnormallink{simplaret}{http://slack.sarava.org/simplaret}. Se você não quiser que a resolução de dependências seja seguida, use a opção --no-deps. + +Para mais detalhes de funcionamento, experimente o comando + +\begin{verbatim} +createpkg --help +\end{verbatim} + +ou então acesse a página http://slack.sarava.org/trac/wiki/SlackBuilds + +\section{Aplicativos auxiliares} + +O \emph{simplepkg} acompanha ainda alguns aplicativos auxiliares: + +\begin{itemize} + \item lspkg: lista pacotes instalados + \item rebuildpkg: reconstrói um pacote a partir de sua entrada no /var/log/packages + \item repos: cria e mantém repositórios + \item mkbuild: cria scripts de construção de pacotes +\end{itemize} + +O comando lspkg é um utilitário simples para a visualização de pacotes instalados no sistema. Já o rebuildpkg ajuda a recuperar pacotes instalados cujo tgz original foi perdido. O comando rebuildpkg reconstrói um pacote a partir de uma entrada no /var/log/packages. O comando + +\begin{verbatim} +rebuildpkg coreutils +\end{verbatim} + +reconstrói um pacote do coreutils usando os arquivos e as metainformações listadas no arquivo do /var/log/packages/ correspondente ao coreutils. + +Por fim, os scripts repos e mkbuild são os que se encontram na etapa de maior desenvolvimento: repos cria um repositório de pacotes a partir de uma pasta contendo pacotes do tipo pkgtool e o mkbuild é um aplicativo para auxiliar a criação de scripts de construção de pacotes que podem ser utilizados sozinhos ou pelo o createpkg. + +\section{Parâmetros de configuração} + +O arquivo de configuração do \emph{simplepkg} é o /etc/simplepkg/simplepkg.conf. Ele contém parâmetros de configuração de todos os scripts, porém neste texto não trataremos das opções específicas ao \htmladdnormallink{simplaret}{http://slack.sarava.org/simplaret}, as quais tem uma seção específica no artigo correspondente. + +Se você quiser alterar algum parâmetro, não edite esse arquivo: use, ao invés dele, o arquivo /etc/simplepkg/simplepkg.conf, pois este sobrescreve qualquer opção padrão. + +\begin{itemize} + \item \emph{JAIL\_ROOT}: pasta padrão onde as jaulas são criadas pelo mkjail. Valor padrão: "/vservers". + \item \emph{ADD\_TO\_JAIL\_LIST}: controla se uma jaula criada pelo mkjail deve ser adicionada automaticamente no arquivo /etc/simplepkg/jailist. O valor padrão é "1" (habilitado). + \item \emph{TEMPLATES\_UNDER\_SVN}: indica se os templates estão armazenados num repositório subversion. O valor padrão é "no" (não). + \item \emph{TEMPLATE\_FOLDER}: indica qual é a pasta de templates. O valor padrão é "/etc/simplepkg/templates" e não é recomendável alterá-lo. + \item \emph{TEMPLATE\_STORAGE\_STYLE}: controla a forma de armazenamento de templates. O valor padrão é "own-folder" e essa opção apenas deve ser modificada se você armazena seus templates num formato antigo do \emph{simplepkg} e deseja manter compatibilidade. +\end{itemize} + +Vale lembrar que todas as opções booleanas (isto é, que podem ser apenas habilitadas ou desabilitadas) do simplepkg.conf tem os seguintes valores permitidos: "1" e "yes" para habilitado e "0" ou "no" para desabilitado. + +\section{Mais informações} + +O \emph{simplepkg} foi escrito por Silvio Rhatto (rhatto at riseup.net) sob licença GPL e seu código fonte é disponibilizado através do repositório subversion: + +\begin{verbatim} +svn checkout http://slack.sarava.org/simplepkg +\end{verbatim} + +O wiki de desenvolvimento está em http://slack.sarava.org/trac/wiki/Simplepkg e o endereço da lista de discussão utilizada para discussões sobre o \emph{simplepkg} ou mesmo distribuições e pacotes do tipo Slackware é http://listas.sarava.org/wws/info/slack. + +\end{document} diff --git a/tags/0.6rc1/install/slack-desc b/tags/0.6rc1/install/slack-desc new file mode 100644 index 0000000..38ea489 --- /dev/null +++ b/tags/0.6rc1/install/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler-------------------------------------------------------| +simplepkg: simplepkg (slackware management system) +simplepkg: +simplepkg: simplepkg is a very small set of scripts intended to help slackware +simplepkg: users and developers, like the createpkg packaging tool, simplaret +simplepkg: package retrieval, mkjail chroot installer and templatepkg template +simplepkg: management system. +simplepkg: +simplepkg: +simplepkg: +simplepkg: +simplepkg: diff --git a/tags/0.6rc1/lib/common.sh b/tags/0.6rc1/lib/common.sh new file mode 100644 index 0000000..0f2edcd --- /dev/null +++ b/tags/0.6rc1/lib/common.sh @@ -0,0 +1,1870 @@ +#!/bin/bash +# +# common.sh: common functions for simplepkg +# feedback: rhatto at riseup.net +# +# common.sh 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 2 of the License, or any later version. +# +# common.sh 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# $Rev$ - $Author$ +# + +BASE_CONF="/etc/simplepkg" +CONF="$BASE_CONF/simplepkg.conf" +HOME_CONF="$HOME/.simplepkg/simplepkg.conf" +DEFAULT_CONF="$BASE_CONF/defaults/simplepkg.conf" +JAIL_LIST="$BASE_CONF/jailist" +SIMPLARET="simplaret" + +# ----------------------------------------------- +# pkgtool functions +# ----------------------------------------------- + +function package_name { + + # get the package name + # in some places (like in /var/log/packages), the package name is appended with + # an -upgrade information that should be striped + basename $1 .tgz | sed -e 's/-upgraded-[0-9]*-[0-9]*-[0-9]*,[0-9]*:[0-9]*:[0-9]*$//' \ + -e 's/-[^-]*-[^-]*-[^-]*$//' + +} + +# ----------------------------------------------- +# package info functions +# ----------------------------------------------- + +function package_version { + + # get VERSION from a package name + local file pack version + file="`basename $1`" + pack="`package_name $1`" + echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 1 + +} + +function package_arch { + + # get ARCH from a package name + local file pack arch + basename $1 | sed -e 's/.*\-\(.*\)\-.*.tgz$/\1/' -e 's/_slamd64$//g' -e 's/_sflack$//g' + +} + +function package_build { + + # get BUILD from a package name + local file pack build + basename $1 | sed -e 's/.*\-.*\-\(.*\).tgz$/\1/' + +} + +# ----------------------------------------------- +# package administrative functions +# ----------------------------------------------- + +function install_packages { + + local check installed unable_to_install root + + # check if is time to clean the local repository + if [ "$SIMPLARET_CLEAN" == "1" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge + elif [ ! -z "$SIMPLARET_PURGE_WEEKS" ] && [ "$SIMPLARET_PURGE_WEEKS" != "0" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge -w $SIMPLARET_PURGE_WEEKS + fi + + root="$JAIL_ROOT/$server" + mkdir -p $root/var/log/packages + + # now tries to install each package listed in the template + for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1 | awk '{ print $1 }'`; do + + # try to install the package + ROOT=/$root ARCH=$ARCH VERSION=$VERSION $SIMPLARET --install $pack --skip-checks + + # check if the package was installed + pack="`echo $pack | sed -e 's/\+/\\\+/'`" + installed="`check_installed $pack $root`" + check=$? + + if [ ! -z "$installed" ] && [ "$check" == "0" ]; then + # the package is installed + if [ ! -z "$SIMPLARET_DELETE_DURING" ] && [ "$SIMPLARET_DELETE_DURING" != "0" ]; then + SILENT=1 ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge + fi + else + unable_to_install="$unable_to_install\n\t`echo $pack | sed -e 's/\\\+/\+/'`" + fi + + done + + # purge packages, if needed + if [ "$SIMPLARET_DELETE_DOWN" == "1" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge + fi + + if [ ! -z "$unable_to_install" ]; then + echo "mkjail was unable to install the following packages on $root:" + echo -e "$unable_to_install" + fi + +} + +function remove_packages { + + local pack + + for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1`; do + ROOT=/$JAIL_ROOT/$server removepkg $pack + done + +} + +# ----------------------------------------------- +# config file functions +# ----------------------------------------------- + +function eval_parameter { + + # usage: eval $1 parameter from $HOME_CONF, $CONF or $DEFAULT_CONF + # return the evaluated parameter if available or $2 $3 ... $n + + if [ -e "$HOME_CONF" ] && grep -qe "^$1=" $HOME_CONF; then + grep -e "^$1=" $HOME_CONF | tail -n 1 | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | sed -e 's/ *#.*$//' + elif [ -e "$CONF" ] && grep -qe "^$1=" $CONF; then + grep -e "^$1=" $CONF | tail -n 1 | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | sed -e 's/ *#.*$//' + elif [ -e "$DEFAULT_CONF" ] && grep -qe "^$1=" $DEFAULT_CONF; then + grep -e "^$1=" $DEFAULT_CONF | tail -n 1 | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | sed -e 's/ *#.*$//' + else + shift + echo $* + fi + +} + +function set_constants { + + # Set common constants + # on/off + on=1 + off=0 + # yes/no + yes=1 + no=0 + +} + +function eval_boolean_parameter { + + # get a boolean parameter from the configuration + + local value + + # get the value + value="`eval_parameter $1 $2`" + + convert_boolean $value + +} + +function convert_boolean { + + # force case insensitiveness + local value="`echo $1 | tr '[:upper:]' '[:lower:]'`" + + # convert it to wheter 0 or 1 + if [ "$value" == "yes" ] || [ "$value" == "1" ] || [ "$value" == "on" ]; then + echo 1 + else + echo 0 + fi + +} + +function eval_config { + + # simplepkg config file evaluation + # usage: eval_config [-u] + + if [ -f "$DEFAULT_CONF" ]; then + + DEFAULT_ARCH="`eval_parameter DEFAULT_ARCH $(default_arch)`" + DEFAULT_VERSION="`eval_parameter DEFAULT_VERSION $(default_version)`" + + TMP="`eval_parameter TMP /tmp`" + STORAGE="`eval_parameter STORAGE /var/simplaret/packages`" + JAIL_ROOT="`eval_parameter JAIL_ROOT /vservers`" + PATCHES_DIR="`eval_parameter PATCHES_DIR /var/simplaret/patches`" + ROOT_PRIORITY="`eval_parameter ROOT_PRIORITY patches slackware extra testing pasture`" + REPOS_PRIORITY="`eval_parameter REPOS_PRIORITY patches slackware extra testing pasture`" + SIMPLARET_PURGE_WEEKS="`eval_parameter SIMPLARET_PURGE_WEEKS 0`" + FTP_TOOL="`eval_parameter FTP_TOOL curl`" + HTTP_TOOL="`eval_parameter HTTP_TOOL curl`" + CONNECT_TIMEOUT="`eval_parameter CONNECT_TIMEOUT 0`" + TEMPLATE_FOLDER="`eval_parameter TEMPLATE_BASE /etc/simplepkg/templates`" + TEMPLATE_STORAGE_STYLE="`eval_parameter TEMPLATE_STORAGE_STYLE compact`" + + SIMPLARET_CLEAN="`eval_boolean_parameter SIMPLARET_CLEAN 1`" + SIMPLARET_DELETE_DOWN="`eval_boolean_parameter SIMPLARET_DELETE_DOWN 1`" + SIMPLARET_UPDATE="`eval_boolean_parameter SIMPLARET_UPDATE 0`" + SIMPLARET_DELETE_DURING="`eval_boolean_parameter SIMPLARET_DELETE_DURING 0`" + SIMPLARET_PURGE_PATCHES="`eval_boolean_parameter SIMPLARET_PURGE_PATCHES 1`" + SIMPLARET_DOWNLOAD_FROM_NEXT_REPO="`eval_boolean_parameter SIMPLARET_DOWNLOAD_FROM_NEXT_REPO 1`" + PASSIVE_FTP="`eval_boolean_parameter PASSIVE_FTP 0`" + WARNING="`eval_boolean_parameter WARNING 0`" + SIGNATURE_CHECKING="`eval_boolean_parameter SIGNATURE_CHECKING 0`" + DEPENDENCY_CHECKING="`eval_boolean_parameter DEPENDENCY_CHECKING 1`" + TEMPLATES_UNDER_SVN="`eval_boolean_parameter TEMPLATES_UNDER_SVN 0`" + ADD_TO_JAIL_LIST="`eval_boolean_parameter ADD_TO_JAIL_LIST 1`" + + # Enabling this option (i.e, setting to "1" or "yes"), simplaret will + # donwload even # already applied patches, a good option when you plan + # to keep local copies of all needed patches for your system + DOWNLOAD_EVEN_APPLIED_PATCHES="`eval_boolean_parameter DOWNLOAD_EVEN_APPLIED_PATCHES 0`" + + # Enabling this option, jail-upgrade will look at your + # standard repositories for new packages; if it find a package + # with different version of your current installed package and + # also this package isnt in the packages folder, then the new + # package is apllied; if in doubt, just say no or leave blank. + CONSIDER_ALL_PACKAGES_AS_PATCHES="`eval_boolean_parameter CONSIDER_ALL_PACKAGES_AS_PATCHES 0`" + + # Enabling this option (i.e, setting to "1" or "yes"), simplaret will + # store patches it finds on ROOT repositories on + # + # $PATCHES_DIR/$ARCH/$VERSION/root-$repository_name. + # + # By default this option is turned off because it breaks the standard + # way to store packages and can cause some confusion, but its an useful + # feature if you like to see all patches apart from common packages and/or + # stored in the same tree. + STORE_ROOT_PATCHES_ON_PATCHES_DIR="`eval_boolean_parameter STORE_ROOT_PATCHES_ON_PATCHES_DIR 0`" + + # now we place "patches" on the top of ROOT_PRIORITY + ROOT_PRIORITY="patches `echo $ROOT_PRIORITY | sed -e 's/patches//'`" + + else + echo $1 error: config file $DEFAULT_CONF not found + exit 1 + fi + + if [ ! -d "$STORAGE" ]; then + mkdir -p $STORAGE + fi + + if [ ! -d "$PATCHES_DIR" ]; then + mkdir -p $PATCHES_DIR + fi + + if [ ! -d "$TMP" ]; then + mkdir -p $TMP + fi + + if [ -z "$ARCH" ]; then + ARCH="$DEFAULT_ARCH" + fi + + if [ -z "$VERSION" ]; then + VERSION="$DEFAULT_VERSION" + fi + + if [ "$FTP_TOOL" != "wget" ] && [ "$FTP_TOOL" != "curl" ] && [ "$FTP_TOOL" != "ncftpget" ]; then + echo "$1 configuration error: invalid value $FTP_TOOL for config parameter FTP_TOOL" + echo "$1 assuming value \"curl\" for variable FTP_TOOL" + FTP_TOOL="curl" + fi + + if [ "$HTTP_TOOL" != "wget" ] && [ "$HTTP_TOOL" != "curl" ]; then + echo "$1 configuration error: invalid value $HTTP_TOOL for config parameter HTTP_TOOL" + echo "$1 assuming value \"curl\" for variable HTTP_TOOL" + HTTP_TOOL="curl" + fi + + if which $SIMPLARET &> /dev/null; then + if [ "$SIMPLARET_UPDATE" == "1" ]; then + if [ "$2" == "-u" ]; then + ARCH=$ARCH VERSION=$VERSION $SIMPLARET --update + fi + fi + else + echo "$SIMPLARET not found, please install it before run $0" + fi + + if [ "$TEMPLATE_STORAGE_STYLE" != "simplepkg-folder" ] && \ + [ "$TEMPLATE_STORAGE_STYLE" != "templates-folder" ] && \ + [ "$TEMPLATE_STORAGE_STYLE" != "own-folder" ] && \ + [ "$TEMPLATE_STORAGE_STYLE" != "compact" ]; then + TEMPLATE_STORAGE_STYLE="compact" + fi + + if [ ! -z "$ROOT" ]; then + JAIL_ROOT="$ROOT" + fi + +} + +# ----------------------------------------------- +# arch and version functions +# ----------------------------------------------- + +function default_version { + + # get version from /etc/slackware-version + if [ -f "$1/etc/slackware-version" ]; then + cat $1/etc/slackware-version | awk '{ print $2 }' | sed -e 's/.0$//' + elif [ -f "$1/etc/slamd64-version" ]; then + cat $1/etc/slamd64-version | awk '{ print $2 }' | sed -e 's/.0$//' + elif [ -f "$1/etc/bluewhite64-version" ]; then + cat $1/etc/bluewhite64-version | awk '{ print $2 }' | sed -e 's/.0$//' + elif [ -f "$1/etc/sflack-version" ]; then + cat $1/etc/sflack-version | awk '{ print $2 }' | sed -e 's/.0$//' + else + aaa_base="`basename $(ls $1/var/log/packages/aaa_base-[0-9]* 2> /dev/null)`" + echo `package_version $aaa_base` + fi + +} + +function default_arch { + + # get arch from /etc/slackware-version + + local arch + + if [ -f "$1/etc/slackware-version" ]; then + arch="`cat $1/etc/slackware-version | awk '{ print $3 }' | sed -e 's/(//' -e 's/)//'`" + if [ -z "$arch" ]; then + arch="i486" + fi + elif [ -f "$1/etc/slamd64-version" ] || [ -f "$1/etc/bluewhite64-version" ] || [ -f "$1/etc/sflack-version" ]; then + arch="x86_64" + else + aaa_base="`basename $(ls $1/var/log/packages/aaa_base-[0-9]* 2> /dev/null)`" + echo `package_arch $aaa_base` + fi + + if [ -z "$arch" ]; then + echo `uname -m` + else + echo $arch + fi + +} + +function default_distro { + + # get distro name from /etc/slackware-version + if [ "`default_arch`" == "x86_64" ]; then + if [ -f "$1/etc/slamd64-version" ]; then + echo slamd64 + elif [ -f "$1/etc/bluewhite64-version" ]; then + echo bluewhite64 + elif [ -f "$1/etc/sflack-version" ]; then + echo sflack + else + echo slamd64 + fi + else + if [ -f "$1/etc/slackware-version" ]; then + cat $1/etc/slackware-version | awk '{ print $1 }' | tr '[[:upper:]]' '[[:lower:]]' + else + echo slackware + fi + fi + +} + +# ----------------------------------------------- +# template functions +# ----------------------------------------------- + +function search_default_template { + + if [ -e "$BASE_CONF/default.template" ]; then + TEMPLATE_BASE="$BASE_CONF/default" + echo $BASENAME using default template + elif [ -e "$TEMPLATE_FOLDER/default.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/default" + echo $BASENAME: using default template + elif [ -e "$TEMPLATE_FOLDER/default/default.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/default/default" + echo $BASENAME: using default template + elif [ -e "$TEMPLATE_FOLDER/default/packages" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/default" + echo $BASENAME: using default template + elif [ -e "$BASE_CONF/defaults/templates/default/default.template" ]; then + TEMPLATE_BASE="$BASE_CONF/defaults/templates/default/default" + echo $BASENAME using default template + elif [ -e "$BASE_CONF/defaults/templates/default/packages" ]; then + TEMPLATE_BASE="$BASE_CONF/defaults/templates/default" + echo $BASENAME using default template + else + echo $BASENAME: error: default template not found + echo $BASENAME: please create a template using templatepkg + return 1 + fi + +} + +function search_template { + + # determine the template to be used + # usage: search-template [--new | --update] + + # + # templates can be stored either on + # + # - $BASE_CONF/template_name.template + # - $TEMPLATE_FOLDER/template_name.template + # - $TEMPLATE_FOLDER/template_name/template_name.template + # + # also, there's a folder for "oficial" simplepkg templates, + # $BASE_CONF/defaults/templates/ and you can override any template + # in the default folder by placing a template with the same name + # in the template storage folders + # + + if [ -f "$BASE_CONF/$1.template" ]; then + TEMPLATE_BASE="$BASE_CONF/$1" + elif [ -f "$TEMPLATE_FOLDER/$1.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + elif [ -f "$TEMPLATE_FOLDER/$1/$1.template" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1/$1" + elif [ -f "$TEMPLATE_FOLDER/$1/packages" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + elif [ -f "$BASE_CONF/defaults/templates/$1/$1.template" ] && \ + [ "$2" != "--update" ]; then + TEMPLATE_BASE="$BASE_CONF/defaults/templates/$1/$1" + else + if [ "$2" == "--new" ]; then + # we need to return the path for a new template + if [ "$TEMPLATE_STORAGE_STYLE" == "simplepkg-folder" ]; then + TEMPLATE_BASE="$BASE_CONF/$1" + elif [ "$TEMPLATE_STORAGE_STYLE" == "templates-folder" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + elif [ "$TEMPLATE_STORAGE_STYLE" == "own-folder" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1/$1" + elif [ "$TEMPLATE_STORAGE_STYLE" == "compact" ]; then + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + else + TEMPLATE_BASE="$TEMPLATE_FOLDER/$1" + fi + elif [ "$2" == "--update" ]; then + return 1 + else + echo $BASENAME: template $1 not found + search_default_template + fi + fi + +} + +function template_packages { + + if [ "$TEMPLATE_STORAGE_STYLE" == "compact" ]; then + echo $TEMPLATE_BASE/packages + else + echo $TEMPLATE_BASE.template + fi + +} + +function template_perms { + + if [ "$TEMPLATE_STORAGE_STYLE" == "compact" ]; then + echo $TEMPLATE_BASE/perms + else + echo $TEMPLATE_BASE.perms + fi + +} + +function template_files { + + if [ "$TEMPLATE_STORAGE_STYLE" == "compact" ]; then + echo $TEMPLATE_BASE/files + else + echo $TEMPLATE_BASE.d + fi + +} + +function template_scripts { + + if [ "$TEMPLATE_STORAGE_STYLE" == "compact" ]; then + echo $TEMPLATE_BASE/scripts + else + echo $TEMPLATE_BASE.s + fi + +} + +# ----------------------------------------------- +# unix permission functions +# ----------------------------------------------- + +function numeric_perm { + + # get the numeric permission of a file + # usage: numeric_perm + + # just a bit of forbidden secrets + + if [ -a "$1" ]; then + ls -lnd $1 | awk '{ print $1 }' | \ + sed -e 's/^.//' -e 's/r/4/g' -e 's/w/2/g' -e 's/x/1/g' \ + -e 's/-/0/g' -e 's/\(.\)\(.\)\(.\)/\1+\2+\3/g' | \ + fold -w5 | bc -l | xargs | sed -e 's/ //g' + fi + +} + +function get_owner { + + # get the numeric owner for a file + # usage: get_owner + + if [ -a "$1" ]; then + ls -lnd $1 | awk '{ print $3 }' + fi + +} + +function get_group { + + # get the numeric group for a file + # usage: get_group + + if [ -a "$1" ]; then + ls -lnd $1 | awk '{ print $4 }' + fi + +} + +function is_writable_folder { + + # check if a folder is writable + # usage: is_writable_folder + + local tmpfile folder="$1" + + if mkdir -p $folder &> /dev/null && tmpfile=`mktemp $folder/is_writable_folder.XXXXXX`; then + rm -f $tmpfile + return 0 + else + return 1 + fi + +} + +# ----------------------------------------------- +# subversion functions +# ----------------------------------------------- + +function svn_update { + + # simple wrapper around svn update + # usage: svn_update + + svn update + +} + +function svn_folder { + + # simple svn folder checker + # usage: svn_folder + + if [ -d "$1/.svn" ]; then + return + else + return 1 + fi + +} + +function templates_under_svn { + + # check if svn usage is enabled + + if [ "$TEMPLATES_UNDER_SVN" == "1" ]; then + if [ "$TEMPLATE_STORAGE_STYLE" == "own-folder" ] || \ + [ "$TEMPLATE_STORAGE_STYLE" == "compact" ]; then + return 0 + else + return 1 + fi + else + return 1 + fi + +} + +function svn_check { + + # check if a file is under svn + # usage: svn_check + + local folder file + + folder="`dirname $1`" + file="`basename $1`" + + if [ ! -e "$folder/$file" ]; then + + return 1 + + elif svn_folder $folder/$file; then + + return 0 + + elif svn_folder $folder; then + + ( + cd $folder + + if [ "`svn status $file | awk '{ print $1 }'`" == "?" ]; then + return 1 + else + return 0 + fi + ) + + else + return 1 + fi + +} + +function build_svn_repo { + + # Checkout a new slackbuild working copy + # input: $1 - svn directory name + # $2 - svn address + [ $# -ne 2 ] && exit 5 + SVN_BASEDIR="`dirname $1`" + mkdir -p $SVN_BASEDIR || exit 4 + cd $SVN_BASEDIR + svn checkout $2 + cd $1 + +} + +function check_svn_repo { + + # Verify if repository exist + # input: $1 - svn directory name + # $2 - svn address + [ $# -ne 2 ] && exit 5 + [ ! -d "$1" ] && build_svn_repo $1 $2 + +} + +function sync_svn_repo { + + # Synchronize repository + # input: $1 - svn directory name + # $2 - svn address + [ $# -ne 2 ] && exit 5 + + local folder url cwd + folder="$1" + url="$2" + cwd="`pwd`" + + mkdir -p $folder + cd $folder + if svn_folder $(pwd); then + su_svn update + else + build_svn_repo $folder $url + fi + cd $pwd + +} + +function svn_add { + + local file="$1" folder folders dir_list cwd + local subfolder subfolders + + if [ -e "$file" ] && ! svn_check $file; then + + folder="`absolute_folder $file`" + cwd="`pwd`" + + if svn_folder $folder; then + cd $folder + su_svn add `basename $file` + else + + # reverse folder order + dir_list="`echo $folder | tr '/' ' '`" + for i in $dir_list; do + folders="$i $folders" + done + + cd $folder + + for i in $folders; do + cd .. + if svn_folder $(pwd); then + # add the parent folder + su_svn add --depth=empty $i + + # add all subfolders + cd $i + subfolders="$(echo $folder | sed -e "s/^$(regexp_slash $(pwd))//")" + for subfolder in `echo $subfolders | tr '/' ' '`; do + if ! svn_check $subfolder; then + su_svn add --depth=empty $subfolder + cd $subfolder + fi + done + + # add the file + cd $folder + su_svn add `basename $file` + + break + fi + done + + fi + + cd $cwd + + fi + +} + +function svn_del { + + local file folder + + file="$1" + folder="`dirname $file`" + + if [ -e "$file" ] && svn_folder $folder && svn_check $file; then + chown_svn $file && chgrp_svn $file + ( cd $folder && su_svn del --force `basename $file` ) + else + ( cd $folder && rm -rf `basename $file` ) + fi + +} + +function svn_copy { + + # svn add file + # usage: svn_copy + + [ $# -ne 2 ] && handle_error $ERROR_PAR_NUMBER + + if [ -e "$1" ]; then + + local orig file dest + + orig="`dirname $1`" + file="`basename $1`" + dest="$2" + + if [ -d "$dest" ]; then + dest="$dest/$file" + fi + + # copy file + if ! is_the_same $orig $(dirname $dest); then + cp $orig/$file $dest + fi + + # add file to the revision system + if svn_folder `dirname $dest`; then + chown_svn $dest && chgrp_svn $dest + ( cd `dirname $dest` && svn_add `basename $dest` ) + fi + + fi + +} + +function svn_mkdir { + + # svn make directory + # usage: svn_mkdir + + [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + + DIR_LIST=`echo $1 | tr '/' ' '` + + DIR="" + for i in $DIR_LIST; do + DIR=$DIR/$i + if [ ! -e ${DIR:1} ]; then + su_svn mkdir ${DIR:1} + elif [ -d "${DIR:1}" ] && ! svn_folder ${DIR:1}; then + su_svn add ${DIR:1} + fi + done + +} + +function is_inside_svn_repo { + + # check if a file is inside a svn repository + # usage: is_inside_svn_repo + + local file="$1" folder folders dir_list cwd + + if [ -e "$file" ]; then + folder="`absolute_folder $file`" + fi + + if svn_folder $folder; then + return true + fi + + # reverse folder order + dir_list="`echo $folder | tr '/' ' '`" + for i in $dir_list; do + folders="$i $folders" + done + + cwd="`pwd`" + cd $folder + + for i in $folders; do + cd .. + if svn_folder $(pwd); then + cd $cwd + return true + fi + done + + cd $cwd + return false + +} + +function su_svn { + + # execute svn using a different user + if [ ! -z "$SVN_USER" ]; then + if [ "`whoami`" != "$SVN_USER" ]; then + su $SVN_USER -c "svn $*" + else + svn $* + fi + else + svn $* + fi + +} + +function chown_svn { + + # set svn folder ownership + if [ ! -z "$SVN_USER" ] && [ -e "$1" ]; then + chown -R $SVN_USER $1 + fi + +} + +function chgrp_svn { + + # set svn folder group + if [ ! -z "$SVN_GROUP" ] && [ -e "$1" ]; then + chgrp -R $SVN_GROUP $1 + fi + +} + +function svn_remove_empty_folders { + + if [ -z "$1" ] && [ ! -d "$1" ]; then + return 1 + fi + + local folder + + for folder in `find $1 -type d -print | grep -v "/\.svn" | sort -r`; do + if [ "`ls -A -1 $folder | grep -v -e '^\.svn' | wc -l`" -eq "0" ]; then + svn_del $folder + fi + done + +} + +function commit_changes { + + # usage: commit_changes + + local repos="$1" tmpfile + shift + + if svn_folder $repos; then + cwd="`pwd`" + chown_svn $repos && chgrp_svn $repos + cd $repos + if [ ! -z "$1" ]; then + if tmpfile=`mktemp $TMP/simplepkg_commit.XXXXXX`; then + echo $* > $tmpfile + chmod +r $tmpfile + su_svn commit -F $tmpfile + rm -f $tmpfile + else + su_svn commit + fi + else + su_svn commit + fi + cd $cwd + fi + +} + +function valid_svn_repo { + + # check a svn repository URL + # usage: set_svn_repo + + if [ ! -z "$1" ]; then + if echo $1 | grep -q -v -e "^svn://"; then + if echo $1 | grep -q -v -e "svn+.\+://"; then + if echo $1 | grep -q -v -e "^file://"; then + echo $BASENAME: invalid repository URL $1 + return 1 + fi + fi + fi + else + echo $BASENAME: no repository defined + return 1 + fi + +} + +function check_and_create_svn_repo { + + # check and create svn repository + # usage: check_and_create_svn_repo + + local repository="$1" repository_type repository_path + + if ! echo $repository | grep -q ":"; then + repository="file://$repository" + fi + + repository_type="`echo $repository | cut -d : -f 1`" + repository_path="`echo $repository | cut -d : -f 2`" + + if [ "$repository_type" == "file" ] && [ ! -d "$repository_path" ]; then + echo "Creating subversion repository $repository..." + mkdir -p `dirname $repository_path` + svnadmin create $repository_path --fs-type fsfs + if [ "$?" != "0" ]; then + EXIT_CODE="1" + return $EXIT_CODE + else + return 0 + fi + fi + +} + +function repository_import { + + # import a folder into a subversion repository + # usage: repository_import + + local folder="$1" oldfolder tmpfile + local repository="$2" repository_type repository_path + + if [ ! -d "$folder" ] || [ -z "$repository" ]; then + EXIT_CODE="1" + return $EXIT_CODE + fi + + if ! valid_svn_repo $repository; then + echo "Invalid repository $repository, aborting." + EXIT_CODE="1" + return $EXIT_CODE + fi + + if ! echo $repository | grep -q ":"; then + repository="file://$repository" + fi + + mkdir -p $folder + + if svn_folder $folder; then + echo "Packages folder $folder seens to be already under revision control, aborting." + EXIT_CODE="1" + return $EXIT_CODE + fi + + check_and_create_svn_repo $repository + if [ "$?" != "0" ]; then + EXIT_CODE="1" + return $EXIT_CODE + fi + + repository_path="`echo $repository | cut -d : -f 2`" + if [ -d "$repository_path" ]; then + chown_svn $repository_path && chgrp_svn $repository_path + fi + + echo "Importing files from $folder into $repository..." + if tmpfile=`mktemp $TMP/simplepkg_import.XXXXXX`; then + echo "initial import" > $tmpfile + chmod +r $tmpfile + su_svn import $folder $repository -F $tmpfile + rm -f $tmpfile + else + EXIT_CODE="1" + return $EXIT_CODE + fi + + if [ "$?" == "0" ]; then + echo "Making $folder a working copy of $repository..." + oldfolder="$(mktemp -d $(echo $folder | sed -e 's/\/*$//g').XXXXXX)" + echo "Backing up old $folder at $oldfolder..." + mv $folder $oldfolder + chown_svn `dirname $folder` && chgrp_svn `dirname $folder` + su_svn checkout $repository $folder + else + EXIT_CODE="1" + return $EXIT_CODE + fi + +} + +# ----------------------------------------------- +# update jail functions +# ----------------------------------------------- + +function update_template_files { + + # update template files from svn + # usage: update_template_files + + if templates_under_svn && svn_folder `template_files`; then + echo Checking out last template revision from svn... + cd `dirname $TEMPLATE_BASE` + svn update + fi + +} + +function update_jail_packages { + + # update jail packages according the template + # usage: update_jail_packages + + # check if installed packages are listed in the template + for pack in `ls -1 $1/var/log/packages/`; do + pack=`package_name $pack` + if ! `grep -v -e "^#" $(template_packages) | cut -d : -f 1 | awk '{ print $1 }' | grep -q -e "^$pack\$"`; then + ROOT=$1 removepkg $pack + fi + done + + # check if each package from the template is installed + grep -v -e "^#" `template_packages` | cut -d : -f 1 | awk '{ print $1 }' | while read pack; do + + # check if the package is installed + pack="`echo $pack | sed -e 's/\+/\\\+/'`" + installed="`check_installed $pack $1`" + check=$? + + if [ -z "$installed" ] || [ "$check" != "0" ]; then + # the package isn't installed + ROOT=$1 simplaret install $pack + fi + done + +} + +function copy_template_files { + + # copy template files into jail + # usage: copy_template_files + + if [ -d "$1" ]; then + if [ -d "`template_files`" ]; then + echo "Copying template files to $1..." + if templates_under_svn && svn_folder `template_files`; then + rsync -av --exclude=.svn `template_files`/ $1/ + else + rsync -av `template_files`/ $1/ + fi + fi + fi + +} + +function set_jail_perms { + + # set template file permissions under a jail + # usage: set_jail_perms + + if [ -s "`template_perms`" ]; then + echo Setting jail $1 permissions... + cat `template_perms` | while read entry; do + file="`echo $entry | cut -d ";" -f 1`" + if [ -e "`template_files`/$file" ] && [ -a "$1/$file" ]; then + owner="`echo $entry | cut -d ";" -f 2`" + group="`echo $entry | cut -d ";" -f 3`" + perms="`echo $entry | cut -d ";" -f 4`" + chmod $perms $1/$file + chown $owner:$group $1/$file + fi + done + fi + +} + +# ----------------------------------------------- +# repository build functions +# ----------------------------------------------- + +function svn_add_meta { + + find . -name '*meta' -exec svn add {} 2> /dev/null \; + +} + +function gen_filelist { + + # generate FILELIST.TXT + # usage: gen_filelist + + find . -type f -name '*.tgz' -follow -print | sort | tr '\n' '\0' | \ + xargs -0r ls -ldL --time-style=long-iso > FILELIST.TXT + echo "Created new FILELIST.TXT" + + svn_add FILELIST.TXT + +} + +function gen_patches_filelist { + + # generate FILE_LIST + # usage: gen_patches_filelist + + if [ ! -z "$1" ] && [ -d "$1" ]; then + + local folder + folder="$1" + + ( + + cd $folder + + find . -type f -name '*.tgz' -follow -print | sort | tr '\n' '\0' | \ + xargs -0r ls -ldL --time-style=long-iso > FILE_LIST + + svn_add FILE_LIST + + ) + + if [ "$1" == "." ]; then + echo "Created new FILE_LIST" + else + echo "Created new $1/FILE_LIST" + fi + + fi + +} + +function gen_packages_txt { + + # generate PACKAGES.TXT + # usage: gen_packages_txt + + if [ ! -z "$1" ] && [ -d "$1" ]; then + + local folder + folder="$1" + + ( + + cd $folder + + echo '' > PACKAGES.TXT + find . -type f -name '*.meta' -exec cat {} \; >> PACKAGES.TXT + cat PACKAGES.TXT | gzip -9 -c - > PACKAGES.TXT.gz + + svn_add PACKAGES.TXT + svn_add PACKAGES.TXT.gz + + ) + + if [ "$1" == "." ]; then + echo "Created new PACKAGES.TXT and PACKAGES.TXT.gz" + else + echo "Created new $1/PACKAGES.TXT and $1/PACKAGES.TXT.gz for $folder" + fi + + fi + +} + +function gen_md5_checksums { + + # generate CHECKSUMS.md5 + # usage: gen_md5_checksums + + if [ -d "$1" ]; then + + local folder + folder="$1" + + ( + + cd $folder + + echo 'MD5 digest for files in this directory.' > CHECKSUMS.md5 + echo '' >> CHECKSUMS.md5 + find . -type f -name '*.tgz' -exec md5sum {} \; >> CHECKSUMS.md5 + cat CHECKSUMS.md5 | gzip -9 -c - > CHECKSUMS.md5.gz + + svn_add CHECKSUMS.md5 + svn_add CHECKSUMS.md5.gz + + ) + + if [ "$1" == "." ]; then + echo "Created new CHECKSUMS.md5 and CHECKSUMS.md5.gz" + else + echo "Created new $1/CHECKSUMS.md5 and $1/CHECKSUMS.md5.gz for $folder" + fi + + fi + +} + +function update_md5_checksum { + + # update CHECKSUMS.md5 + # usage: update_md5_checksums + + if [ -z "$2" ] || [ ! -d "$1" ] || [ ! -f "$1/$2" ]; then + return 1 + else + local file folder + file="$2" + folder="$1" + fi + + ( + + cd $folder + + if [ ! -f CHECKSUMS.md5 ]; then + gen_md5_checksums . + else + # remove the old entry and add a new one + sed -i "/ \.*\/*$(regexp_slash $file)$/d" CHECKSUMS.md5 + file="`echo $file | sed -e 's/\.*\/*//'`" # remove additional ./ + md5sum ./$file >> CHECKSUMS.md5 + fi + + cat CHECKSUMS.md5 | gzip -9 -c - > CHECKSUMS.md5.gz + + echo "Updated CHECKSUMS.md5 at $folder" + + svn_add CHECKSUMS.md5 + svn_add CHECKSUMS.md5.gz + + ) + +} + +function gen_meta { + + # generate metafiles + # usage: gen_meta + + if [ ! -f $1 ]; then + return 1 + else + file="$1" + fi + + if [ "`echo $file | grep -E '(.*{1,})\-(.*[\.\-].*[\.\-].*).tgz[ ]{0,}$'`" == "" ]; then + return + fi + + NAME=$(echo $file | sed -re "s/(.*\/)(.*.tgz)$/\2/") + LOCATION=$(echo $file | sed -re "s/(.*)\/(.*.tgz)$/\1/") + SIZE=$( expr `gunzip -l $file | tail -n 1 | awk '{ print $1 }'` / 1024 ) + USIZE=$( expr `gunzip -l $file | tail -n 1 | awk '{ print $2 }'` / 1024 ) + REQUIRED=$(tar xzfO $file install/slack-required 2>/dev/null | grep -v -e "^#" | xargs -r -iZ echo -n "Z," | sed -e "s/,$//") + CONFLICTS=$(tar xzfO $file install/slack-conflicts 2>/dev/null | grep -v -e "^#" | xargs -r -iZ echo -n "Z," | sed -e "s/,$//") + SUGGESTS=$(tar xzfO $file install/slack-suggests 2>/dev/null | grep -v -e "^#" | xargs -r ) + METAFILE=${NAME%tgz}meta + + echo "PACKAGE NAME: $NAME" > $LOCATION/$METAFILE + + if [ -n "$DL_URL" ]; then + echo "PACKAGE MIRROR: $DL_URL" >> $LOCATION/$METAFILE + fi + + echo "PACKAGE LOCATION: $LOCATION" >> $LOCATION/$METAFILE + echo "PACKAGE SIZE (compressed): $SIZE K" >> $LOCATION/$METAFILE + echo "PACKAGE SIZE (uncompressed): $USIZE K" >> $LOCATION/$METAFILE + echo "PACKAGE REQUIRED: $REQUIRED" >> $LOCATION/$METAFILE + echo "PACKAGE CONFLICTS: $CONFLICTS" >> $LOCATION/$METAFILE + echo "PACKAGE SUGGESTS: $SUGGESTS" >> $LOCATION/$METAFILE + echo "PACKAGE DESCRIPTION:" >> $LOCATION/$METAFILE + + tar xzfO $file install/slack-desc | grep -E '\w+\:' | grep -v '^#' >> $LOCATION/$METAFILE + + echo "" >> $LOCATION/$METAFILE + echo "Created metafile for `basename $file`" + + ( cd `dirname $file` && svn_add `basename $file .tgz`.meta ) + +} + +function repo_gpg_key { + + # adds or updates a repository keyring + # usage: repo_gpg_key [update] + + local folder="$1" update="$2" tmp_gpg_folder + + if [ -z "$SIGN_KEYID" ]; then + echo "GPG-KEY checking failed, no sign key id set." + return 1 + fi + + if [ "$update" == "--update" ]; then + update=true + else + update=false + fi + + if [ $SIGN -eq $on ]; then + if [ -f "$folder/GPG-KEY" ]; then + if $update || ! gpg --with-colons < $folder/GPG-KEY | cut -d : -f 5 | grep -q -e "$SIGN_KEYID$"; then + echo "Adding OpenPGP key id $SIGN_KEYID to $folder/GPG-KEY file..." + + tmp_gpg_folder="`mktemp -d $TMP/tmp_gpg_folder.XXXXXX`" + tmp_gpg_pubkey="`mktemp -d $TMP/tmp_gpg_pubkey.XXXXXX`" + + if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then + chown $SIGN_USER $tmp_gpg_folder + chown $SIGN_USER $tmp_gpg_pubkey + + # merge pubkey information in a temporary keyring + su $SIGN_USER -c "gpg --export --armor $SIGN_KEYID > $tmp_gpg_pubkey/pubkey.asc" + su $SIGN_USER -c "gpg --homedir $tmp_gpg_folder --import < $folder/GPG-KEY" + su $SIGN_USER -c "gpg --homedir $tmp_gpg_folder --import < $tmp_gpg_pubkey/pubkey.asc" + + # export temporary keyring to repository keyring + su $SIGN_USER -c "gpg --homedir $tmp_gpg_folder --export --armor" > $folder/GPG-KEY + else + # merge pubkey information in a temporary keyring + gpg --export --armor $SIGN_KEYID > $tmp_gpg_pubkey/pubkey.asc + gpg --homedir $tmp_gpg_folder --import < $folder/GPG-KEY + gpg --homedir $tmp_gpg_folder --import < $tmp_gpg_pubkey/pubkey.asc + + # export temporary keyring to repository keyring + gpg --homedir $tmp_gpg_folder --export --armor > $folder/GPG-KEY + fi + + # cleanup + rm -rf $tmp_gpg_folder $tmp_gpg_pubkey + + fi + else + echo "Adding OpenPGP key id $SIGN_KEYID to $folder/GPG-KEY file..." + if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then + su $SIGN_USER -c "gpg --export --armor $SIGN_KEYID" > $folder/GPG-KEY + else + gpg --export --armor $SIGN_KEYID > $folder/GPG-KEY + fi + fi + svn_add $folder/GPG-KEY + fi + +} + +# ----------------------------------------------- +# Error functions +# ----------------------------------------------- + +function error_codes { + + # Slackbuilds error codes ** not change ** + ERROR_WGET=31 # wget error + ERROR_MAKE=32 # make source error + ERROR_INSTALL=33 # make install error + ERROR_MD5=34 # md5sum error + ERROR_CONF=35 # ./configure error + ERROR_HELP=36 # dasable + ERROR_TAR=37 # tar error + ERROR_MKPKG=38 # makepkg error + ERROR_GPG=39 # gpg check error + ERROR_PATCH=40 # patch error + ERROR_VCS=41 # cvs error + ERROR_MKDIR=42 # make directory error + ERROR_MANIFEST=43 # manifest error + # Slackbuilds error codes ** not change ** + + # Commum error codes + ERROR_FILE_NOTFOUND=100 # file not found + ERROR_NOT_NUMBER=101 # argument is not a number + ERROR_PAR_NUMBER=102 # incorrect number of parameters + ERROR_COMMON_NOT_FOUND=103 # common.sh not found + + # Createpkg error codes + ERROR_CREATEPKG_INSTALLPKG=200 # installpkg error + ERROR_CREATEPKG_DEPENDENCY=201 # dependency error + ERROR_CREATEPKG_SLACKBUILD_NOTFOUND=202 # Script or package not found + + # Mkbuild error codes + ERROR_MKBUILD_FILE_NOT_FOUND=500 + ERROR_MKBUILD_CONSTRUCTION=501 + ERROR_MKBUILD_PROGRAM=502 + ERROR_MKBUILD_INPUT_PAR=503 + ERROR_MKBUILD_SVN=504 + + # Mkpatch error codes + ERROR_MKPATCH=600 +} + +function handle_error { + + # This function deals with internal createpkg errors + # and also with non-zero exit codes from slackbuilds + # Input: $1 - error code + # Output: Error mensage + # + # check slackbuild exit status are: + # + # ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 + # ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 + # ERROR_TAR=37; ERROR_MKPKG=38 ERROR_GPG=39 + # ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 + # + + # we don't want to process when exit status = 0 + [ "$1" == "0" ] && return + + # Exit codes + case $1 in + # + # Slackbuilds errors + $ERROR_WGET) + eecho $error "$BASENAME: error downloading source/package for $2" ;; + $ERROR_MAKE) + eecho $error "$BASENAME: error compiling $2 source code" ;; + $ERROR_INSTALL) + eecho $error "$BASENAME: error installing $2" ;; + $ERROR_MD5) + eecho $error "$BASENAME: error on source code integrity check for $2" ;; + $ERROR_CONF) + eecho $error "$BASENAME: error configuring the source code for $2" ;; + $ERROR_HELP) + exit 0 ;; # its supposed to never happen here :P + $ERROR_TAR) + eecho $error "$BASENAME: error decompressing source code for $2" ;; + $ERROR_MKPKG) + eecho $error "$BASENAME: error creating package $2" ;; + $ERROR_GPG) + eecho $error "$BASENAME: error verifying GPG signature the source code for $2" ;; + $ERROR_PATCH) + eecho $error "$BASENAME: error patching the source code for $2" ;; + $ERROR_VCS) + eecho $error "$BASENAME: error downloading $2 source from version control system" ;; + $ERROR_MKDIR) + eecho $error "$BASENAME: make directory $2 error, aborting" ;; + $ERROR_MANIFEST) + eecho $error "$BASENAME: problem with Manifest file, aborting" ;; + + # + # General errors + $ERROR_FILE_NOTFOUND) + eecho $error "$BASENAME: file $2 not found!" ;; + $ERROR_NOT_NUMBER) + eecho $error "$BASENAME: $2 need a number argument" ;; + $ERROR_PAR_NUMBER) + eecho $error "$BASENAME: incorrect number of parameters" ;; + #$ERROR_COMMON_NOT_FOUND) + # eecho $error "$BASENAME: file $COMMON_SH not found. Check your $BASENAME installation" ;; + + # + # Createpkg errors + $ERROR_CREATEPKG_INSTALLPKG) + eecho $error "$BASENAME: install package $2 error, aborting" ;; + $ERROR_CREATEPKG_DEPENDENCY) + eecho $error "$BASENAME: dependency solve error, aborting" ;; + $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND) + eecho $error "$BASENAME: SlackBuild or package not found" ;; + + # + # Mkbuild errors + $ERROR_MKBUILD_CONSTRUCTION) + eecho $error "$BASENAME: Construction error in $2 variable." ;; + $ERROR_MKBUILD_PROGRAM) + eecho $error "$BASENAME: Program logical error." ;; + $ERROR_MKBUILD_INPUT_PAR) + eecho $error "$BASENAME: Input parameter $2 error. See \"mkbuild --help\"." ;; + $ERROR_MKPATCH) + eecho $error "$BASENAME: Mkpatch error. Check .mkbuild file." ;; + $ERROR_MKBUILD_VCS) + eecho $error "$BASENAME: VCS or empty URL. Disable this sections in .mkbuild file:\n - download_source;\n - md5sum_download_and_check_0;\n - md5sum_download_and_check_1;\n - gpg_signature_check\n - untar_source" + ;; + # + # Others errors + *) + eecho $error "$BASENAME: unknown error or user interrupt" ;; + esac + + is_number $1 && exit $1 || exit 1 + +} + +# ----------------------------------------------- +# misc functions +# ----------------------------------------------- + +function slash { + + # remove additional slashes + echo $* | sed -e 's/\/\+/\//g' + +} + +function color_select { + + # Select color mode: gray, color or none (*) + # commun - Communication + # messag - Commum messages + # error - Error messages + # normal - turn off color + + case "$1" in + 'gray') + # colors + normal="\033[m" + dark_gray="\033[30;1m" + gray="\033[37m" + white="\033[37;1m" + + red=$dark_gray + blue=$dark_gray + green=$gray + yellow=$gray + + # Actions + commun=$white + messag=$white + error=$dark_gray + alert=$gray + ;; + 'color') + # colors + normal="\033[m" + dark_gray="\033[30;1m" + gray="\033[37m" + white="\033[37;1m" + + red="\033[31;1m" + blue="\033[34;1m" + green="\033[32;1m" + yellow="\033[33;1m" + + # Actions + commun=$green + messag=$blue + error=$red + alert=$yellow + ;; + *) + commun="" + messag="" + error="" + alert="" + ;; + esac + +} + +function eecho { + + # echoes a message + # usage: eecho + # message-type can be: commun, messag, error, normal + + echo -e "${1}${2}${normal}" + +} + +function is_number { + + # Check if $1 is a number + local -i int + if [ $# -eq 0 ]; then + return 1 + else + (let int=$1) 2>/dev/null + return $? # Exit status of the let thread + fi + +} + +function regexp_slash { + + # escape slashes + echo $1 | sed -e 's/\//\\\//g' + +} + +function is_the_same { + + # check if two files are in fact the same + # usage: is_the_same + + if [ -e "$1" ] && [ -e "$2" ] && \ + [ "`stat -c '%d' $1`" == "`stat -c '%d' $2`" ] && \ + [ "`stat -c '%i' $1`" == "`stat -c '%i' $2`" ]; then + return 0 + else + return 1 + fi + +} + +function check_gnupg { + + # setup gnupg keyring if needed + # usage: check_gnupg [username] + + local user="$1" home + + if [ ! -z "$user" ]; then + home="`grep "^$user:" /etc/passwd | cut -d : -f 6`" + if [ ! -d "$home/.gnupg" ]; then + echo "Setting up gnupg..." + su $user -c "gpg --list-keys" + fi + else + if [ ! -d "$HOME/.gnupg" ]; then + echo "Setting up gnupg..." + gpg --list-keys + fi + fi + +} + +function strip_gpg_signature { + + # strip gpg signature from file + # usage: strip_gpg_signature + + local file="$1" + + if [ -e "$file" ]; then + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" $file; then + sed -e '1,3d' -e '/^$/d' -e '/-----BEGIN PGP SIGNATURE-----/,/-----END PGP SIGNATURE-----/d' $file + else + cat $file + fi + fi + +} + +function get_sign_user { + + # get sign package user + # usage: get_sign_package_user + + check_gnupg $SIGN_USER + + if [ -z "$SIGN_KEYID" ]; then + if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then + SIGN_KEYID="`su $SIGN_USER -c \ + "gpg --list-secret-keys --with-colons | grep ^sec | head -n 1 | cut -d : -f 5 | sed 's/^.*\(.\{8\}\)$/\1/'"`" + else + SIGN_KEYID="`gpg --list-secret-keys --with-colons | grep ^sec | head -n 1 | cut -d : -f 5 | sed 's/^.*\(.\{8\}\)$/\1/'`" + fi + fi + +} + +function update_keyring { + + # update keyring using GPG-KEY from a repository + # usage: update_keyring + + local keyring keys key + + keyring="$1" + + if [ ! -e "$keyring" ]; then + repo_gpg_key `dirname $keyring` + return + fi + + keys="`gpg --with-colons $keyring | cut -d : -f 5 | sed -e '/^$/d'`" + + for key in $keys; do + if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then + su $SIGN_USER -c "gpg --list-keys $key &> /dev/null" + if [ "$?" != "0" ]; then + echo "Updating keyring using $keyring..." + su $SIGN_USER -c "gpg --import $keyring" + break + fi + else + gpg --list-keys $key &> /dev/null + if [ "$?" != "0" ]; then + echo "Updating keyring using $keyring..." + gpg --import $keyring + break + fi + fi + done + +} + +function rmd160sum { + + # computes RIPEMD-160 message digest + # usage: rmd160sum + + local sum file="$1" + + if [ ! -e "$file" ]; then + return 1 + fi + + sum="`openssl rmd160 $file | awk '{ print $2 }'`" + echo "$sum $file" + +} + +function gethash { + + # get a file's hash + # usage: gethash + + if [ ! -e "$2" ]; then + return 1 + fi + + $1sum $file | awk '{ print $1 }' + +} + +function file_size { + + # get file size + # usage: filesize + + if [ ! -e "$1" ]; then + return 1 + fi + + wc -c $file | awk '{ print $1 }' + +} + +function file_extension { + + # output file extension + # usage: filesize + + echo `basename $1` | sed -e 's/.*\.\(.*\)$/\1/' + +} + +function absolute_folder { + + # get the absolute folder from a file + # usage: absolute_folder + + local file="$1" cwd + + if [ -e "$file" ]; then + cwd="`pwd`" + cd `dirname $file` + pwd + cd $cwd + fi + +} + +function list_builds { + + # list all available builds + # usage: list_builds + + local folder="$1" file_type="$2" + local i j k + + if [ ! -d "$folder" ] || [ -z "$file_type" ]; then + return + fi + + cd $folder + echo "Sarava $file_type list" + # level 1 + for i in *; do + if [ -d $i ]; then + echo -e " $i: " + ( + cd $i + # level 2 + for j in *; do + if [ -d $j ]; then + eecho $commun " $j" + ( + cd $j + BUILD="`ls *.$file_type 2>/dev/null`" + if [ "$BUILD" != "" ]; then + # level 3 + for k in $BUILD; do + eecho $messag " $k" + done + else + BUILD="" + fi + for k in *; do + if [ -d $k ]; then + eecho $messag " $k.$file_type" + fi + done + ) + fi + done + ) + fi + done + +} + +function check_installed { + + # checks if a package is installed + # usage: check_installed [root] + + eval "ls /$2/var/log/packages/ | grep -E '^$1-[^-]+-[^-]+-[^-]+$'" + +} diff --git a/tags/0.6rc1/mkbuild/generic.mkSlackBuild b/tags/0.6rc1/mkbuild/generic.mkSlackBuild new file mode 100644 index 0000000..5b3b73c --- /dev/null +++ b/tags/0.6rc1/mkbuild/generic.mkSlackBuild @@ -0,0 +1,527 @@ +################################################################# +## Generic template for SlackBuilds +## +## Version 0.9.9 - Luis ( luis at riseup d0t net) +## Alves ( rudsonalves at yahoo d0t com d0t br ) +## Version $Rev$ - $Author$ +################################################################# +#!/bin/bash + off +# +# [[PROGRAM NAME]].SlackBuild 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 2 of the License, +# or any later version. +# +# [[PROGRAM NAME]].SlackBuild 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 this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# +# slackbuild for [[PROGRAM NAME]], by [[SLACKBUILD AUTHOR]] +# requires: [[REQUIRES]] +# tested: [[PROGRAM NAME]]-[[VERSION]] +# model: generic.mkSlackBuild $Rev$ +# + + + off +# Look for slackbuildrc +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +elif [ -f /etc/slackbuildrc ]; then + source /etc/slackbuildrc +fi + + + off +# Set variables +CWD="$(pwd)" +SRC_NAME="[[SOURCE NAME]]" +PKG_NAME="[[PACKAGE NAME]]" +ARCH=${ARCH:=[[ARCH]]} +SRC_VERSION=${VERSION:=[[VERSION]]} +PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')" +BUILD=${BUILD:=[[BUILD NUMBER]][[SLACKBUILD AUTHOR INITIALS]]} +SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME +TMP=${TMP:=/tmp} +PKG=${PKG:=$TMP/package-$PKG_NAME} +REPOS=${REPOS:=$TMP} +SLACKBUILD_PATH=${SLACKBUILD_PATH:="[[SLACKBUILD PATH]]"} +PREFIX=${PREFIX:=[[PREFIX]]} +PKG_WORK="$TMP/$SRC_NAME" +CONF_OPTIONS=${CONF_OPTIONS:="[[OTHER CONFIGURE ARGS]]"} +NUMJOBS=${NUMJOBS:="[[NUMBER OF JOBS]]"} + + + off +# Set system libraries' path and optmization flags based on $ARCH +LIBDIR="$PREFIX/lib" + +if [ "$ARCH" = "i386" ]; then + SLKCFLAGS="-O2 -march=i386 -mtune=i686" +elif [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIR="$PREFIX/lib64" + LDFLAGS="-L/lib64 -L/usr/lib64" +fi + + + off +# Set error codes (used by createpkg) +ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 +ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 +ERROR_TAR=37; ERROR_MKPKG=38; ERROR_GPG=39 +ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 +ERROR_MANIFEST=43; + + + off +# Clean up any leftovers of previous builds +rm -rf "$PKG_WORK" 2> /dev/null +rm -rf "$PKG" 2> /dev/null + +# Create directories if necessary +mkdir -p "$SRC_DIR" || exit $ERROR_MKDIR +mkdir -p "$PKG" || exit $ERROR_MKDIR +mkdir -p "$REPOS" || exit $ERROR_MKDIR +mkdir -p "$PKG_WORK" || exit $ERROR_MKDIR + + + + off +# Creating build user and group +if ! grep -qe "^$PKG_NAME:" /etc/group; then + groupadd $PKG_NAME +fi +if ! grep -qe "^$PKG_NAME:" /etc/passwd; then + useradd $PKG_NAME -g $PKG_NAME +fi + + + off +# Dowload source if necessary +SRC="[[SOURCE NAME CONSTRUCTION STRING]]" +URL="[[DOWNLOAD FOLDER URL]]/$SRC" + +if [ ! -s "$SRC_DIR/$SRC" ] || ! [[DECOMPRESSOR]] [[DECOMPRESSOR TEST FLAG]] "$SRC_DIR/$SRC" 2> /dev/null; then + wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET +fi + + + off +# Get svn source code +cd "$SRC_DIR" +SND_DIR="`basename [[DOWNLOAD FOLDER URL]]`" + +if [ "`find "$SRC_DIR/" -name .svn`" != "" ] && [ -d "$SRC_DIR/$SND_DIR" ]; then + cd $SND_DIR + svn update || exit $ERROR_VCS +else + svn checkout [[DOWNLOAD FOLDER URL]] $SND_DIR || exit $ERROR_VCS + cd $SND_DIR +fi + +PKG_VERSION="`svn info | awk '/Last Changed Rev:/ { print $4 }'`_svn" + +# Copy svn source +cd "$PKG_WORK" +cp -a $SRC_DIR/* . +PKG_SRC="$PWD/$SND_DIR" +cd "$PKG_SRC" + + + off +# Get git source code +cd "$SRC_DIR" +SND_DIR="`basename [[DOWNLOAD FOLDER URL]] .git`" + +if [ "`find "$SRC_DIR/" -name .git`" != "" ] && [ -d "$SRC_DIR/$SND_DIR" ]; then + cd $SND_DIR + git pull || exit $ERROR_VCS +else + git clone [[DOWNLOAD FOLDER URL]] $SND_DIR || exit $ERROR_VCS + cd $SND_DIR +fi + +PKG_VERSION="`git log | head -n 1 | awk '{ print $2 }'`_git" + +# Copy git source +cd "$PKG_WORK" +cp -a $SRC_DIR/* . +PKG_SRC="$PWD/$SND_DIR" +cd "$PKG_SRC" + + + off +# Download patches +if echo [[PATCH URLS]] | grep -q -v "PATCH URLS"; then + for patch_url in [[PATCH URLS]]; do + patch="`basename $patch_url`" + if [ ! -s "$SRC_DIR/$patch" ]; then + wget "$patch_url" -O "$SRC_DIR/$patch" || exit $ERROR_WGET + fi + done +fi + + + off +# MD5 checksum +MD5SUM_URL="[[MD5SUM CODE]]" + +if [ ${#MD5SUM_URL} -eq 32 ]; then + MD5SUM_SRC="$(md5sum "$SRC_DIR/$SRC" | cut -c-32 )" + [ "$MD5SUM_SRC" == "$MD5SUM_URL" ] || exit $ERROR_MD5 + +# Download source's MD5 checksum if necessary and check it +if [ ! -s "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" ]; then + wget "$URL.[[MD5SUM EXTENSION]]" -O "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_WGET +fi + +md5sum -c "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_MD5 + + + off +# Import minimized signing key from +if echo [[SIGNING KEY URL]] | grep -q -v "SIGNING KEY URL"; then + lynx -dump [[SIGNING KEY URL]] | gpg --import || exit $ERROR_GPG +elif echo [[SIGNING KEY ID]] | grep -q -v "SIGNING KEY ID"; then + gpg --recv-keys [[SIGNING KEY ID]] || exit $ERROR_GPG +else + gpg --import << EOKEY || exit $ERROR_GPG +[[SIGNING KEY]] +EOKEY +fi + +# Download source's signature if necessary and check it +if echo [[SIGNING URL]] | grep -q -v "SIGNING URL"; then + SIGNATURE="`basename [[SIGNING URL]]`" + if [ ! -s "$SRC_DIR/$SIGNATURE" ]; then + wget "[[SIGNING URL]]" -O "$SRC_DIR/$SIGNATURE" || exit $ERROR_WGET + fi +else + if [ -s "$SRC_DIR/$SRC.sig" ]; then + SIGNATURE="$SRC.sig" + elif [ -s "$SRC_DIR/$SRC.asc" ]; then + SIGNATURE="$SRC.asc" + else + echo Trying to get signature file from $URL.sig... + if wget "$URL.sig" -O "$SRC_DIR/$SRC.sig"; then + SIGNATURE="$SRC.sig" + else + rm $SRC_DIR/$SRC.sig + echo Trying to get signature file from $URL.asc... + if wget "$URL.asc" -O "$SRC_DIR/$SRC.asc"; then + SIGNATURE="$SRC.asc" + else + rm $SRC_DIR/$SRC.asc + echo "Error getting source's signature file" + exit $ERROR_GPG + fi + fi + fi +fi + +echo Checking $SRC_DIR/$SRC with gpg using $SRC_DIR/$SIGNATURE... +gpg --verify "$SRC_DIR/$SIGNATURE" "$SRC_DIR/$SRC" || exit $ERROR_GPG +echo Success. + + + off +# Check Manifest file +if [ -e "$CWD/Manifest" ]; then + + # Manifest signature checking + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" $CWD/Manifest; then + echo "Checking Manifest signature..." + gpg --verify $CWD/Manifest + if [ "$?" != "0" ]; then + exit $ERROR_MANIFEST + fi + fi + + MANIFEST_LINES="`grep -E -v "^(MKBUILD|SLACKBUILD)" $CWD/Manifest | wc -l`" + + for ((MANIFEST_COUNT=1; MANIFEST_COUNT <= $MANIFEST_LINES; MANIFEST_COUNT++)); do + + MANIFEST_LINE="`grep -E -v "^(MKBUILD|SLACKBUILD)" $CWD/Manifest | head -n $MANIFEST_COUNT | tail -n 1`" + MANIFEST_FILE="`echo $MANIFEST_LINE | awk '{ print $2 }'`" + MANIFEST_FILE_TYPE="`echo $MANIFEST_LINE | awk '{ print $1 }'`" + + if [ -e "$SRC_DIR/$MANIFEST_FILE" ]; then + MANIFEST_FILE="$SRC_DIR/$MANIFEST_FILE" + else + MANIFEST_FILE="`find $CWD -name $MANIFEST_FILE`" + fi + + if [ ! -e "$MANIFEST_FILE" ] || [ -d "$MANIFEST_FILE" ]; then + continue + fi + + echo "Checking Manifest for $MANIFEST_FILE_TYPE $MANIFEST_FILE integrity..." + + SIZE_SRC="`wc -c $MANIFEST_FILE | awk '{ print $1 }'`" + SIZE_MANIFEST="`echo $MANIFEST_LINE | awk '{ print $3 }'`" + + # Check source code size + if [ "$SIZE_SRC" != "$SIZE_MANIFEST" ]; then + echo "SIZE Manifest: $SIZE_MANIFEST; SIZE $SRC: $SIZE_SRC" + exit $ERROR_MANIFEST + else + echo "Size match." + fi + + # Check source code integrity + for ALGO in md5 rmd160 sha1 sha256 sha512; do + if [ $ALGO = "rmd160" ]; then + ALGO_SRC="`openssl rmd160 $MANIFEST_FILE | awk '{ print $2 }'`" + else + ALGO_SRC="`"$ALGO"sum $MANIFEST_FILE | awk '{ print $1 }'`" + fi + ALGO="`echo $ALGO | tr '[:lower:]' '[:upper:]'`" + ALGO_MANIFEST=$(echo $MANIFEST_LINE | sed "s/.* $ALGO //" | awk '{ print $1 }') + if [ "$ALGO_SRC" != "$ALGO_MANIFEST" ]; then + echo "$ALGO Manifest: $ALGO_MANIFEST; $ALGO $SRC: $ALGO_SRC" + exit $ERROR_MANIFEST + else + echo "$ALGO match." + fi + done + + done + +else + exit $ERROR_MANIFEST +fi + + + off +# Untar +cd "$PKG_WORK" +[[UNPACKER]] [[UNPACKER FLAGS]] "$SRC_DIR/$SRC" || exit $ERROR_TAR +PKG_SRC="$PWD/`ls -l | awk '/^d/ { print $NF }'`" +cd "$PKG_SRC" + + + off +# Patch source +patches="[[PATCH FILES]] [[PATCH URLS]] + $PKG_NAME.diff $PKG_NAME-$PKG_VERSION.diff + $PKG_NAME-$PKG_VERSION-$ARCH.diff $PKG_NAME-$ARCH.diff" +for patch in $patches; do + patch="`basename $patch`" + if [ -f "$CWD/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/patches/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/$patch.gz" ]; then + gzip -dc "$CWD/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch.gz" ]; then + gzip -dc "$CWD/patches/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ -f "$SRC_DIR/$patch" ]; then + if [ "`basename $patch .gz`" != "$patch" ]; then + gzip -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ "`basename $patch .bz2`" != "$patch" ]; then + bzip2 -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + else + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$SRC_DIR/$patch" || exit $ERROR_PATCH + fi + fi +done + + + off +# Set permissions +chown -R root:root . +find . \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + + + off +# Configure +CFLAGS="$SLKCFLAGS" \ + CXXFLAGS="$SLKCFLAGS" \ + ./configure \ + --prefix="$PREFIX" --libdir="$LIBDIR" $CONF_OPTIONS || exit $ERROR_CONF + + + off +# Compile +make $NUMJOBS || exit $ERROR_MAKE + + + off +# Install +make install DESTDIR="$PKG" || exit $ERROR_INSTALL + + + off +# Strip binaries +( cd "$PKG" + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null +) + + + off +# Compress and link manpages +if [ -d "$PKG/$PREFIX/man" ]; then + ( cd "$PKG/$PREFIX/man" + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + + + off +# Compress info files +if [ -d "$PKG/$PREFIX/info" ]; then + ( cd "$PKG/$PREFIX/info" + rm -f dir + gzip -9 * + ) +fi + + + off +# Copy init scripts +mkdir -p $PKG/etc/rc.d +cp $CWD/rc.* $PKG/etc/rc.d/ + + + off +# Copy config files +mkdir -p $PKG/etc +for conf in [[CONFIG FILES]]; do + mkdir -p $PKG/etc/`dirname $conf` + if [ -e "$CWD/conf/$conf" ]; then + cp -a $CWD/conf/$conf $PKG/etc/$conf + elif [ -e "$CWD/$conf" ]; then + cp -a $CWD/$conf $PKG/etc/$conf + elif [ -e "$conf" ]; then + cp -a $conf $PKG/etc/$conf + fi +done + + + off +# Install documentation +DOCS="[[DOCUMENTATION FILES]]" +mkdir -p "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR +for doc in $DOCS; do + if [ -f "$doc" ]; then + cp -a $doc "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" + fi +done + + + off +# Add package description (slack-desc) +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +cat << EODESC > "$PKG/install/slack-desc" +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler----------------------------------------------------| +[[SLACK-DESC]] +EODESC + + + off +# Move config files to .new to avoid overwriting any system config +for config_file in [[CONFIG FILES]]; do + mv $PKG/$config_file $PKG/$config_file.new +done + + + off +# Add a post-installation script (doinst.sh) +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +cat << EOSCRIPT > "$PKG/install/doinst.sh" +config() { + NEW="\$1" + OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" + OLD="\$(dirname \$NEW)/\$(basename \$OLD .sample)" + OLD="\$(dirname \$NEW)/\$(basename \$OLD .dist)" + + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then + # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} + +mkgroup() { + GROUP="\$1" + if ! grep -qe "^\$GROUP:" etc/group; then + echo Creating group \$GROUP... + chroot . /usr/sbin/groupadd \$GROUP + fi +} + +mkuser() { + USER="\$1" + if [ ! -z "\$2" ]; then + GROUP="\$2" + else + GROUP="\$USER" + fi + if ! grep -qe "^\$USER:" etc/passwd; then + echo Creating user \$USER... + chroot . /usr/sbin/useradd \$USER -g \$GROUP + fi +} + +[[REST OF DOINST.SH]] +EOSCRIPT + + + off +# Copy slack-required +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +if [ -f "$CWD/slack-required" ]; then + cp $CWD/slack-required $PKG/install +fi + + + off +# Build the package +cd "$PKG" +mkdir -p $REPOS/$SLACKBUILD_PATH +makepkg -l y -c n "$REPOS/$SLACKBUILD_PATH/$PKG_NAME-$PKG_VERSION-$ARCH-$BUILD.tgz" || exit $ERROR_MKPKG + + + off +# Delete source and build directories if requested +if [ "$CLEANUP" == "yes" ] || [ "$1" = "--cleanup" ]; then + rm -rf "$PKG_WORK" "$PKG" +fi + diff --git a/tags/0.6rc1/mkbuild/kde4.mkSlackBuild b/tags/0.6rc1/mkbuild/kde4.mkSlackBuild new file mode 100644 index 0000000..8253267 --- /dev/null +++ b/tags/0.6rc1/mkbuild/kde4.mkSlackBuild @@ -0,0 +1,521 @@ +################################################################# +## Generic template for SlackBuilds +## +## Version 1.0.0 - Luis ( luis at riseup d0t net) +## Alves ( rudsonalves at yahoo d0t com d0t br ) +################################################################# +#!/bin/bash + off +# +# [[PROGRAM NAME]].SlackBuild 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 2 of the License, +# or any later version. +# +# [[PROGRAM NAME]].SlackBuild 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 this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# +# slackbuild for [[PROGRAM NAME]], by [[SLACKBUILD AUTHOR]] +# requires: [[REQUIRES]] +# tested: [[PROGRAM NAME]]-[[VERSION]] +# model: kde4.mkSlackBuild $Rev$ +# + + + off +# Look for slackbuildrc +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +elif [ -f /etc/slackbuildrc ]; then + source /etc/slackbuildrc +fi + + + off +# Set variables +CWD="$(pwd)" +SRC_NAME="[[SOURCE NAME]]" +PKG_NAME="[[PACKAGE NAME]]" +ARCH=${ARCH:=[[ARCH]]} +SRC_VERSION=${VERSION:=[[VERSION]]} +PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')" +BUILD=${BUILD:=[[BUILD NUMBER]][[SLACKBUILD AUTHOR INITIALS]]} +SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME +TMP=${TMP:=/tmp} +PKG=${PKG:=$TMP/package-$PKG_NAME} +REPOS=${REPOS:=$TMP} +SLACKBUILD_PATH=${SLACKBUILD_PATH:="[[SLACKBUILD PATH]]"} +PREFIX=${PREFIX:=[[PREFIX]]} +PKG_WORK="$TMP/$SRC_NAME" +CONF_OPTIONS=${CONF_OPTIONS:="[[OTHER CONFIGURE ARGS]]"} +NUMJOBS=${NUMJOBS:="[[NUMBER OF JOBS]]"} + + + off +# Set system libraries' path and optmization flags based on $ARCH +LIBDIR="$PREFIX/lib" + +if [ "$ARCH" = "i386" ]; then + SLKCFLAGS="-O2 -march=i386 -mcpu=i686" +elif [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mcpu=i686" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + LIBDIR="$PREFIX/lib64" + LDFLAGS="-L/lib64 -L/usr/lib64" +fi + +QTDIR="$LIBDIR/qt" +KDEDIRS="$PREFIX" +PATH="$PATH:$LIBDIR/kde4/libexec" + +if [ ! "$XDG_CONFIG_DIRS" == "" ]; then + XDG_CONFIG_DIRS=$XDG_CONFIG_DIRS:/etc/kde/xdg +else + XDG_CONFIG_DIRS=/etc/xdg:/etc/kde/xdg +fi + + + + off +# Set error codes (used by createpkg) +ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 +ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 +ERROR_TAR=37; ERROR_MKPKG=38; ERROR_GPG=39 +ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 +ERROR_MANIFEST=43; + + + off +# Clean up any leftovers of previous builds +rm -rf "$PKG_WORK" 2> /dev/null +rm -rf "$PKG" 2> /dev/null + +# Create directories if necessary +mkdir -p "$SRC_DIR" || exit $ERROR_MKDIR +mkdir -p "$PKG" || exit $ERROR_MKDIR +mkdir -p "$REPOS" || exit $ERROR_MKDIR +mkdir -p "$PKG_WORK" || exit $ERROR_MKDIR + + + + off +# Creating build user and group +if ! grep -qe "^$PKG_NAME:" /etc/group; then + groupadd $PKG_NAME +fi +if ! grep -qe "^$PKG_NAME:" /etc/passwd; then + useradd $PKG_NAME -g $PKG_NAME +fi + + + off +# Dowload source if necessary +SRC="[[SOURCE NAME CONSTRUCTION STRING]]" +URL="[[DOWNLOAD FOLDER URL]]/$SRC" + +if [ ! -s "$SRC_DIR/$SRC" ] || ! [[DECOMPRESSOR]] [[DECOMPRESSOR TEST FLAG]] "$SRC_DIR/$SRC" 2> /dev/null; then + wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET +fi + + + off +# Get svn source code +cd "$SRC_DIR" +SND_DIR="`basename [[DOWNLOAD FOLDER URL]]`" + +if [ "`find "$SRC_DIR/" -name .svn`" != "" ] && [ -d "$SRC_DIR/$SND_DIR" ]; then + cd $SND_DIR + svn update || exit $ERROR_VCS +else + svn checkout [[DOWNLOAD FOLDER URL]] $SND_DIR || exit $ERROR_VCS + cd $SND_DIR +fi + +PKG_VERSION="`svn info | awk '/Last Changed Rev:/ { print $4 }'`_svn" + +# Copy svn source +cd "$PKG_WORK" +cp -a $SRC_DIR/* . +PKG_SRC="$PWD/$SND_DIR" +cd "$PKG_SRC" + + + off +# Download patches +if echo [[PATCH URLS]] | grep -q -v "PATCH URLS"; then + for patch_url in [[PATCH URLS]]; do + patch="`basename $patch_url`" + if [ ! -s "$SRC_DIR/$patch" ]; then + wget "$patch_url" -O "$SRC_DIR/$patch" || exit $ERROR_WGET + fi + done +fi + + + off +MD5SUM_URL="[[MD5SUM CODE]]" + +if [ ${#MD5SUM_URL} -eq 32 ]; then + MD5SUM_SRC="$(md5sum "$SRC_DIR/$SRC" | cut -c-32 )" + [ "$MD5SUM_SRC" == "$MD5SUM_URL" ] || exit $ERROR_MD5 + +# Download source's MD5 checksum if necessary and check it +if [ ! -s "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" ]; then + wget "$URL.[[MD5SUM EXTENSION]]" -O "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_WGET +fi + +md5sum -c "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_MD5 + + + off +# Import minimized signing key from +if echo [[SIGNING KEY URL]] | grep -q -v "SIGNING KEY URL"; then + lynx -dump [[SIGNING KEY URL]] | gpg --import || exit $ERROR_GPG +elif echo [[SIGNING KEY ID]] | grep -q -v "SIGNING KEY ID"; then + gpg --recv-keys [[SIGNING KEY ID]] || exit $ERROR_GPG +else + gpg --import << EOKEY || exit $ERROR_GPG +[[SIGNING KEY]] +EOKEY +fi + +# Download source's signature if necessary and check it +if echo [[SIGNING URL]] | grep -q -v "SIGNING URL"; then + SIGNATURE="`basename [[SIGNING URL]]`" + if [ ! -s "$SRC_DIR/$SIGNATURE" ]; then + wget "[[SIGNING URL]]" -O "$SRC_DIR/$SIGNATURE" || exit $ERROR_WGET + fi +else + if [ -s "$SRC_DIR/$SRC.sig" ]; then + SIGNATURE="$SRC.sig" + elif [ -s "$SRC_DIR/$SRC.asc" ]; then + SIGNATURE="$SRC.asc" + else + echo Trying to get signature file from $URL.sig... + if wget "$URL.sig" -O "$SRC_DIR/$SRC.sig"; then + SIGNATURE="$SRC.sig" + else + rm $SRC_DIR/$SRC.sig + echo Trying to get signature file from $URL.asc... + if wget "$URL.asc" -O "$SRC_DIR/$SRC.asc"; then + SIGNATURE="$SRC.asc" + else + rm $SRC_DIR/$SRC.asc + echo "Error getting source's signature file" + exit $ERROR_GPG + fi + fi + fi +fi + +echo Checking $SRC_DIR/$SRC with gpg using $SRC_DIR/$SIGNATURE... +gpg --verify "$SRC_DIR/$SIGNATURE" "$SRC_DIR/$SRC" || exit $ERROR_GPG +echo Success. + + + off +# Check Manifest file +if [ -e "$CWD/Manifest" ]; then + + # Manifest signature checking + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" $CWD/Manifest; then + echo "Checking Manifest signature..." + gpg --verify $CWD/Manifest + if [ "$?" != "0" ]; then + exit $ERROR_MANIFEST + fi + fi + + MANIFEST_LINES="`grep -E -v "^(MKBUILD|SLACKBUILD)" $CWD/Manifest | wc -l`" + + for ((MANIFEST_COUNT=1; MANIFEST_COUNT <= $MANIFEST_LINES; MANIFEST_COUNT++)); do + + MANIFEST_LINE="`grep -E -v "^(MKBUILD|SLACKBUILD)" $CWD/Manifest | head -n $MANIFEST_COUNT | tail -n 1`" + MANIFEST_FILE="`echo $MANIFEST_LINE | awk '{ print $2 }'`" + MANIFEST_FILE_TYPE="`echo $MANIFEST_LINE | awk '{ print $1 }'`" + + if [ -e "$SRC_DIR/$MANIFEST_FILE" ]; then + MANIFEST_FILE="$SRC_DIR/$MANIFEST_FILE" + else + MANIFEST_FILE="`find $CWD -name $MANIFEST_FILE`" + fi + + if [ ! -e "$MANIFEST_FILE" ] || [ -d "$MANIFEST_FILE" ]; then + continue + fi + + echo "Checking Manifest for $MANIFEST_FILE_TYPE $MANIFEST_FILE integrity..." + + SIZE_SRC="`wc -c $MANIFEST_FILE | awk '{ print $1 }'`" + SIZE_MANIFEST="`echo $MANIFEST_LINE | awk '{ print $3 }'`" + + # Check source code size + if [ "$SIZE_SRC" != "$SIZE_MANIFEST" ]; then + echo "SIZE Manifest: $SIZE_MANIFEST; SIZE $SRC: $SIZE_SRC" + exit $ERROR_MANIFEST + else + echo "Size match." + fi + + # Check source code integrity + for ALGO in md5 sha1 sha256 sha512 rmd160; do + if [ $ALGO = "rmd160" ]; then + ALGO_SRC="`openssl rmd160 $MANIFEST_FILE | awk '{ print $2 }'`" + else + ALGO_SRC="`"$ALGO"sum $MANIFEST_FILE | awk '{ print $1 }'`" + fi + ALGO="`echo $ALGO | tr '[:lower:]' '[:upper:]'`" + ALGO_MANIFEST=$(echo $MANIFEST_LINE | sed "s/.* $ALGO //" | awk '{ print $1 }') + if [ "$ALGO_SRC" != "$ALGO_MANIFEST" ]; then + echo "$ALGO Manifest: $ALGO_MANIFEST; $ALGO $SRC: $ALGO_SRC" + exit $ERROR_MANIFEST + else + echo "$ALGO match." + fi + done + + done + +else + exit $ERROR_MANIFEST +fi + + + off +# Untar +cd "$PKG_WORK" +[[UNPACKER]] [[UNPACKER FLAGS]] "$SRC_DIR/$SRC" || exit $ERROR_TAR +PKG_SRC="$PWD/`ls -l | awk '/^d/ { print $NF }'`" +cd "$PKG_SRC" + + + off +# Patch source +patches="[[PATCH FILES]] [[PATCH URLS]] + $PKG_NAME.diff $PKG_NAME-$PKG_VERSION.diff + $PKG_NAME-$PKG_VERSION-$ARCH.diff $PKG_NAME-$ARCH.diff" +for patch in $patches; do + patch="`basename $patch`" + if [ -f "$CWD/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/patches/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/$patch.gz" ]; then + gzip -dc "$CWD/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch.gz" ]; then + gzip -dc "$CWD/patches/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ -f "$SRC_DIR/$patch" ]; then + if [ "`basename $patch .gz`" != "$patch" ]; then + gzip -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ "`basename $patch .bz2`" != "$patch" ]; then + bzip2 -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + else + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$SRC_DIR/$patch" || exit $ERROR_PATCH + fi + fi +done + + + off +# Set permissions +chown -R root:root . +find . \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \; -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \; + + + off +# Configure +mkdir -p build +cd build + cmake \ + -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \ + -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \ + -DCMAKE_INSTALL_PREFIX=$PREFIX \ + -DMAN_INSTALL_DIR=%PREFIX/man \ + -DLIB_INSTALL_DIR=$LIBDIR \ + -DSYSCONF_INSTALL_DIR=/etc/kde \ + -DKDE_DISTRIBUTION_TEXT="volkerdi@slackware.com" \ + .. + + + off + # Compile + make $NUMJOBS || exit $ERROR_MAKE + + + off + # Install + make install DESTDIR=$PKG || exit $ERROR_INSTALL +cd - + + + off +# Strip binaries +( cd "$PKG" + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null +) + + + off +# Compress and link manpages +if [ -d "$PKG/$PREFIX/man" ]; then + ( cd "$PKG/$PREFIX/man" + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + + + off +# Compress info files +if [ -d "$PKG/$PREFIX/info" ]; then + ( cd "$PKG/$PREFIX/info" + rm -f dir + gzip -9 * + ) +fi + + + off +# Copy init scripts +mkdir -p $PKG/etc/rc.d +cp $CWD/rc.* $PKG/etc/rc.d/ + + + off +# Copy config files +mkdir -p $PKG/etc +for conf in [[CONFIG FILES]]; do + mkdir -p $PKG/etc/`dirname $conf` + if [ -e "$CWD/conf/$conf" ]; then + cp -a $CWD/conf/$conf $PKG/etc/$conf + elif [ -e "$CWD/$conf" ]; then + cp -a $CWD/$conf $PKG/etc/$conf + elif [ -e "$conf" ]; then + cp -a $conf $PKG/etc/$conf + fi +done + + + off +# Install documentation +DOCS="[[DOCUMENTATION FILES]]" +mkdir -p "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR +for doc in $DOCS; do + if [ -f "$doc" ]; then + cp -a $doc "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" + fi +done + + + off +# Add package description (slack-desc) +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +cat << EODESC > "$PKG/install/slack-desc" +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler----------------------------------------------------| +[[SLACK-DESC]] +EODESC + + + off +# Move config files to .new to avoid overwriting any system config +for config_file in [[CONFIG FILES]]; do + mv $PKG/$config_file $PKG/$config_file.new +done + + + off +# Add a post-installation script (doinst.sh) +cat << EOSCRIPT > "$PKG/install/doinst.sh" +config() { + NEW="\$1" + OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" + OLD="\$(dirname \$NEW)/\$(basename \$OLD .sample)" + OLD="\$(dirname \$NEW)/\$(basename \$OLD .dist)" + + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then + # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} + +mkgroup() { + GROUP="\$1" + if ! grep -qe "^\$GROUP:" etc/group; then + echo Creating group \$GROUP... + chroot . /usr/sbin/groupadd \$GROUP + fi +} + +mkuser() { + USER="\$1" + if [ ! -z "\$2" ]; then + GROUP="\$2" + else + GROUP="\$USER" + fi + if ! grep -qe "^\$USER:" etc/passwd; then + echo Creating user \$USER... + chroot . /usr/sbin/useradd \$USER -g \$GROUP + fi +} + +[[REST OF DOINST.SH]] +EOSCRIPT + + + off +# Copy slack-required +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +if [ -f "$CWD/slack-required" ]; then + cp $CWD/slack-required $PKG/install +fi + + + off +# Build the package +cd "$PKG" +mkdir -p $REPOS/$SLACKBUILD_PATH +makepkg -l y -c n "$REPOS/$SLACKBUILD_PATH/$PKG_NAME-$PKG_VERSION-$ARCH-$BUILD.tgz" || exit $ERROR_MKPKG + + + off +# Delete source and build directories if requested +if [ "$CLEANUP" == "yes" ] || [ "$1" = "--cleanup" ]; then + rm -rf "$PKG_WORK" "$PKG" +fi + diff --git a/tags/0.6rc1/mkbuild/model.mkbuild b/tags/0.6rc1/mkbuild/model.mkbuild new file mode 100644 index 0000000..bffee96 --- /dev/null +++ b/tags/0.6rc1/mkbuild/model.mkbuild @@ -0,0 +1,185 @@ +# +# This mkbuild 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 2 of the License, or any later version. +# +# This mkbuild 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# Version 0.9.0 - Alves ( rudsonalves at yahoo d0t com d0t br ) +# Version $Rev$ - $Author$ + +#-------------------- +# Personal variables +#-------------------- +# Author name +[[SLACKBUILD AUTHOR]]="[[YOUR NAME]]" + +# Initials author name +[[SLACKBUILD AUTHOR INITIALS]]="[[YOUR SIGNATURE]]" + +#------------------------ +# Construction Variables +#------------------------ +# +# Complete URL address or URL base address ( without $SRC_NAME-$VERSION... ) +[[DOWNLOAD FOLDER URL]]="[[DEFAULT URL]]" + +# Source base name. if different from package name. Null ("") to default value. +# Auto-set, get SRC_NAME from URL: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[SOURCE NAME]]="" + +# Package name. Null ("") to auto-set +# Auto-set, get PKG_NAME from URL downcase(SRC_NAME): http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[PACKAGE NAME]]="" + +# +# Package default ARCH +# Default set is i486 +[[ARCH]]="" + +# +# Package version. Null ("") to auto-set. +# Auto-set, get VERSION from URL: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[VERSION]]="" + +# +# Package extension. Null ("") to auto-set +# Auto-set, get EXTENSION from URL: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[EXTENSION]]="" + +# +# Build number. +# Auto-set to default 1 +[[BUILD NUMBER]]="" + +# +# Source Name construction string +# Default value is: $SRC_NAME-$VERSION.tar.$EXTENSION +[[SOURCE NAME CONSTRUCTION STRING]]="$SRC_NAME-$VERSION.tar.$EXTENSION" + +# +# Unpacker programa ("") to auto-set. Default "tar" +# Unpacke Flags ("") to auto-set. Default flags to tar "--no-same-owner --no-same-permissions -xvf" +[[UNPACKER]]="" +[[UNPACKER FLAGS]]="" + +# +# Dependency list input +# Enter string: "dependency_1 [condiction_1] [versio_1]: dependency_2 [condiction_2] [versio_2]" +# Example: +[[SLACK REQUIRED]]="" + +# +# Decompress program +# gz, tgz, bz2, set null ("") to auto-set +# Auto-set, get DECOMPRESSOR from URL EXTENSION: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[DECOMPRESSOR]]="" + +# +# Decompress check flag +# gz, tgz, bz2, set null ("") to auto-set +[[DECOMPRESSOR TEST FLAG]]="" + +# +# Documentation files. Null ("") to auto-set commom doc-files: +# NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING readme.* +[[DOCUMENTATION FILES]]="" + +# +# ./configure options +[[OTHER CONFIGURE ARGS]]="" + +# +# PREFIX. Default /usr +[[PREFIX]]="/usr" + +# +# Number of jobs +[[NUMBER OF JOBS]]="-j4" + +#--------------------- +# Others changes +#--------------------- +#[[MD5SUM CODE]]="" +#[[MD5SUM EXTENSION]]="" +#[[SIGNING KEY]]="" +#[[SIGNING KEY URL]]="" +#[[SIGNING KEY ID]]="" +#[[SIGNING URL]]="" +#[[CONFIG FILES]]="" +#[[PATCH URLS]]="" +#[[REST OF DOINST.SH]]="" +[[PATCH FILES]]="" +[[NUMBER OF PREFIX SLASHES TO STRIP]]="1" + +# SlackBuild model +[[SLACKBUILD MODEL]]="generic.mkSlackBuild" + +# SlackBuild PATH in Slack.Sarava tree +#[[SLACKBUILD PATH]]="others/unclassified/$PKG_NAME" +[[SLACKBUILD PATH]]="" + +#--------------------- +# SlackBuild Sections +#--------------------- +# Default sections: +# head, set_variables, slkflags, start_structure, untar_source, +# make_package, install_package, build_package +# Warning: don't remove '#>>' and "#<<" tags. +#>> Start SlackBuild Sections: + on: head + on: slackbuildrc + on: set_variables + on: slkflags + on: error_codes + on: start_structure +off: create_build_user_and_group + on: download_source +off: download_patches +off: svn_source +off: git_source +off: md5sum_download_and_check_0 +off: md5sum_download_and_check_1 +off: gpg_signature_check + on: manifest_check + on: untar_source +off: patch_source + on: configure + on: make_package + on: install_package + on: strip_binaries +off: compress_manpages +off: compress_info_files +off: copy_init_scripts +off: copy_config_files + on: install_documentation + on: slackdesc +off: move_config_files +off: postinstall_script +off: slack_required + on: build_package + on: clean_builds +#<< End SlackBuild Sections + +#------------------ +# Sections changes +#------------------ +#>slackdesc +[[PKG NAME]]: [[PKG NAME]] by Slack.Sarava +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +[[PKG NAME]]: +# off +# +# [[PROGRAM NAME]].SlackBuild 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 2 of the License, +# or any later version. +# +# [[PROGRAM NAME]].SlackBuild 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# slackbuild for [[PROGRAM NAME]], by [[SLACKBUILD AUTHOR]] +# requires: [[REQUIRES]] +# tested: [[PROGRAM NAME]]-[[VERSION]] +# model: perl.mkSlackBuild $Rev$ +# + + + off +# Look for slackbuildrc +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +elif [ -f /etc/slackbuildrc ]; then + source /etc/slackbuildrc +fi + + + off +# Set variables +CWD="$(pwd)" +SRC_NAME="[[SOURCE NAME]]" +PKG_NAME="[[PACKAGE NAME]]" +ARCH=${ARCH:=[[ARCH]]} +SRC_VERSION=${VERSION:=[[VERSION]]} +PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')" +BUILD=${BUILD:=1[[SLACKBUILD AUTHOR INITIALS]]} +SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME +TMP=${TMP:=/tmp} +PKG=${PKG:=$TMP/package-$PKG_NAME} +REPOS=${REPOS:=$TMP} +SLACKBUILD_PATH=${SLACKBUILD_PATH:="[[SLACKBUILD PATH]]"} +PREFIX=${PREFIX:=[[PREFIX]]} +PKG_WORK="$TMP/$SRC_NAME" +CONF_OPTIONS=${CONF_OPTIONS:="[[OTHER CONFIGURE ARGS]]"} +NUMJOBS=${NUMJOBS:="[[NUMBER OF JOBS]]"} + + + off +# Set system libraries' path and optmization flags based on $ARCH +LIBDIR="$PREFIX/lib" + +if [ "$ARCH" = "i386" ]; then + SLKCFLAGS="-O2 -march=i386 -mcpu=i686" +elif [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mcpu=i686" +elif [ "$ARCH" = "i686" ]; then + SLKCFLAGS="-O2 -march=i686" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2" + LIBDIR="$PREFIX/lib64" +fi + + + off +# Set error codes (used by createpkg) +ERROR_WGET=31; ERROR_MAKE=32; ERROR_INSTALL=33 +ERROR_MD5=34; ERROR_CONF=35; ERROR_HELP=36 +ERROR_TAR=37; ERROR_MKPKG=38; ERROR_GPG=39 +ERROR_PATCH=40; ERROR_VCS=41; ERROR_MKDIR=42 +ERROR_MANIFEST=43; + + + off +# Clean up any leftovers of previous builds +rm -rf "$PKG_SRC" 2> /dev/null +rm -rf "$PKG" 2> /dev/null + +# Create directories if necessary +mkdir -p "$SRC_DIR" || exit $ERROR_MKDIR +mkdir -p "$PKG" || exit $ERROR_MKDIR +mkdir -p "$REPOS" || exit $ERROR_MKDIR +mkdir -p "$PKG_WORK" || exit $ERROR_MKDIR + + + off +# Dowload source if necessary +SRC="[[SOURCE NAME CONSTRUCTION STRING]]" +URL="[[DOWNLOAD FOLDER URL]]/$SRC" + +if [ ! -s "$SRC_DIR/$SRC" ] || ! [[DECOMPRESSOR]] [[DECOMPRESSOR TEST FLAG]] "$SRC_DIR/$SRC" 2> /dev/null; then + wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET +fi + + + off +# Download patches +if echo [[PATCH URLS]] | grep -q -v "PATCH URLS"; then + for patch_url in [[PATCH URLS]]; do + patch="`basename $patch_url`" + if [ ! -s "$SRC_DIR/$patch" ]; then + wget "$patch_url" -O "$SRC_DIR/$patch" || exit $ERROR_WGET + fi + done +fi + + + off +MD5SUM_SRC="$(md5sum "$SRC_DIR/$SRC" | cut -d " " -f 1)" +MD5SUM_URL="[[MD5SUM CODE]]" + +[ "$MD5SUM_SRC" == "$MD5SUM_URL" ] || exit $ERROR_MD5 + + + off +# Download source's MD5 checksum if necessary and check it +if [ ! -s "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" ]; then + wget "$URL.[[MD5SUM EXTENSION]]" -O "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" || exit $ERROR_WGET +fi + +MD5SUM_SRC="$(md5sum "$SRC_DIR/$SRC" | cut -d " " -f 1)" +MD5SUM_URL="$(grep "$SRC[ \t]*$" "$SRC_DIR/$SRC.[[MD5SUM EXTENSION]]" | cut -d " " -f 1)" + +[ "$MD5SUM_SRC" == "$MD5SUM_URL" ] || exit $ERROR_MD5 + + + off +# Import minimized signing key from +if echo [[SIGNING KEY URL]] | grep -q -v "SIGNING KEY URL"; then + lynx -dump [[SIGNING KEY URL]] | gpg --import || exit $ERROR_GPG +elif echo [[SIGNING KEY ID]] | grep -q -v "SIGNING KEY ID"; then + gpg --recv-keys [[SIGNING KEY ID]] || exit $ERROR_GPG +else + gpg --import << EOKEY || exit $ERROR_GPG +[[SIGNING KEY]] +EOKEY +fi + +# Download source's signature if necessary and check it +if echo [[SIGNING URL]] | grep -q -v "SIGNING URL"; then + SIGNATURE="`basename [[SIGNING URL]]`" + if [ ! -s "$SRC_DIR/$SIGNATURE" ]; then + wget "[[SIGNING URL]]" -O "$SRC_DIR/$SIGNATURE" || exit $ERROR_WGET + fi +else + if [ -f "$SRC_DIR/$SRC.sig" ]; then + SIGNATURE="$SRC.sig" + elif [ -f "$SRC_DIR/$SRC.asc" ]; then + SIGNATURE="$SRC.asc" + else + echo Trying to get signature file from $URL.sig... + if wget "$URL.sig" -O "$SRC_DIR/$SRC.sig"; then + SIGNATURE="$SRC.sig" + else + rm $SRC_DIR/$SRC.sig + echo Trying to get signature file from $URL.asc... + if wget "$URL.asc" -O "$SRC_DIR/$SRC.asc"; then + SIGNATURE="$SRC.asc" + else + rm $SRC_DIR/$SRC.asc + echo "Error getting source's signature file" + exit $ERROR_GPG + fi + fi + fi +fi + +echo Checking $SRC_DIR/$SRC with gpg using $SRC_DIR/$SIGNATURE... +gpg --verify "$SRC_DIR/$SIGNATURE" "$SRC_DIR/$SRC" || exit $ERROR_GPG +echo Success. + + + off +# Check Manifest file +if [ -e "$CWD/Manifest" ]; then + + # Manifest signature checking + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" $CWD/Manifest; then + echo "Checking Manifest signature..." + gpg --verify $CWD/Manifest + if [ "$?" != "0" ]; then + exit $ERROR_MANIFEST + fi + fi + + MANIFEST_LINES="`grep -E -v "^(MKBUILD|SLACKBUILD)" $CWD/Manifest | wc -l`" + + for ((MANIFEST_COUNT=1; MANIFEST_COUNT <= $MANIFEST_LINES; MANIFEST_COUNT++)); do + + MANIFEST_LINE="`grep -E -v "^(MKBUILD|SLACKBUILD)" $CWD/Manifest | head -n $MANIFEST_COUNT | tail -n 1`" + MANIFEST_FILE="`echo $MANIFEST_LINE | awk '{ print $2 }'`" + MANIFEST_FILE_TYPE="`echo $MANIFEST_LINE | awk '{ print $1 }'`" + + if [ -e "$SRC_DIR/$MANIFEST_FILE" ]; then + MANIFEST_FILE="$SRC_DIR/$MANIFEST_FILE" + else + MANIFEST_FILE="`find $CWD -name $MANIFEST_FILE`" + fi + + if [ ! -e "$MANIFEST_FILE" ] || [ -d "$MANIFEST_FILE" ]; then + continue + fi + + echo "Checking Manifest for $MANIFEST_FILE_TYPE $MANIFEST_FILE integrity..." + + SIZE_SRC="`wc -c $MANIFEST_FILE | awk '{ print $1 }'`" + SIZE_MANIFEST="`echo $MANIFEST_LINE | awk '{ print $3 }'`" + + # Check source code size + if [ "$SIZE_SRC" != "$SIZE_MANIFEST" ]; then + echo "SIZE Manifest: $SIZE_MANIFEST; SIZE $SRC: $SIZE_SRC" + exit $ERROR_MANIFEST + else + echo "Size match." + fi + + # Check source code integrity + for ALGO in md5 sha1 sha256 sha512 rmd160; do + if [ $ALGO = "rmd160" ]; then + ALGO_SRC="`openssl rmd160 $MANIFEST_FILE | awk '{ print $2 }'`" + else + ALGO_SRC="`"$ALGO"sum $MANIFEST_FILE | awk '{ print $1 }'`" + fi + ALGO="`echo $ALGO | tr '[:lower:]' '[:upper:]'`" + ALGO_MANIFEST=$(echo $MANIFEST_LINE | sed "s/.* $ALGO //" | awk '{ print $1 }') + if [ "$ALGO_SRC" != "$ALGO_MANIFEST" ]; then + echo "$ALGO Manifest: $ALGO_MANIFEST; $ALGO $SRC: $ALGO_SRC" + exit $ERROR_MANIFEST + else + echo "$ALGO match." + fi + done + + done + +else + exit $ERROR_MANIFEST +fi + + + off +# Untar +cd "$PKG_WORK" +[[UNPACKER]] [[UNPACKER FLAGS]] "$SRC_DIR/$SRC" || exit $ERROR_TAR +PKG_SRC=`ls -l | awk '/^d/ { print $8 }'` +cd "$PKG_SRC" + + + off +# Patch source +patches="[[PATCH FILES]] [[PATCH URLS]] + $PKG_NAME.diff $PKG_NAME-$PKG_VERSION.diff + $PKG_NAME-$PKG_VERSION-$ARCH.diff $PKG_NAME-$ARCH.diff" +for patch in $patches; do + patch="`basename $patch`" + if [ -f "$CWD/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch" ]; then + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$CWD/patches/$patch" || exit $ERROR_PATCH + elif [ -f "$CWD/$patch.gz" ]; then + gzip -dc "$CWD/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ -f "$CWD/patches/$patch.gz" ]; then + gzip -dc "$CWD/patches/$patch.gz" | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ -f "$SRC_DIR/$patch" ]; then + if [ "`basename $patch .gz`" != "$patch" ]; then + gzip -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + elif [ "`basename $patch .bz2`" != "$patch" ]; then + bzip2 -dc $SRC_DIR/$patch | patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] || exit $ERROR_PATCH + else + patch -Np[[NUMBER OF PREFIX SLASHES TO STRIP]] < "$SRC_DIR/$patch" || exit $ERROR_PATCH + fi + fi +done + + + off +# Configure +perl Makefile.PL || exit $ERROR_CONF + + + off +# Compile +make $NUMJOBS || exit $ERROR_MAKE + + + off +# Test package +make test + + + off +# Install +make install DESTDIR="$PKG" || exit $ERROR_INSTALL + +# Fix .packlist +string="`echo $PKG | sed -e 's/\//\\\\\//g'`" +for file in `find $PKG -name .packlist`; do + sed -e "s/^$string//g" $file > $file.tmp + mv $file.tmp $file +done + + + off +# Strip binaries +( cd "$PKG" + find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null + find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \ + xargs strip --strip-unneeded 2> /dev/null +) + + + off +# Compress and link manpages +if [ -d "$PKG/$PREFIX/man" ]; then + ( cd "$PKG/$PREFIX/man" + for manpagedir in $(find . -type d -name "man*") ; do + ( cd $manpagedir + for eachpage in $( find . -type l -maxdepth 1) ; do + ln -s $( readlink $eachpage ).gz $eachpage.gz + rm $eachpage + done + gzip -9 *.? + ) + done + ) +fi + + + off +# Compress info files +if [ -d "$PKG/$PREFIX/info" ]; then + ( cd "$PKG/$PREFIX/info" + rm -f dir + gzip -9 * + ) +fi + + + off +# Copy init scripts +mkdir -p $PKG/etc/rc.d +cp $CWD/rc.* $PKG/etc/rc.d/ + + + off +# Copy config files +mkdir -p $PKG/etc +for conf in [[CONFIG FILES]]; do + mkdir -p $PKG/etc/`dirname $conf` + if [ -e "$CWD/conf/$conf" ]; then + cp -a $CWD/conf/$conf $PKG/etc/$conf + elif [ -e "$CWD/$conf" ]; then + cp -a $CWD/$conf $PKG/etc/$conf + elif [ -e "$conf" ]; then + cp -a $conf $PKG/etc/$conf + fi +done + + + off +# Install documentation +DOCS="[[DOCUMENTATION FILES]]" +mkdir -p "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR +for doc in $DOCS; do + if [ -f "$doc" ]; then + cp -a $doc "$PKG/usr/doc/$PKG_NAME-$PKG_VERSION" + fi +done + + + off +# Add package description (slack-desc) +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +cat << EODESC > "$PKG/install/slack-desc" +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +[[SLACK-DESC]] +EODESC + + + off +# Add a post-installation script (doinst.sh) +cat << EOSCRIPT > "$PKG/install/doinst.sh" +config() { + NEW="\$1" + OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)" + # If there's no config file by that name, mv it over: + if [ ! -r \$OLD ]; then + mv \$NEW \$OLD + elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then + # toss the redundant copy + rm \$NEW + fi + # Otherwise, we leave the .new copy for the admin to consider... +} + +config path/to/config_file.new +[[REST OF DOINST.SH]] +EOSCRIPT + + + off +# Copy slack-required +mkdir -p "$PKG/install" || exit $ERROR_MKDIR +if [ -f "$CWD/slack-required" ]; then + cp $CWD/slack-required $PKG/install +fi + + + off +# Build the package +cd "$PKG" +mkdir -p $REPOS/$SLACKBUILD_PATH +makepkg -l y -c n "$REPOS/$SLACKBUILD_PATH/$PKG_NAME-$PKG_VERSION-$ARCH-$BUILD.tgz" || exit $ERROR_MKPKG + + + off +# Delete source and build directories if requested +if [ "$CLEANUP" == "yes" ] || [ "$1" = "--cleanup" ]; then + rm -rf "$PKG_WORK" "$PKG" +fi + diff --git a/tags/0.6rc1/mkbuild/sample-Pyrex-large.mkbuild b/tags/0.6rc1/mkbuild/sample-Pyrex-large.mkbuild new file mode 100644 index 0000000..047814a --- /dev/null +++ b/tags/0.6rc1/mkbuild/sample-Pyrex-large.mkbuild @@ -0,0 +1,176 @@ +# +# This mkbuild 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 2 of the License, or any later version. +# +# This mkbuild 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +#-------------------- +# Personal variables +#-------------------- +# Author name +[[SLACKBUILD AUTHOR]]="Rudson R. Alves" + +# Initials author name +[[SLACKBUILD AUTHOR INITIALS]]="rra" + +#------------------------ +# Construction Variables +#------------------------ +# +# Source base name. if different from package name. Null ("") to default value. +# Auto-set, get SRC_NAME from URL: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[SOURCE NAME]]="Pyrex" + +# Package name. Null ("") to auto-set +# Auto-set, get PKG_NAME from URL downcase(SRC_NAME): http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[PACKAGE NAME]]="" + +# +# Source Name construction string +# Default value is: $SRC_NAME-$VERSION.tar.$EXTENSION +#[[SOURCE NAME CONSTRUCTION STRING]]="SOURCE NAME CONSTRUCTION STRING" +[[SOURCE NAME CONSTRUCTION STRING]]="$SRC_NAME-$VERSION.tar.$EXTENSION" + +# +# Complete URL address or URL base address ( without $SRC_NAME-$VERSION... ) +#[[DOWNLOAD FOLDER URL]]="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/Pyrex-0.9.5.1a.tar.gz" +[[DOWNLOAD FOLDER URL]]="http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/" + +# +# Package version. Null ("") to auto-set. +# Auto-set, get VERSION from URL: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[VERSION]]="0.9.5.1a" + +# +# Package extension. Null ("") to auto-set +# Auto-set, get EXTENSION from URL: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[EXTENSION]]="gz" + +# +# Unpacker programa ("") to auto-set. Default "tar" +# Unpacke Flags ("") to auto-set. Default flags to tar "--no-same-owner --no-same-permissions -xvf" +[[UNPACKER]]="" +[[UNPACKER FLAGS]]="" + +# +# Dependency list input +# Enter string: "dependency_1 [condiction_1] [versio_1]: dependency_2 [condiction_2] [versio_2]" +# Example: +#[[SLACK REQUIRED]]="dep1 >= 1.1.1: dep2 >= 2.2.2:dep3:dep4:dep5 = 1.0" +[[SLACK REQUIRED]]="" + +# +# Decompress program +# gz, tgz, bz2, set null ("") to auto-set +# Auto-set, get DECOMPRESSOR from URL EXTENSION: http://.../$SRC_NAME-$VERSION.tar.$EXTENSION' +[[DECOMPRESSOR]]="" + +# +# Decompress check flag +# gz, tgz, bz2, set null ("") to auto-set +[[DECOMPRESSOR TEST FLAG]]="" + +# +# Documentation files. Null ("") to auto-set commom doc-files: +# NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING readme.* +[[DOCUMENTATION FILES]]="" + +# +# ./configure options +[[OTHER CONFIGURE ARGS]]="" + +# +# PREFIX. Default /usr +[[PREFIX]]="/usr" + +# +# Number of jobs +[[NUMBER OF JOBS]]="-j7" + +#--------------------- +# Others changes +#--------------------- +#[[PATCH FILES]]="" +[[MD5SUM CODE]]="5a1bb7c76162a987a1d5040ea2d1f670" +#[[MD5SUM EXTENSION]]="" +#[[SIGNING KEY]]="" +#[[SIGNING KEY URL]]="" +#[[PATCH FILES]]="" + +# SlackBuild model +[[SLACKBUILD MODEL]]="generic.mkSlackBuild" + +# SlackBuild PATH in Slack.Sarava tree +[[SLACKBUILD PATH]]="dev/python/pyrex" + +#--------------------- +# SlackBuild Sections +#--------------------- +# Default sections: +# head, set_variables, slkflags, start_structure, untar_source, +# make_package, install_package, build_package +# Warning: don't remove '#>>' and "#<<" tags. +#>> Start SlackBuild Sections: + on: head + on: slackbuildrc + on: set_variables + on: slkflags + on: error_codes + on: start_structure + on: download_source + on: md5sum_download_and_check_0 +off: md5sum_download_and_check_1 +off: gpg_signature_check + on: untar_source +off: patch_source + on: configure + on: make_package + on: install_package + on: strip_binaries +off: compress_manpages +off: compress_info_files + on: install_documentation + on: slackdesc +off: postinstall_script + on: build_package + on: clean_builds +#<< End SlackBuild Sections + +#------------------ +# Sections changes +#------------------ +#>slackdesc +pyrex: Pyrex by Slack.Sarava +pyrex: +pyrex: Pyrex is a language specially designed for writing Python extension +pyrex: modules. Its designed to bridge the gap between the nice, high-level, +pyrex: easy-to-use world of Python and the messy, low-level world of C. +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +#untar_source +# Untar program + +# Change to temp dir +cd "$TMP" + +# Uncompress e untar source +gunzip "$SRC_DIR/$SRC" | tar --no-same-owner --no-same-permissions -xvf || exit $ERROR_TAR + +# Change to source dir +cd "$PKG_SRC" +#>' and "#<<" tags. +#>> Start SlackBuild Sections: + on: head + on: slackbuildrc + on: set_variables + on: slkflags + on: error_codes + on: start_structure + on: download_source + on: md5sum_download_and_check_0 + on: untar_source + on: configure + on: make_package + on: install_package + on: strip_binaries + on: install_documentation + on: slackdesc + on: build_package + on: clean_builds +#<< End SlackBuild Sections + +#------------------ +# Sections changes +#------------------ +#>slackdesc +pyrex: Pyrex by Slack.Sarava +pyrex: +pyrex: Pyrex is a language specially designed for writing Python extension +pyrex: modules. Its designed to bridge the gap between the nice, high-level, +pyrex: easy-to-use world of Python and the messy, low-level world of C. +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +pyrex: +#${normal} + create the package ${green}${normal} and install + ${red}-a${normal}, ${red}--all${normal} + create all packages and install + ${red}-np${normal}, ${red}--no-deps${normal} + does not solve dependences + ${red}-d${normal}, ${red}--debug${normal} ${green}${normal} + enable SlackBuild debug (sh -x ...) + ${red}-s${normal}, ${red}--search${normal} ${green} + search for a ${green}${normal} + ${red}-f${normal}, ${red}--info${normal} ${green}${normal} + show description and dependences of the program + ${red}-l${normal}, ${red}--list${normal} + list all the SlackBuilds + ${red}--list-packages ${green}[repository]${normal} + list all packages in binary repositories + ${red}--sign${green}${normal} + sign a binary package + ${red}--remove${green}${normal} + remove a binary package + ${red}--sync${normal} + synchronize SlackBuilds repository + ${red}--update${normal} + synchronize packages repository + ${red}--commit${normal} ${green}["message"]${normal} + commit changes to binary packages' repository + ${red}--status${normal} + check binary packages' svn repository status + ${red}--import${normal} + import packages into a svn repository + ${red}--checkout${normal} + checkout binary packages from a svn repository + ${red}--update-keyring${normal} + update GPG-KEY from binary repositories + ${red}-h${normal}, ${red}--help${normal} + show this help + +${red}EXAMPLES${normal} + ${red}createpkg -i scilab${normal} + build and install scilab package + ${red}createpkg -s at*${normal} + search for all at* SlackBuilds scripts (at-spi, atk, ...) + ${red}createpkg --info pyrex${normal} + show pyrex description and dependences + $SYNC=yes {red}createpkg -i scilab${normal} + sync repository first, then build and install scilab package + +${red}AUTHOR${normal} + Written by ${blue}Rudson R. Alves${normal} + +${red}AVAILABILITY${normal} + by svn: ${yellow}svn checkout svn://slack.sarava.org/simplepkg${normal} + this mkbuild is found in branches/0.6/ + +${red}REPORTING BUGS${normal} + Report bugs to <${blue}rudsonalves[at]rra.etc.br${normal}> + +${red}COPYRIGHT${normal} + Copyright © 2006 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the + terms of the GNU General Public License + <${yellow}http://www.gnu.org/licenses/gpl.html${normal}>. There is NO WARRANTY, + to the extent permitted by law." +} + +function build_all_slackbuilds { + + # Build all SlackBuilds in repository + createpkg --sync + + cd $SLACKBUILDS_DIR + LIST=`find . -name *.SlackBuild | sed 's/.*\/\(.*\)\.SlackBuild$/\1/' | sort | uniq` + for i in $LIST; do + [ ! lspkg $i >/dev/null ] && createpkg -i $i + done + +} + +function check_config { + + # Check the configuration + TMP=${TMP:=/tmp} + + if [ ! -z "$REPOS" ]; then + PACKAGES_DIR="$REPOS" + else + REPOS=$PACKAGES_DIR + fi + + # Nested folders, if configured + if [ ! -z "$PACKAGES_REPOS_STYLE" ]; then + PACKAGES_REPOS_STYLE=$(echo $PACKAGES_REPOS_STYLE | sed -e "s/none//g" -e "s/distro/`default_distro`/g" \ + -e "s/arch/`default_arch`/g" -e "s/version/`default_version`/g") + PACKAGES_DIR="$PACKAGES_DIR/$PACKAGES_REPOS_STYLE" + REPOS="$REPOS/$PACKAGES_REPOS_STYLE" + fi + + # Create $TMP and $REPOS if need + [ ! -e $TMP ] && mkdir -p $TMP + [ ! -e $PACKAGES_DIR ] && create_repo_folder $PACKAGES_DIR + # + SLACKBUILDS_DIR=${SLACKBUILDS_DIR:=/var/simplepkg/slackbuilds} + # + SYNC=${SYNC:=$no} + SYNC=`convert_boolean $SYNC` + BASEDIR="`dirname $SLACKBUILDS_DIR`" + +} + +function solve_dep { + + # Solve dependency + [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + local PACK="$1" + local COND="$2" + local VER="$3" + + # Check package in local system + PACK="`echo $PACK | sed -e 's/\+/\\\+/'`" + INSTALLED="`check_installed $PACK`" + CHECK=$? + + # TODO: check dependency versions + if [ -z "$INSTALLED" ]; then + if [ $CHECK -ne 0 ]; then + # Check package in SlackBuilds tree + eecho $messag "$BASENAME: processing $PACKAGE dependency $PACK" + SYNC=$no CREATEPKG_CHILD=$CREATEPKG_CHILD createpkg --install $PACK + + # Check if the package was built and installed + EXIT_CODE=$? + + if [ $EXIT_CODE -eq $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND ]; then + # Try to use simplaret + ARCH=$CREATEPKG_ARCH simplaret --update + ARCH=$CREATEPKG_ARCH simplaret --install $PACK + [ $? -ne 0 ] && handle_error $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND $PACK + elif [ $EXIT_CODE -ne 0 ]; then + handle_error $EXIT_CODE $PACK + fi + + fi + fi + +} + +function find_slackbuild { + + # Find SlackBuild script in the repository + [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + OUTPUT=`find $SLACKBUILDS_DIR -iname $1.SlackBuild` + [ "$OUTPUT" != "" ] && EXIT_CODE=0 || EXIT_CODE=1 + echo $OUTPUT + +} + +function info_builds { + + # Show packages info + if [ "$PKG_PATH" != "" ]; then + for i in $PKG_PATH; do + PACKAGE=`basename $i .SlackBuild` + NAME_UP=`echo $PACKAGE | tr [a-z] [A-Z]` + eecho $commun "$NAME_UP: " + + PKG_DIR=`dirname $i` + if [ -e $PKG_DIR/slack-desc ]; then + eval "cat $PKG_DIR/slack-desc | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + else + eval "cat $i | grep '^$PACKAGE:' | cut -f2- -d:" + eecho $normal + fi + + if [ -e $PKG_DIR/slack-required ]; then + eecho $commun "slack-required" + cat $PKG_DIR/slack-required | sed 's/^/ /' + fi + done + fi + +} + +function list_slackbuilds { + + # list all available slackbuilds + # usage: list_slackbuilds + + list_builds $SLACKBUILDS_DIR SlackBuild + +} + +function load_parameters { + + # Load Createpkg parameters + PACKAGES_DIR="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`" + PACKAGES_SVN="`eval_parameter PACKAGES_SVN http://slack.sarava.org/packages`" + PACKAGES_REPOS_STYLE="`eval_parameter PACKAGES_REPOS_STYLE none`" + NOARCH_DIR="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`/noarch" + SOURCE_DIR="`eval_parameter SOURCE_DIR /var/simplepkg/sources`" + SLACKBUILDS_DIR="`eval_parameter SLACKBUILDS_DIR /var/simplepkg/slackbuilds`" + SLACKBUILDS_SVN="`eval_parameter SLACKBUILDS_SVN http://slack.sarava.org/slackbuilds`" + SVN_USER="`eval_parameter PACKAGES_SVN_USER`" + SVN_GROUP="`eval_parameter PACKAGES_SVN_GROUP`" + SOURCE_DIR_USER="`eval_parameter SOURCE_DIR_USER`" + SOURCE_DIR_GROUP="`eval_parameter SOURCE_DIR_GROUP`" + + COLOR_MODE="`eval_parameter COLOR_MODE none`" + CREATEPKG_ARCH="`eval_parameter CREATEPKG_ARCH $(default_arch)`" + CREATEPKG_CLEANUP="`eval_parameter CREATEPKG_CLEANUP yes`" + CREATEPKG_AUTHOR="`eval_parameter CREATEPKG_AUTHOR`" + TMP="`eval_parameter TMP /tmp`" + + SIGN_PACKAGES="`eval_boolean_parameter SIGN_PACKAGES $off`" + SIGN_PACKAGES_USER="`eval_parameter SIGN_PACKAGES_USER`" + SIGN_PACKAGES_KEYID="`eval_parameter SIGN_PACKAGES_KEYID`" + SIGN_PACKAGES_WITH_GPG_AGENT="`eval_boolean_parameter SIGN_PACKAGES_WITH_GPG_AGENT $off`" + + if [ ! -z "$SIGN_PACKAGES_KEYID" ]; then + SIGN_PACKAGES_KEYID="`echo $SIGN_PACKAGES_KEYID | tr '[:lower:]' '[:upper:]'`" + fi + + if [ "$SIGN_PACKAGES_WITH_GPG_AGENT" -eq $on ]; then + GPG_AGENT_OPTION="--use-agent" + else + GPG_AGENT_OPTION="" + fi + + # For use at common.sh functions + SIGN="$SIGN_PACKAGES" + SIGN_KEYID="$SIGN_PACKAGES_KEYID" + SIGN_USER="$SIGN_PACKAGES_USER" + + REMOVE_OLD_PACKAGE="`eval_boolean_parameter REMOVE_OLD_PACKAGE $off`" + MOVE_BIN_PACKAGE="`eval_boolean_parameter MOVE_BIN_PACKAGE $off`" + MOVE_SLACK_REQUIRED="`eval_boolean_parameter MOVE_SLACK_REQUIRED $off`" + PACKAGES_REPOS_NOARCH="`eval_boolean_parameter PACKAGES_REPOS_NOARCH $on`" + FORCE_MANIFEST_CHECK="`eval_boolean_parameter FORCE_MANIFEST_CHECK $off`" + FORCE_MANIFEST_CHECK_SIGNATURE="`eval_boolean_parameter FORCE_MANIFEST_CHECK_SIGNATURE $off`" + +} + +function repository_checkout { + + # checkout a binary repository + # usage: repository_checkout [repository-adress] + + local svn oldfolder + + if [ -d "$PACKAGES_DIR" ]; then + oldfolder="$(mktemp -d $(echo $PACKAGES_DIR | sed -e 's/\/*$//g').XXXXXX)" + echo "Backing up old $folder at $oldfolder..." + mv $PACKAGES_DIR $oldfolder + fi + + if [ -z "$1" ]; then + svn="$1" + else + svn="$PACKAGES_SVN" + fi + + if valid_svn_repo $svn; then + svn checkout $svn $PACKAGES_DIR + chown_svn $PACKAGES_DIR && chgrp_svn $PACKAGES_DIR + if [ "$svn" != "$PACKAGES_SVN" ]; then + echo "Using svn repository different from the one pointed at $CONF." + fi + else + echo "Invalid repository $repository, aborting." + EXIT_CODE="1" + fi + +} + +function repository_update { + + if [ ! -z "$1" ] && svn_folder $1; then + echo "Fetching changes from svn repository for $1..." + cwd="`pwd`" + chown_svn $1 && chgrp_svn $1 + cd $1 && su_svn update + cd $cwd + fi + +} + +function repository_status { + + local cwd + + if svn_folder $PACKAGES_DIR; then + echo "Status of $PACKAGES_DIR." + cwd="`pwd`" + cd $PACKAGES_DIR && su_svn status + cd $cwd + fi + + if svn_folder $NOARCH_DIR; then + cwd="`pwd`" + echo "Status of $NOARCH_DIR." + cd $NOARCH_DIR && su_svn status + cd $cwd + fi + + exit 0 + +} + +function binary_repository_import { + + # import packages into a subversion repository + # usage: binary_repository_import [repository] + + local repository="$1" folder + + if [ -z "$repository" ]; then + repository="file:////var/svn/packages" + fi + + # eval again so it doesn't include repository style information + folder="`eval_parameter PACKAGES_DIR /var/simplepkg/repos`" + + repository_import $folder $repository + +} + +function create_repo_folder { + + # Create repository directory + # usage: create_repo_folder + + local folder="$1" basedir + + if [ ! -d "$folder" ]; then + echo "Creating packages folder $folder..." + basedir="`dirname $folder`" + if svn_folder $basedir && ! svn_check $folder; then + ( + cd $basedir + chown_svn $basedir && chgrp_svn $basedir + svn_mkdir `basename $folder`/$SUBFOLDER + ) + else + mkdir -p $folder/$SUBFOLDER + fi + elif [ ! -e $folder/$SUBFOLDER ]; then + if svn_folder $folder && ! svn_check $folder/$SUBFOLDER; then + ( + cd $folder + chown_svn $folder && chgrp_svn $folder + svn_mkdir $SUBFOLDER + ) + else + mkdir -p $folder/$SUBFOLDER + fi + fi + +} + +function remove_old_package_data { + + # Remove old packages from repository tree + # usage: remove_old_package_data + + if [ ! -d "$1" ]; then + return 1 + fi + + local makepkg_repos="$1" + + # Remove old PACKAGEs from repository tree + if [ $REMOVE_OLD_PACKAGE -eq $on ]; then + + # first remove entries from CHECKSUMS.md5 + if [ -f "$makepkg_repos/CHECKSUMS.md5" ]; then + sed -i "/$PACKAGE-.*-.*-.*.*$/d" $makepkg_repos/CHECKSUMS.md5 + fi + + # then remove entries from patches/CHECKSUMS.md5 + if [ -f "$makepkg_repos/patches/CHECKSUMS.md5" ]; then + sed -i "/$PACKAGE-.*-.*-.*.*$/d" $makepkg_repos/patches/CHECKSUMS.md5 + fi + + # Using subversion + if svn_folder $makepkg_repos; then + + ( + + cd $makepkg_repos + + # Using -mindepth 2 so it doesn't delete the new PACKAGE + for file in `find . -mindepth 2 -name "$PACKAGE-*-*-*.tgz" -o -name "$PACKAGE-*-*-*.meta" -o -name "$PACKAGE-*-*-*.tgz.asc"`; do + candidate="`echo $file | sed -e 's/\.meta$/\.tgz/'`" # otherwise PACKAGE info functions can fail + candidate="`echo $candidate | sed -e 's/\.asc$//'`" # otherwise PACKAGE info functions can fail + # Just delete packages with different arch, version, build number or folder + if [ "`package_version $candidate`" != "$PACKAGE_VERSION" ] || \ + [ "`package_arch $candidate`" != "$PACKAGE_ARCH" ] || \ + [ "`package_build $candidate`" != "$PACKAGE_BUILD" ] || \ + [ "`dirname $candidate | sed -e 's/^\.\///'`" != "`dirname $SUBFOLDER/$PKG_NAME | sed -e 's/^\.\///'`" ]; then + svn_del $file + fi + done + + for file in `find $makepkg_repos -name "$PACKAGE.slack-required"`; do + if [ $MOVE_SLACK_REQUIRED -eq $off ]; then + svn_del $file + elif [ ! -z "$SLACK_REQUIRED" ] && [ "$makepkg_repos/$SUBFOLDER/$PACKAGE.slack-required" != "$file" ]; then + svn_del $file + fi + done + + ) + + else + # Using -mindepth 2 so it doesn't delete the new package + find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.tgz" -exec rm {} 2>/dev/null \; + find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.meta" -exec rm {} 2>/dev/null \; + find $makepkg_repos -mindepth 2 -name "$PACKAGE-*-*-*.tgz.asc" -exec rm {} 2>/dev/null \; + find $makepkg_repos -name "$PACKAGE.slack-required" -exec rm {} 2>/dev/null \; + fi + fi + +} + +function update_metadata { + + # Update repository metadata + # usage: update_metadata + + if [ ! -d "$1" ]; then + return 1 + fi + + local makepkg_repos="$1" + + ( + + cd $makepkg_repos + + get_sign_user + repo_gpg_key $makepkg_repos + gen_meta $SUBFOLDER/$PKG_NAME + gen_filelist + update_md5_checksum $makepkg_repos $SUBFOLDER/$PKG_NAME + + # update md5 file from patches/ folder if needed + if [ -d "patches/" ]; then + + found_patch="no" + + for file in `find patches/ -name "$PACKAGE-*-*-*.tgz"`; do + found_patch="yes" + update_md5_checksum $makepkg_repos/patches patches/$SUBFOLDER/$PKG_NAME + done + + if [ "$found_patch" == "yes" ]; then + gen_patches_filelist patches + fi + fi + + ) + +} + +function list_packages { + + # list packages in repositories + # usage: list_packages [repository_list] + + local repository repositories="$*" + + if [ -z "$repositories" ]; then + repositories="$PACKAGES_DIR $NOARCH_DIR" + fi + + for repository in $repositories; do + echo "Packages from $repository..." + find $repository -name '*.tgz' + done + +} + +function remove_package { + + # delete a package from repositories + # usage: remove_packages [repository_list] + + local package="$1" repository repositories="$2" + + if [ -z "$package" ]; then + return 1 + fi + + if [ -z "$repositories" ]; then + repositories="$PACKAGES_DIR $NOARCH_DIR" + fi + + for repository in $repositories; do + + ( + + cd $repository + + for file in `find . -name "$package-*-*-*.tgz" -o -name "$package-*-*-*.meta" -o -name "$package-*-*-*.tgz.asc"`; do + svn_del $file + if [ -e "CHECKSUMS.md5" ] && echo $file | grep -q -e ".tgz$"; then + # remove md5 information + sed -i "/ \.*\/*$(regexp_slash $file)$/d" CHECKSUMS.md5 + cat CHECKSUMS.md5 | gzip -9 -c - > CHECKSUMS.md5.gz + fi + done + + for file in `find $repository -name "$package.slack-required"`; do + svn_del $file + done + + ) + + update_metadata $repository + done + +} + +function sign_package { + + # sign a package from repositories + # usage: sign_package [repository_list] + + local package="$1" repository repositories="$2" + + if [ -z "$package" ]; then + return 1 + fi + + if [ -z "$repositories" ]; then + repositories="$PACKAGES_DIR $NOARCH_DIR" + fi + + for repository in $repositories; do + + ( + + cd $repository + + for file in `find . -name "$package-*-*-*.tgz"`; do + + echo "Signing package..." + + get_sign_user + + if [ ! -z "$SIGN_PACKAGES_USER" ] && [ "`whoami`" != "$SIGN_PACKAGES_USER" ]; then + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + chown $SIGN_PACKAGES_USER $tmp_sign_folder + su $SIGN_PACKAGES_USER -c "gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/`basename $file`.asc $repository/$file" + cp $tmp_sign_folder/`basename $file`.asc $repository/$file.asc + rm -rf $tmp_sign_folder + else + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/`basename $file`.asc $repository/$file + cp $tmp_sign_folder/`basename $file`.asc $repository/$file.asc + rm -rf $tmp_sign_folder + fi + + done + + ) + + update_metadata $repository + done + +} + +function create_package { + + # Synchronize repository + [ $SYNC -eq $yes ] && sync_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + + # Update keyring + update_keyring $SLACKBUILDS_DIR/GPG-KEY + + # Get SlackBuild script + BUILD_SCRIPT="`find_slackbuild $PACKAGE`" + + # Check SlackBuild script found + if [ -z "$BUILD_SCRIPT" ]; then + handle_error $ERROR_CREATEPKG_SLACKBUILD_NOTFOUND $PACKAGE + fi + + # Select one SlackBuild + if [ "`echo $BUILD_SCRIPT | wc -w`" -gt 1 ]; then + AUX="$PS3" + PS3="Choice: " + LIST=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | sed -r 's/.*\/(.*)\.SlackBuild$/\1/'`" EXIT" + + select PACKAGE in `echo $LIST`; do + break + done + + if [ "$PACKAGE" = "EXIT" ]; then + eecho $error "error: no package selected" + return 1 + fi + + # Select only one SlackBuild in BUILD_SCRIPT + BUILD_SCRIPT=`echo $BUILD_SCRIPT | sed 's/ /\n/g' | grep "/$PACKAGE.SlackBuild"` + PS3="$AUX" + else + PACKAGE=`basename $BUILD_SCRIPT .SlackBuild` + fi + + # Get dirname and script name from slackbuild + SCRIPT_BASE="`dirname $BUILD_SCRIPT`" + SCRIPT_NAME="`basename $BUILD_SCRIPT`" + eecho $messag "$BASENAME: found script $PACKAGE.SlackBuild, now checking for dependencies" + + # Sets the package's slack-required + if [ -f "$SCRIPT_BASE/$PACKAGE.slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/$PACKAGE.slack-required" + elif [ -f "$SCRIPT_BASE/slack-required" ]; then + SLACK_REQUIRED="$SCRIPT_BASE/slack-required" + fi + + if [ ! -z "$SLACK_REQUIRED" -a $NO_DEPS -ne $on ]; then + # This routine checks for dependencies in package's slack-required + ( + grep '^[^#]' $SLACK_REQUIRED | while read dep; do + if [ ! -z "$dep" ]; then + PROGRAM="`echo $dep | awk '{ print $1 }'`" + CONDITION="`echo $dep | awk '{ print $2 }' | tr [=\>\<] [egl]`" + VERSION="`echo $dep | awk '{ print $3 }' | tr -dc '[:digit:]'`" + solve_dep "$PROGRAM" "$CONDITION" "$VERSION" + fi + true + done + ) + [ $? -ne 0 ] && handle_error $error $ERROR_CREATEPKG_DEPENDENCY + + eecho $messag "$BASENAME: done checking for $PACKAGE dependencies" + else + eecho $messag "$BASENAME: no unmet dependencies for $PACKAGE" + fi + + eecho $messag "$BASENAME: processing $SCRIPT_NAME" + + # Change to script base directory + cd $SCRIPT_BASE + + # Use fakeroot if needed and available + if [ "`whoami`" != "root" ]; then + FAKEROOT="`which fakeroot`" + if [ "$?" == "0" ]; then + eecho $messag "$BASENAME: running SlackBuild with fakeroot." + FAKEROOT="$FAKEROOT --" + else + eecho $messag "$BASENAME: WARNING: not running as root and no fakeroot found." + eecho $messag "$BASENAME: WARNING: your build might not be successful." + FAKEROOT="" + fi + else + FAKEROOT="" + fi + + # Manifest checking + if [ $FORCE_MANIFEST_CHECK -eq $on ] || [ $FORCE_MANIFEST_CHECK_SIGNATURE -eq $on ]; then + if [ ! -e "`dirname $SCRIPT_NAME`/Manifest" ]; then + eecho $messag "$BASENAME: ERROR: no Manifest file for $PACKAGE." + return 1 + fi + fi + + # Manifest signature checking + if [ $FORCE_MANIFEST_CHECK_SIGNATURE -eq $on ]; then + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" `dirname $SCRIPT_NAME`/Manifest; then + gpg --verify `dirname $SCRIPT_NAME`/Manifest &> /dev/null + if [ "$?" != "0" ]; then + eecho $messag "$BASENAME: ERROR: invalid signature for $PACKAGES's Manifest file." + return 1 + fi + else + eecho $messag "$BASENAME: ERROR: no signed Manifest file for $PACKAGE." + return 1 + fi + fi + + # Run SlackBuild script + [ $DEBUG -eq $off ] && SHELL_FLAG="+x" || SHELL_FLAG="-x" + ( + LANG=en_US \ + TMP=$TMP \ + SRC_DIR=${SRC_DIR:=$SOURCE_DIR} \ + SRC=${SRC_DIR:=$SOURCE_DIR} \ + ARCH=${ARCH:=$CREATEPKG_ARCH} \ + COLOR=${COLOR:=$COLOR_MODE} \ + REPOS=${REPOS:=$PACKAGES_DIR} \ + CLEANUP=${CLEANUP:=$CREATEPKG_CLEANUP} \ + SLACKBUILD_PATH="/" \ + INTERACT=no $FAKEROOT sh $SHELL_FLAG ./$SCRIPT_NAME + ) + + # Check if package was built + handle_error $? $PACKAGE + + # Fix source folder user + if [ ! -z "$SOURCE_DIR_USER" ]; then + chown -R $SOURCE_DIR_USER $SOURCE_DIR + fi + + # Fix source folder group + if [ ! -z "$SOURCE_DIR_GROUP" ]; then + chgrp -R $SOURCE_DIR_GROUP $SOURCE_DIR + fi + + # Get package name, arch, version and build number + PKG_NAME="`ls -1 -c $PACKAGES_DIR/$PACKAGE-*-*-*.tgz | head -n 1 | xargs basename`" + PACKAGE_NAME="`package_name $PKG_NAME`" + PACKAGE_VERSION="`package_version $PKG_NAME`" + PACKAGE_ARCH="`package_arch $PKG_NAME`" + PACKAGE_BUILD="`package_build $PKG_NAME`" + + # Update package author + if [ ! -z "$CREATEPKG_AUTHOR" ]; then + AUTHOR="`echo $PACKAGE_BUILD | sed -e 's/^[0-9]*//'`" + if [ "$AUTHOR" != "$CREATEPKG_AUTHOR" ]; then + echo "Changing package build author..." + BUILD_NUMBER="`echo $PACKAGE_BUILD | sed -e "s/$AUTHOR$//"`" + NEW_BUILD="$BUILD_NUMBER""$CREATEPKG_AUTHOR" + mv $PACKAGES_DIR/$PKG_NAME $PACKAGES_DIR/$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCH-$NEW_BUILD.tgz + PKG_NAME="$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_ARCH-$NEW_BUILD.tgz" + PACKAGE_BUILD="$NEW_BUILD" + AUTHOR="$CREATEPKG_AUTHOR" + echo "New package name is $PKG_NAME." + fi + fi + + # Sign package + if [ $SIGN_PACKAGES -eq $on ]; then + + echo "Signing package..." + + get_sign_user + + if [ ! -z "$SIGN_PACKAGES_USER" ] && [ "`whoami`" != "$SIGN_PACKAGES_USER" ]; then + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + chown $SIGN_PACKAGES_USER $tmp_sign_folder + su $SIGN_PACKAGES_USER -c "gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME" + cp $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME.asc + rm -rf $tmp_sign_folder + else + tmp_sign_folder="`mktemp -d $TMP/createpkg_sign.XXXXXX`" + gpg $GPG_AGENT_OPTION --armor -sb -u $SIGN_KEYID -o $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME + cp $tmp_sign_folder/$PKG_NAME.asc $PACKAGES_DIR/$PKG_NAME.asc + rm -rf $tmp_sign_folder + fi + + fi + + # Select repository directory + if [ $MOVE_BIN_PACKAGE -eq $on ]; then + SUBFOLDER="$( echo ${SCRIPT_BASE#$SLACKBUILDS_DIR/} )" + NEW_REPOS=$PACKAGES_DIR/$SUBFOLDER + else + SUBFOLDER="." + NEW_REPOS=$PACKAGES_DIR + fi + + # Update information from remote repository + repository_update $PACKAGES_DIR + + # Create the repository folders + create_repo_folder $PACKAGES_DIR + + # Remove old packages from repository tree + remove_old_package_data $PACKAGES_DIR + + # Move package to SlackBuilds-like tree + if [ $MOVE_BIN_PACKAGE -eq $on ]; then + + mv $PACKAGES_DIR/$PKG_NAME $NEW_REPOS/ + if [ -e "$PACKAGES_DIR/$PKG_NAME.asc" ]; then + mv $PACKAGES_DIR/$PKG_NAME.asc $NEW_REPOS/ + fi + + if svn_folder $NEW_REPOS; then + ( + cd $NEW_REPOS + chown_svn $PACKAGES_DIR && chgrp_svn $PACKAGES_DIR + svn_add $PKG_NAME + svn_add $PKG_NAME.asc + ) + fi + + # Move package's slack-required to binary repository + if [ $MOVE_SLACK_REQUIRED -eq $on ]; then + if [ ! -z "$SLACK_REQUIRED" ]; then + svn_copy $SLACK_REQUIRED $NEW_REPOS/$PACKAGE.slack-required + fi + fi + + fi + + # Update repository metadata + update_metadata $PACKAGES_DIR + + # General cleanup + echo Cleaning up the repository... + svn_remove_empty_folders $PACKAGES_DIR + + # Update noarch repository + if [ $PACKAGES_REPOS_NOARCH -eq $on ] && [ "`package_arch $PKG_NAME`" == "noarch" ]; then + repository_update $NOARCH_DIR + echo Copying package to noarch repository... + create_repo_folder $NOARCH_DIR + remove_old_package_data $NOARCH_DIR + svn_copy $NEW_REPOS/$PKG_NAME $NOARCH_DIR/$SUBFOLDER/ + svn_copy $NEW_REPOS/`basename $PKG_NAME .tgz`.meta $NOARCH_DIR/$SUBFOLDER/ + svn_copy $NEW_REPOS/`basename $PKG_NAME`.asc $NOARCH_DIR/$SUBFOLDER/ + svn_copy $NEW_REPOS/$PACKAGE.slack-required $NOARCH_DIR/$SUBFOLDER/ + update_metadata $NOARCH_DIR + svn_remove_empty_folders $NOARCH_DIR + fi + + # Install package + if [ "$INSTALL" -eq $on ]; then + upgradepkg --install-new $NEW_REPOS/$PKG_NAME + fi + + echo "Package saved at $NEW_REPOS/$PKG_NAME" + + if [ $PACKAGES_REPOS_NOARCH -eq $on ] && [ "`package_arch $PKG_NAME`" == "noarch" ]; then + echo "Aditional copy saved at $NOARCH_DIR/$SUBFOLDER/$PKG_NAME" + fi + + return $EXIT_CODE + +} + +function build_queue { + + # createpkg's build queue + # usage: build_queue ... + + local unable_to_install last_status built=0 total=0 + + if [ -z "$1" ]; then + return + fi + + for PACKAGE in $*; do + create_package + last_status="$?" + let total++ + if [ "$last_status" != "0" ]; then + unable_to_install="$unable_to_install\n\t`echo $PACKAGE | sed -e 's/\\\+/\+/'`" + else + let built++ + fi + done + + if [ ! -z "$unable_to_install" ] && [[ $total > 1 ]]; then + eecho $messag "$BASENAME: done building $built of $total requested SlackBuilds." + eecho $messag "$BASENAME: unable to create the following packages:" + echo -e "$unable_to_install" + fi + + # Exit if last build package exit status + exit $last_status + +} + +#--------------------------------------------------- +# Starting createpkg +#--------------------------------------------------- +# Common functions +COMMON="/usr/libexec/simplepkg/common.sh" +SIMPLEPKG_CONF="/etc/simplepkg/simplepkg.conf" +BASENAME="`basename $0`" +EXIT_CODE=0 + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 0 +fi + +set_constants + +# Load simplepkg.conf variables +load_parameters + +# Loading error codes +error_codes + +# Load slackbuildrc definitions +if [ -f ~/.slackbuildrc ]; then + source ~/.slackbuildrc +else + source /etc/slackbuildrc 2>/dev/null +fi + +# Select color mode: gray, color or none (*) +color_select $COLOR_MODE + +# This is used to show how many children process we have +if [ -z "$CREATEPKG_CHILD" ]; then + CREATEPKG_CHILD=1 +else + let CREATEPKG_CHILD++ +fi + +BASENAME="`basename $0`[$CREATEPKG_CHILD]" + +check_config +check_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + +INSTALL=$off +NO_DEPS=$off +DEBUG=$off + +case $1 in + '--all'|'-a') + # build all SlackBuilds in repository + build_all_slackbuilds + exit $EXIT_CODE + ;; + '--search'|'-s') + if [ $# -ne 2 ]; then + list_slackbuilds + else + LIST=`find_slackbuild $2` + for i in $LIST; do + echo $i | sed 's/.*\/\([^\/]\+\)\.[Ss]lack[Bb]uild$/ \1/' + done + fi + exit $EXIT_CODE + ;; + '--info'|'-f') + [ $# -ne 2 ] && usage # two parameters is required + PKG_PATH=`find_slackbuild $2` + info_builds + exit $EXIT_CODE + ;; + '--install'|'-i') + [ $# -ne 2 ] && usage # two parameters is required + shift + PACKAGE="$1" + INSTALL=$on + build_queue $* + ;; + '--no-deps'|'-nd') + [ $# -ne 2 ] && usage # two parameters is required + shift + NO_DEPS=$on + PACKAGE="$1" + build_queue $* + ;; + '--debug'|'-d') + [ $# -ne 2 ] && usage # two parameters is required + shift + PACKAGE="$1" + DEBUG=$on + build_queue $* + ;; + '--sync') + sync_svn_repo $SLACKBUILDS_DIR $SLACKBUILDS_SVN + exit $EXIT_CODE + ;; + '--help'|'-h'|'') + usage + exit $EXIT_CODE + ;; + '--list'|'-l') + list_slackbuilds + exit $EXIT_CODE + ;; + '--update') + repository_update $PACKAGES_DIR + repository_update $NOARCH_DIR + exit $EXIT_CODE + ;; + '--commit') + shift + commit_changes $PACKAGES_DIR "`basename $PACKAGES_DIR:`" $* + if [ $PACKAGES_REPOS_NOARCH -eq $on ]; then + commit_changes $NOARCH_DIR "noarch:" $* + fi + exit $EXIT_CODE + ;; + '--status') + repository_status + exit $EXIT_CODE + ;; + '--import') + shift + binary_repository_import $* + exit $EXIT_CODE + ;; + '--checkout') + shift + repository_checkout $* + exit $EXIT_CODE + ;; + '--update-keyring') + get_sign_user + repo_gpg_key $PACKAGES_DIR --update + if [ $PACKAGES_REPOS_NOARCH -eq $on ]; then + repo_gpg_key $NOARCH_DIR --update + fi + exit $EXIT_CODE + ;; + '--list-packages') + shift + list_packages $* + exit $EXIT_CODE + ;; + '--sign') + shift + sign_package $* + exit $EXIT_CODE + ;; + '--remove') + shift + remove_package $* + exit $EXIT_CODE + ;; + *) + if [ "${1:0:1}" != "-" ]; then + build_queue $* + else + usage + fi + ;; +esac diff --git a/tags/0.6rc1/src/jail-commit b/tags/0.6rc1/src/jail-commit new file mode 100755 index 0000000..60e0a36 --- /dev/null +++ b/tags/0.6rc1/src/jail-commit @@ -0,0 +1,175 @@ +#!/bin/bash +# +# jail-commit: update config files from a jail to a template +# feedback: rhatto@riseup.net | gpl +# +# Jail-commit 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 2 of the License, or any later version. +# +# Jail-commit 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo $BASENAME: commit a jail configuration into a template + echo "usage: \"$BASENAME [ [template]]\"" + echo " \"$BASENAME --all\" to commit all templates" + echo " \"$BASENAME --help\" for help" + +} + +function template_merge { + + # copy differences between the jail + # and the template in the template folder + + # usage: template_merge + + if [ -z "$1" ] || [ ! -d "`template_files`" ]; then + return 1 + fi + + echo "" > `template_perms`.tmp + cd `template_files` + + for file in `find | grep -v -e "/.svn$" | grep -v -e "/.svn/" | grep -v -e "^\.$"`; do + + if [[ -e "$file" && -e "$1/$file" ]]; then + + if [ ! -d "$file" ] && [ ! -h "$file" ]; then + if ! diff -u $file $1/$file; then + echo Updating $file + cp -af $1/$file $file + fi + elif [ -h "$file" ]; then + if [ "`readlink $file`" != "`readlink $1/$file`" ]; then + rm -f $file + ln -s `readlink $1/$file` $file + fi + fi + + perms="`numeric_perm $1/$file`" + owner="`get_owner $1/$file`" + group="`get_group $1/$file`" + + # secure the file + chown root.root `template_files`/$file + chmod $perms `template_files`/$file + + echo "$file;$owner;$group;$perms" >> `template_perms`.tmp + + else + if [ ! -e "$1/$file" ]; then + echo $BASENAME: warning: missing file `slash $1/$file` + fi + fi + + done + + cat `template_perms`.tmp | sed '/^$/d' > `template_perms` + rm -f `template_perms`.tmp + + if templates_under_svn && ! svn_check `template_perms`; then + svn add `template_perms` + fi + +} + +function template_svn_commit { + + # issue a svn_commit from a template folder + # usage: template_svn_commit + + if templates_under_svn && svn_folder $1; then + cd $1 + echo First checking out from the repository... + svn update + echo Commiting changes to the repository... + svn commit -m "changes for `date`" + if [ "$?" != "0" ]; then + echo $BASENAME: commit error + fi + fi + +} + +function do_commit { + + # commit jail changes to a repository + # usage: do_commit [template] + + local jailpath template + + jailpath="$1" + jail="`basename $jailpath`" + + if [ ! -z "$2" ]; then + template="$2" + else + template="$jail" + fi + + search_template $template --update + if [ "$?" == "0" ] && ! echo "$TEMPLATE_UPDATE_LIST" | grep -q " `basename $TEMPLATE_BASE` "; then + TEMPLATE_UPDATE_LIST=" $TEMPLATE_UPDATE_LIST `basename $TEMPLATE_BASE` " # the spaces are important + if [ "$jailpath" == "/" ]; then + echo Updating main installation... + else + echo Updating $jailpath... + fi + if [ -d "`template_files`" ] || [ -a "`template_packages`" ]; then + SILENT=yes templatepkg -u $template $jailpath + template_merge $jailpath + fi + else + if [ -z "$SILENT" ]; then + echo $BASENAME: template $template not found + fi + return 1 + fi + +} + +TEMPLATE_UPDATE_LIST="" + +if [ "$1" == "--help" ]; then + usage +elif [ "$1" == "--all" ]; then + template_svn_commit $BASE_CONF/templates +elif echo $1 | grep -q -e "^--"; then + usage +elif [ ! -z "$1" ]; then + do_commit $1 $2 + if [ "$?" == "0" ]; then + template_svn_commit `dirname $TEMPLATE_BASE` + fi +else + SILENT="yes" + if [ -e $JAIL_LIST ]; then + for jailpath in `cat $JAIL_LIST`; do + do_commit $jailpath + done + fi + # main jail + do_commit / main + template_svn_commit $BASE_CONF/templates +fi + diff --git a/tags/0.6rc1/src/jail-update b/tags/0.6rc1/src/jail-update new file mode 100755 index 0000000..ce2d165 --- /dev/null +++ b/tags/0.6rc1/src/jail-update @@ -0,0 +1,62 @@ +#!/bin/bash +# +# jail-update: update config files from a jail to a template +# feedback: rhatto@riseup.net | gpl +# +# Jail-update 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 2 of the License, or any later version. +# +# Jail-update 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage { + + echo "$BASENAME: update a jail configuration from a template" + echo "usage: $BASENAME [template]" + +} + +if [ -z "$1" ] || [ "$1" == "--help" ] || echo $1 | grep -q -e "^--"; then + usage + exit 1 +fi + +if [ -z "$2" ]; then + template_name="`basename $1`" +else + template_name="$2" +fi + +search_template $template_name --update + +if [ "$?" != "0" ]; then + echo $BASENAME: template $template_name not found + exit 1 +elif [ ! -d "$1" ]; then + echo $BASENAME: jail $1 not found + exit 1 +fi + +update_template_files +update_jail_packages $1 +copy_template_files $1 +set_jail_perms $1 + diff --git a/tags/0.6rc1/src/lspkg b/tags/0.6rc1/src/lspkg new file mode 100755 index 0000000..e35baea --- /dev/null +++ b/tags/0.6rc1/src/lspkg @@ -0,0 +1,143 @@ +#!/bin/bash +# +# lspkg v0.4: view installed and contents of slackware packages +# +# feedback: rhatto at riseup.net | gpl +# +# Lspkg 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 2 of the License, or any later version. +# +# Lspkg 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +PKG_LIST_DIR="var/log/packages" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON not found, check your `basename $0` installation" + exit 1 +fi + +function head_line { + echo "usage: [ROOT=/otherroot] `basename $0` [option expression]" +} + +function usage { + head_line + echo " +options are: + + -v, --view: view installed package contents + -p, --print: print the contents of a package file + -r, --remove: remove matching packages + -s, --search: search a file under installed packages + -d, --description: show matching packages' descriptions +" +} + +# ----------------------------------------------------- +# lspkg +# ----------------------------------------------------- + +if [ $# -eq 2 ]; then + pack=$2 +elif [ $# -eq 1 ]; then + pack=$1 +else + pack="" +fi + +if [ ! -z "$pack" ]; then + if echo $pack | grep -q "*"; then + LIST_PKGS="`ls -1 /$ROOT/$PKG_LIST_DIR/$pack 2> /dev/null`" + else + pack="`echo $pack | sed -e 's/\+/\\\+/'`" + LIST_PKGS=`eval "ls -1 /$ROOT/$PKG_LIST_DIR/ 2> /dev/null | grep -E '^$pack-[^-]+-[^-]+-[^-]+$'"` + fi +else + LIST_PKGS="`ls /$ROOT/$PKG_LIST_DIR/ 2> /dev/null`" +fi + +LIST_PKGS="`slash $LIST_PKGS`" + +case $1 in + "-h"|"--help") + usage + ;; + "-v"|"--view") + if [ ! -z "$2" ]; then + if [ ! -z "$LIST_PKGS" ]; then + for file in $LIST_PKGS; do + less /$PKG_LIST_DIR/$file + done + else + if [ ! -z "$ROOT" ]; then + echo "$2: package not found on /$ROOT/$PKG_LIST_DIR" + exit 1 + else + echo "$2: package not found on /$PKG_LIST_DIR" + exit 1 + fi + fi + else + head_line + exit 1 + fi + ;; + "-p"|"--print") + if [ -f "$2" ]; then + tar ztvf $2 + else + echo $2: file not found + fi + ;; + "-r"|"--remove") + if [ ! -z "$2" ]; then + if [ ! -z "$LIST_PKGS" ]; then + removepkg /$ROOT/$PKG_LIST_DIR/$1-[0-9]* + fi + fi + ;; + "-s"|"--search") + if [ ! -z "$2" ]; then + eval "grep -l '\/$2$' /$ROOT/$PKG_LIST_DIR/*" + fi + ;; + "-d"|"--description") + if [ ! -z "$2" ]; then + for file in $LIST_PKGS; do + pack="`package_name $file`" + echo -e " Package description for $file:\n" + sed -n "/^$pack:/ { s/$pack://; p; }" $file + done + else + head_line + exit 1 + fi + ;; + *) + if [ ! -z "$LIST_PKGS" ]; then + for pack in $LIST_PKGS; do + echo $pack + done + else + if [ ! -z "$ROOT" ]; then + echo "$1: package not found on /$ROOT/$PKG_LIST_DIR" + exit 1 + else + echo "$1: package not found on /$PKG_LIST_DIR" + exit 1 + fi + fi + ;; +esac + diff --git a/tags/0.6rc1/src/mkbuild b/tags/0.6rc1/src/mkbuild new file mode 100755 index 0000000..b490d6e --- /dev/null +++ b/tags/0.6rc1/src/mkbuild @@ -0,0 +1,1902 @@ +#!/bin/bash +# +# mkbuild: SlackBuild script maker +# feedback: rudsonaalves at yahoo.com.br +# +# mkbuild 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 2 of the License, or any later version. +# +# mkbuild 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# Based in model generic.SlackBuild from Luis +# Version $Rev$ - $Author$ +# + +#-------------------------------------------------------------------- +# Functions +#-------------------------------------------------------------------- + +function mkbuild_use { + + # mkbuild help function + echo -e "${red}NAME${normal} + mkbuild - create SlackBuild script from ${green}.mkbuild${normal} input file + +${red}SYNOPSIS + mkbuild${normal} [${green}OPTIONS${normal}] [${green}mkbuild_file${normal}] + +${red}DESCRIPTION${normal} + [${green}mkbuild_file${normal}] input file with build rules and variables + + Input ${green}OPTIONS${normal}: + ${red}-a${normal}, ${red}--author${normal} ${green}${normal} + author name + ${red}-ai${normal}, ${red}--author_initials${normal} ${green}${normal} + author signature + ${red}-bn${normal}, ${red}--build-number${normal} + change build number + ${red}-cs${normal}, ${red}--const_string${normal} ${green}${normal} + construction string to source name + ${red}-j${normal}, ${red}--jobs${normal} ${green}${normal} + Number of jobs to run simultaneously + ${red}-md${normal}, ${red}--model${normal} ${green}${normal} + SlackBuild model file + ${red}-npss${normal}, ${red}--nps-strip${normal} + Number of prefix slashes to strip + ${red}-pf${normal}, ${red}--patch-files${normal} + List of patch files + ${red}-pn${normal}, ${red}--pkg_name${normal} ${green}${normal} + package name + ${red}--prefix${normal} ${normal} + Prefix install directory + ${red}-pv${normal}, ${red}--pkg_version${normal} ${green}${normal} + package version + ${red}-sn${normal}, ${red}--src_name${normal} ${green}${normal} + source name + ${red}-u${normal}, ${red}--url${normal} ${green}${normal} + url address to source + + Program options: + ${red}-d${normal}, ${red}--debug${normal} + enable debug mode + ${red}-ss${normal}, ${red}--submit-slackbuild${normal} + submit SlackBuilds in local svn SlackBuild tree + ${red}-sm${normal}, ${red}--submit-mkbuild${normal} + submit .mkbuild in local svn mkbuild tree + ${red}-sa${normal}, ${red}--submit-all${normal} + submit SlackBuild and .mkbuild files in local svn tree + ${red}-cs${normal}, ${red}--commit-slackbuild${normal} + commit SlackBuilds in svn SlackBuild tree + ${red}-cm${normal}, ${red}--commit-mkbuild${normal} + commit .mkbuild in svn mkbuild tree + ${red}-ca${normal}, ${red}--commit-all${normal} + commit SlackBuild and .mkbuild files in svn tree + ${red}-im${normal}, ${red}--import-mkbuilds${normal} + import mkbuild repository in a svn tree + ${red}-is${normal}, ${red}--import-slackbuilds${normal} + import SlackBuild repository in a svn tree + ${red}-ia${normal}, ${red}-i${normal}, ${red}--import-all${normal}, ${red}--import${normal} + import mkbuild and SlackBuild repositories in a svn tree + ${red}--status${normal} + print mkbuild and SlackBuild svn repositories status + ${red}-ls${normal}, ${red}--list${normal} + list mkbuild folder contents + ${red}-h${normal}, ${red}--help${normal} + this help mesage + ${red}-n${normal}, ${red}--new${normal} ${green}${normal} + start a new mkbuild configure file + ${red}-s${normal}, ${red}--search${normal} ${green}${normal} + search for a ${green}${normal} file + ${red}--sync${normal} + synchronize mkbuilds repository + ${red}-v${normal}, ${red}--version${normal} + program version + ${red}-V${normal}, ${red}--verbose${normal} + print debug information + ${red}-e${normal}, ${red}--edit${normal} + edit a mkbuild + ${red}-wc${normal}, ${red}--working-copy${normal} + create an unversioned mkbuild working copy + ${red}--get-param-copy${normal} + get a parameter from a given mkbuild + +${red}EXAMPLES${normal} + ${red}mkbuild -sa pyrex.mkbuild${normal} + build pyrex.SlackBuild and submit .mkbuild and .SlackBuild in + Slack.Sarava local tree. + ${red}mkbuild -a \"Jose Araujo\" -ai \"ja\" -n pyrex${normal} + make a basic pyrex.mkbuild with author name \"Jose Araujo\" and + author signature \"ja\". + ${red}mkbuild --prefix /usr/local pyrex.mkbuild${normal} + build pyrex.SlackBuild with prefix /usr/local and pyrex.mkbuild + variables and options definitions. + +${red}AUTHOR${normal} + Written by ${blue}Rudson R. Alves${normal} + +${red}AVAILABILITY${normal} + by svn: ${yellow}svn checkout http://slack.sarava.org/simplepkg${normal} + +${red}REPORTING BUGS${normal} + Report bugs to <${blue}rudsonaalves[at]rra.etc.br${normal}> + +${red}COPYRIGHT${normal} + Copyright © 2006 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the + terms of the GNU General Public License + <${yellow}http://www.gnu.org/licenses/gpl.html${normal}>. There is NO WARRANTY, + to the extent permitted by law." +} + +function set_parameters { + + # Get and set mkbuild variables with parameters input + # Use: set_parameters $@ + # where $@ are the parameters input + # + # Parameter evaluation + ACTION="build" + + local search match + + while [ "$1" ]; do + case $1 in + '-bn'|'--build-number') + # Build Number + BUILD_NUMBER=$2 + is_number $BUILD_NUMBER || handle_error "$ERROR_NOT_NUMBER" "--build-number" + shift + ;; + '-ss'|'--submit-slackbuild') + # Submit SlackBuild file + SUBMIT_SLACKBUILD=$on + ;; + '-sm'|'--submit-mkbuild') + # Submit mkbuild file + SUBMIT_MKBUILD=$on + ;; + '-sa'|'--submit-all') + # Submit SlackBuild and mkbuild file + SUBMIT_SLACKBUILD=$on + SUBMIT_MKBUILD=$on + ;; + '-cs'|'--commit-slackbuild') + # Commit SlackBuild file + ACTION="commit_slackbuild" + set_mkbuild_name $2 + break # we need to break otherwise commit log message is evalued + ;; + '-cm'|'--commit-mkbuild') + # commit mkbuild file + ACTION="commit_mkbuild" + set_mkbuild_name $2 + break # we need to break otherwise commit log message is evalued + ;; + '-ca'|'--commit-all') + # Commit SlackBuild and mkbuild file + ACTION="commit_all" + set_mkbuild_name $2 + break # we need to break otherwise commit log message is evalued + ;; + '-is'|'--import-slackbuilds') + # Import SlackBuilds + ACTION="import_slackbuilds" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-im'|'--import-mkbuilds') + # Import mkbuilds + ACTION="import_mkbuilds" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-ia'|'-i'|'--import-all'|'--import') + # Import SlackBuilds and mkbuilds + ACTION="import_all" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-ds'|'--delete-slackbuild') + # Delete SlackBuild + ACTION="delete_slackbuild" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-dm'|'--delete-mkbuild') + # Delete mkbuild + ACTION="delete_mkbuild" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-da'|'--delete-all') + # Delete mkbuild and SlackBuild + ACTION="delete_all" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '--status') + # Repository status + ACTION="status" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-ls'|'--list') + # List mkbuild folder contents + ACTION="list" + set_mkbuild_name $2 + break # we need to break otherwise specific arguments are evalued + ;; + '-um'|'--update-manifest') + ACTION="update_manifest" + set_mkbuild_name $2 + SOURCE_FILE="$3" + shift 2 + ;; + '-n'|'--new') + # New mkbuild configure file + set_mkbuild_name $2 + ACTION="new" + shift + ;; + '-s'|'--search') + # Search for a mkbuild file + set_mkbuild_name $2 + ACTION='search' + ;; + '-e'|'--edit') + # Open mkbuild with $EDITOR + set_mkbuild_name $2 + ACTION='edit' + break # we need to break otherwise specific arguments are evalued + ;; + '-wc'|'--working-copy') + # Create an unversioned mkbuild working copy + set_mkbuild_name $2 + ACTION='working_copy' + break # we need to break otherwise specific arguments are evalued + ;; + '--get-param') + # Get parameter for a given mkbuild + set_mkbuild_name $2 + ACTION='get_param' + break # we need to break otherwise specific arguments are evalued + ;; + '-d'|'--debug') + # Debug mode + set -x + ;; + '-h'|'--help' ) + # Show help mesage + mkbuild_use && exit 0 + ;; + '--sync' ) + # Synchronize mkbuilds repository + mkbuild_update_keyring + sync_svn_repo $MKBUILDS_DIR $MKBUILDS_SVN + exit $? + ;; + '-v'|'--version') + # Show program version + eecho $normal "\n$BASENAME version $PROG_VERSION\n" + ;; + '-V' | '--verbose') + # Enable verbose mode + VERBOSE=1 + ;; + '-a'|'--author') + # Enter with author name + AUTHOR=$2 + [ ${AUTHOR:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR AUTHOR + shift + ;; + '-ai'|'--author_initials') + # Enter with author name + AUTHOR_INITIALS=$2 + [ ${AUTHOR_INITIALS:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR AUTHOR_INITIALS + shift + ;; + '-cs'|'--const_string') + # Enter with construction source name string + CONST_STRING=$2 + [ ${CONST_STRING:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR CONST_STRING + shift + ;; + '-md'|'--model') + # Enter with SlackBuild model + MODEL=$2 + [ ${MODEL:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR MODEL + shift + ;; + '-j'|'--jobs') + # Enter with SlackBuild model + NUMJOBS=$2 + [ ${NUMJOBS:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR NUMJOBS + ! is_number $NUMJOBS && handle_error $ERROR_NOT_NUMBER NUMJOBS + NUMJOBS="-j$NUMJOBS" + shift + ;; + '--prefix') + # Enter with SlackBuild model + PREFIX=$2 + [ ${PREFIX:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR PREFIX + shift + ;; + '-pn'|'--pkg_name') + # Enter with package name + PKG_NAME=$2 + [ ${PKG_NAME:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR PKG_NAME + shift + ;; + '-pv'|'pkg_version') + # Enter with package version + VERSION=$2 + [ ${VERSION:0:1} = "-" ] && handle_error $ERROR_MKBUILD_INPUT_PAR VERSION + shift + ;; + '-sn'|'--src_name') + # Enter with source name + SRC_NAME=$2 + [ ${SRC_NAME:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR SRC_NAME + shift + ;; + '-u'|'--url') + # Enter with url address + URL=$2 + [ ${URL:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR URL + shift + ;; + '-pf'|'--patch-files') + # Path files list + PATCH_FILES=$2 + [ ${PATCH_FILES:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR PATCH_FILES + shift + ;; + '-npss'|'--nps-strip') + # Number of prefix slashes to strip + NPS_STRIP=$2 + [ ${NPS_STRIP:0:1} = '-' ] && handle_error $ERROR_MKBUILD_INPUT_PAR NPS_STRIP + shift + ;; + *) + # mkbuild input file + set_mkbuild_name $1 + ;; + esac + shift + done + + if [ "${MKBUILD_NAME:0:1}" == "-" ]; then + echo "Invalid mkbuild name $MKBUILD_NAME" + exit 1 + fi + + if [ ! -e "$MKBUILD_NAME" ] && [ "$ACTION" != "search" ] && [ "$ACTION" != "status" ]; then + + search="`search_mkbuild`" + + if [ ! -z "$search" ]; then + for match in $search; do + MKBUILD_NAME="$match" + WORK="`dirname $match`" + break + done + else + if [ "$ACTION" == "build" ]; then + ACTION='new' + fi + fi + + fi + + MKBUILD_NAME="${MKBUILD_NAME//.mkbuild}.mkbuild" + MKBUILD_BASENAME="`basename $MKBUILD_NAME .mkbuild`" + +} + +function get_variable { + + # Get variable value from mkbuild file (MKBUILD_NAME) + [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + [ -z $MKBUILD_NAME ] && echo "Warning: no [mkbuild_file]." && return 0 + + sed -n '1,/^#>>/ p' $MKBUILD_NAME | grep "^\[\[${1}\]\]" | tail -n 1 | cut -f2- -d= | sed -e 's/^"//' -e 's/"$//' + +} + +function edit_file { + + # Edit file $3, by change string [[$1]] to $2 + [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + + eval "sed -i 's¦\[\[$1\]\]¦$2¦g' $3" + +} + +function edit_file_full { + + # Edit file $3, by change string $1 to $2 + [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + + eval "sed -i 's¦$1¦$2¦' $3" + +} + +function start_build { + + # Build initial sections + [ $# -ne 1 ] && handle_error $ERROR_PAR_NUMBER + + edit_file "SLACKBUILD AUTHOR" "$AUTHOR" $1 + edit_file "SLACKBUILD AUTHOR INITIALS" "$AUTHOR_INITIALS" $1 + edit_file "SOURCE NAME" "$SRC_NAME" $1 + edit_file "PROGRAM NAME" "$PKG_NAME" $1 + edit_file "PACKAGE NAME" "$PKG_NAME" $1 + edit_file "DECOMPRESSOR" "$DECOMPRESSOR" $1 + edit_file "DECOMPRESSOR TEST FLAG" "$DECOMPRESSOR_TEST_FLAG" $1 + edit_file "PROGRAM URL" "$URL" $1 + if [ "$ARCH" == "noarch" ]; then + sed -i 's/^ARCH=.*$/ARCH="noarch"/' $1 + else + edit_file "ARCH" "$ARCH" $1 + fi + edit_file "NUMBER OF JOBS" "$NUMJOBS" $1 + edit_file "VERSION" "$VERSION" $1 + edit_file "SOURCE NAME CONSTRUCTION STRING" "$CONST_STRING" $1 + edit_file "EXTENSION" "$EXTENSION" $1 + edit_file "DOWNLOAD FOLDER URL" "$URL_BASE" $1 + edit_file "OTHER CONFIGURE ARGS" "$OPTIONS" $1 + edit_file "DOCUMENTATION FILES" "$DOCFILES" $1 + edit_file "PREFIX" "$PREFIX" $1 + edit_file "UNPACKER" "$UNPACKER" $1 + edit_file "UNPACKER FLAGS" "$UNPACKER_FLAGS" $1 + edit_file "BUILD NUMBER" "$BUILD_NUMBER" $1 + edit_file "PATCH FILES" "$PATCH_FILES" $1 + edit_file "NUMBER OF PREFIX SLASHES TO STRIP" "$NPS_STRIP" $1 + + edit_file_full "\$EXTENSION" "$EXTENSION" $1 + +} + +function clear_files { + + # Remove temporary files + [ ! -z $AUX_TMP ] && rm $AUX_TMP 2>/dev/null + [ ! -z $SLACKBUILD_TEMP ] && rm $SLACKBUILD_TEMP 2>/dev/null + [ ! -z $DIFF_FILE ] && rm $DIFF_FILE 2>/dev/null + chmod 755 *.SlackBuild 2>/dev/null + +} + +function set_status { + + # Set status section + # $1 - Section + # $2 - Status + # $3 - file + [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + if [ "`get_status $1 $3`" != "all" ]; then + verbose "Section $1 $2" + eval "sed -i 's/^<$1>.*$/<$1> $2/' $3" + else + echo "Warning: Section $1 have status all. Can't change!" + fi + +} + +function get_status { + + # Get status from section + # $1 - Section + # $2 - file + [ $# -ne 2 ] && handle_error $ERROR_PAR_NUMBER + eval "sed '/^<$1>.*$/! d' $2" + +} + +function get_mkbuild_status { + + # Get status from mkbuild file + # $1 section + eval "sed '/^#>>/,/<>/,/< off/, /^<\/[a-z].*>$/ d' $SLACKBUILD_TEMP + # Remove sections names + sed -i '/^<.*$/ d' $SLACKBUILD_TEMP + # Remove clear lines + # isto pode ser feito com "cat -s SLACKBUILD_TEMP ..." + sed -i ':i ; $! N; s/\n/Ø/ ; t i ; s/Ø\{3,\}/ØØ/g ; s/Ø/\n/g' $SLACKBUILD_TEMP + # Remove from frist line do #!/... line + sed '1,/^#\!/ {/^#\!/ b; d }' $SLACKBUILD_TEMP > $SLACKBUILD + +} + +function section_edit { + + # Edits a section substituting its content + [ -z $MKBUILD_NAME ] && return 0 + + SECTION_LIST=`grep '^#>[a-z]' $MKBUILD_NAME | cut -c3-` + + # Check for sections change + [ -z "$SECTION_LIST" ] && return 0 + + # Change sections + for i in $SECTION_LIST; do + verbose "Change section $i" + if [ "$i" = "slackdesc" ]; then + # Special slackdesc section + slackdesc_edit > $AUX_TMP + mv $AUX_TMP $SLACKBUILD_TEMP + else + # Others sections + section_change $i + fi + done + +} + +function slackdesc_edit { + + # Edit slackdesc section + sed -n '1,/|-----/ { // b; /|-----/ b; p; }' $SLACKBUILD_TEMP + echo -n $PKG_NAME | tr [a-z+\-] " " + echo -n "|-----handy-ruler" + let N=18+${#PKG_NAME} + for i in `seq $N $SLACKDESC_LEN`; do + echo -n "-" + done + echo -en "|\n" + + sed -n '/#>slackdesc/,/#/! d' $SLACKBUILD_TEMP > $AUX_TMP" + # Paste new section + eval "sed -n '/#>$1/,/#<$1/ { /^#>/ b; /^#> $AUX_TMP" + # Copy second halt + eval "sed '/^<\/$1>/,$ ! d' $SLACKBUILD_TEMP >> $AUX_TMP" + + mv $AUX_TMP $SLACKBUILD_TEMP + +} + +function make_slack_required { + + # Build slack-required file + [ -e $WORK/slack-required ] && mv $WORK/slack-required $WORK/slack-required.old + [ -z "$SLACK_REQUIRED" ] && return 0 + + echo -e "# Dependency list to $SRC_NAME\n#\n# dependency [condition] [version]]" > $WORK/slack-required + + echo $SLACK_REQUIRED | sed 's/:/\n/g' | while read i; do + REQ=`echo $i | awk '{ print $1 }'` + CON=`echo $i | awk '{ print $2 }'` + VER=`echo $i | awk '{ print $3 }'` + echo -e "$REQ\t\t$CON\t\t$VER" >> $WORK/slack-required + done + +} + +function change_other_parameters { + + # Change other parameters started by '[[' in .mkbuild file + sed '1,/#>>/ ! d' $MKBUILD_NAME | grep -v '^#' | grep '^\[\[[A-Za-z]' | \ + while read i; do + CHANGE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\1/'`" + VALUE="`echo $i | sed 's/\[\[\(.*\)\]\]=\"\(.*\)\"/\2/'`" + edit_file "$CHANGE" "$VALUE" $SLACKBUILD + done + +} + +function get_slackbuild_path { + + # Search for SlackBuild Path in order: + # - command line parameter; + # - mkbuild parameters file; + # - SlackBuild tree; + # - Gentool-portage internet tree; + # - default path (others/unclassified/$PKG_NAME). + + # Start AUX_PATH with command line parameter + AUX_PATH="$SLACKBUILD_PATH" + + # Get in mkbuild + [ -z "$AUX_PATH" ] && AUX_PATH=`validate_parameter "$SLACKBUILD_PATH" "SLACKBUILD PATH" ""` + + # SlackBuild path in SlackBuild tree + [ -z "$AUX_PATH" ] && AUX_PATH=`cd $SLACKBUILDS_DIR && find . -name $SLACKBUILD | sed -e 's/^\.\///' | xargs dirname 2>/dev/null` + + # SlackBuild path default + [ -z "$AUX_PATH" ] && AUX_PATH="others/unclassified/$PKG_NAME" + + # Down case SlackBuild path + eval "echo $AUX_PATH" | tr [A-Z] [a-z] + +} + +function apply_mkpatch { + + # Apply mkpatch if exist + sed -n '/#p>/,/#p $DIFF_FILE + if [ -s $DIFF_FILE ]; then + mkpatch $DIFF_FILE $SLACKBUILD_TEMP > $AUX_TMP || handle_error $? + [ ! -s $AUX_TMP ] && handle_error 1 + cp $AUX_TMP $SLACKBUILD_TEMP + [ $VERBOSE -eq $on ] && ( echo -e "\nApply mkpath ..."; cat $DIFF_FILE ) + fi + +} + +# ---------------------------------------------------------------- +# svn functions +# ---------------------------------------------------------------- + +function submit_slackbuild { + + # Submit SlackBuild in local Slack.Sarava tree + echo -e "\nSubmiting $SLACKBUILD" + + local candidate oldplace + + # check SlackBuilds directory + [ ! -e $SLACKBUILDS_DIR ] && createpkg --sync + + # change to SlackBuilds directory + cd $SLACKBUILDS_DIR/ + + # Add SlackBuild scripts + # check path + [ ! -e $SLACKBUILD_PATH ] && svn_mkdir $SLACKBUILD_PATH + + # add SlackBuild + svn_copy $WORK/`basename $SLACKBUILD` $SLACKBUILD_PATH + + # check and add slack-required + [ -e $WORK/slack-required ] && svn_copy $WORK/slack-required $SLACKBUILD_PATH + + for i in `ls $WORK | grep -E -v '(SlackBuild|old|slack-required|.mkbuild$|.tmp$)\*{0,1}$'`; do + svn_copy $WORK/$i $SLACKBUILD_PATH + done + + # remove stuff in old places + for candidate in $(find . -name $(basename $SLACKBUILD)); do + oldplace="`dirname $candidate | sed -e 's/^\.\///'`" + if [ "$oldplace" != "$SLACKBUILD_PATH" ]; then + echo "Removing SlackBuild found at old path $oldplace" + svn_del $oldplace + fi + done + + if [ "$SIGN_MANIFESTS" -eq $on ]; then + repo_gpg_key $SLACKBUILDS_DIR + fi + + cd $WORK + +} + +function submit_mkbuild { + + # Submit mkbuild in local mkbuild Slack.Sarava tree + echo -e "\nSubmiting $MKBUILD_NAME" + + local candidate oldplace + + # Check mkbuild directory + [ ! -d $MKBUILDS_DIR ] && build_svn_repo $MKBUILDS_DIR $MKBUILDS_SVN + + # Get mkbuild path in parameter file + MKBUILD_PATH=$SLACKBUILD_PATH + + # Change to mkbuilds directory + cd $MKBUILDS_DIR/ + + # Check path + [ ! -e $MKBUILD_PATH ] && svn_mkdir $MKBUILD_PATH + + # Add relevant files + for i in `ls $WORK | grep -E -v '(SlackBuild|old|slack-required|.tmp$)\*{0,1}$'`; do + if [ "`basename $i`" != "$DIST_SRC_NAME" ]; then + if ! is_the_same $MKBUILD_PATH $WORK; then + svn_copy $WORK/$i $MKBUILD_PATH + else + svn_add $WORK/$i + fi + fi + done + + # Remove stuff in old places + for candidate in $(find . -name $(basename $MKBUILD_NAME)); do + oldplace="`dirname $candidate | sed -e 's/^\.\///'`" + if [ "$oldplace" != "$MKBUILD_PATH" ]; then + echo "Removing mkbuild found at old path $oldplace" + svn_del $oldplace + fi + done + + submit_cleanup + + cd $WORK + +} + +function submit_cleanup { + + # Remove files that should not be stored at the mkbuilds repository + if is_the_same $MKBUILD_PATH $WORK; then + ( + cd $WORK + rm -f *.old *.tmp *.SlackBuild slack-required $DIST_SRC_NAME + ) + fi + +} + +function import_mkbuilds { + + # import mkbuilds into a subversion repository + # usage: repository_import [repository] + + local repository="$1" + + if [ -z "$repository" ]; then + repository="file:////var/svn/mkbuilds" + fi + + repository_import $MKBUILDS_DIR $repository + +} + +function import_slackbuilds { + + # import SlackBuilds into a subversion repository + # usage: repository_import [repository] + + local repository="$1" + + if [ -z "$repository" ]; then + repository="file:////var/svn/slackbuilds" + fi + + repository_import $SLACKBUILDS_DIR $repository + +} + +function repository_status { + + local cwd + + if svn_folder $MKBUILDS_DIR; then + echo "Status of $MKBUILDS_DIR." + cwd="`pwd`" + cd $MKBUILDS_DIR && su_svn status + cd $cwd + fi + + if svn_folder $SLACKBUILDS_DIR; then + cwd="`pwd`" + echo "Status of $SLACKBUILDS_DIR." + cd $SLACKBUILDS_DIR && su_svn status + cd $cwd + fi + + exit 0 + +} + +# ---------------------------------------------------------------- +# general functions +# ---------------------------------------------------------------- + +function validate_parameter { + + # Validate parameter in .mkbuild file + [ $# -ne 3 ] && handle_error $ERROR_PAR_NUMBER + + if [ ! -z "$1" ]; then + echo "$1" + else + local STRING="`get_variable "$2"`" + if [ ! -z "$STRING" ]; then + echo "$STRING" + else + echo "$3" + fi + fi + +} + +function decompress_find { + + # Find decompressor program and test flag + case $EXTENSION in + 'gz'|'GZ') + DECOMPRESSOR="gunzip" + DECOMPRESSOR_TEST_FLAG="-t" + ;; + 'bz2'|'BZ2') + DECOMPRESSOR="bunzip2" + DECOMPRESSOR_TEST_FLAG="-t" + ;; + 'zip'|'ZIP') + DECOMPRESSOR="unzip" + DECOMPRESSOR_TEST_FLAG="-t" + ;; + *) + handle_error $ERROR_MKBUILD_CONSTRUCTION "DECOMPRESSOR" + ;; + esac + +} + +function load_parameters { + + # Load Createpkg parameters + SOURCE_DIR="`eval_parameter SOURCE_DIR /var/simplepkg/sources`" + SLACKBUILDS_DIR="`eval_parameter SLACKBUILDS_DIR /var/simplepkg/slackbuilds`" + [ ! -d $SLACKBUILDS_DIR ] && mkdir -p $SLACKBUILDS_DIR + + MKBUILDS_DIR="`eval_parameter MKBUILDS_DIR /var/simplepkg/mkbuilds`" + [ ! -d $SLACKBUILDS_DIR ] && mkdir -p $SLACKBUILDS_DIR + + SLACKBUILDS_SVN="`eval_parameter SLACKBUILDS_DIR http://slack.sarava.org/slackbuilds`" + MKBUILDS_SVN="`eval_parameter MKBUILDS_SVN http://slack.sarava.org/mkbuilds`" + SVN_USER="`eval_parameter MKBUILDS_SVN_USER`" + SVN_GROUP="`eval_parameter MKBUILDS_SVN_GROUP`" + + COLOR_MODE="`eval_parameter COLOR_MODE none`" + TMP="`eval_parameter TMP /tmp`" + + MKBUILD_AUTHOR="`eval_parameter MKBUILD_AUTHOR`" + MKBUILD_AUTHOR_INITIALS="`eval_parameter MKBUILD_AUTHOR_INITIALS`" + + SIGN_MANIFESTS="`eval_boolean_parameter SIGN_MANIFESTS $off`" + SIGN_MANIFESTS_USER="`eval_parameter SIGN_MANIFESTS_USER`" + SIGN_MANIFESTS_KEYID="`eval_parameter SIGN_MANIFESTS_KEYID`" + SIGN_MANIFESTS_WITH_GPG_AGENT="`eval_boolean_parameter SIGN_MANIFESTS_WITH_GPG_AGENT $off`" + + if [ ! -z "$SIGN_MANIFESTS_KEYID" ]; then + SIGN_MANIFESTS_KEYID="`echo $SIGN_MANIFESTS_KEYID | tr '[:lower:]' '[:upper:]'`" + fi + + if [ "$SIGN_MANIFESTS_WITH_GPG_AGENT" -eq $on ]; then + GPG_AGENT_OPTION="--use-agent" + else + GPG_AGENT_OPTION="" + fi + + # For use at common.sh functions + SIGN="$SIGN_MANIFESTS" + SIGN_KEYID="$SIGN_MANIFESTS_KEYID" + SIGN_USER="$SIGN_MANIFESTS_USER" + + if [ "$SIGN_MANIFESTS" -eq $on ]; then + get_sign_user + fi + +} + +function file_metainfo { + + # get integrity file metadata + # usage: file_metainfo + + local sum="" file="$1" file_type="`echo $2 | tr '[:lower:]' '[:upper:]'`" + local size algo candidate folders path manifest_file="$3" + local dist_name="`basename $file`" + + if [ -d "$file" ]; then + return + fi + + if [ -z "$file_type" ]; then + file_type="AUX" + fi + + if [ ! -e "$file" ]; then + if [ "$file_type" == "DIST" ]; then + + # Add DIST information only if source is not under revision control + if [ $SVN_MOD -eq $on -o $GIT_MOD -eq $on ]; then + return + fi + + # Force DIST file name at Manifest + dist_name="$DIST_SRC_NAME" + + # Determine file location + get_dist_file + + # Update Manifest metadata + if [ -e "$DIST_SRC_LOCATION" ]; then + file="$DIST_SRC_LOCATION" + else + echo "$file_type $dist_name " >> $manifest_file # end space is important + return 1 + fi + + elif [ "$file_type" == "PATCH" ]; then + + # Determine file location + get_patch_file $file + + # Update Manifest metadata + if [ -e "$DOWNLOADED_PATCH_LOCATION" ]; then + file="$DOWNLOADED_PATCH_LOCATION" + else + echo "$file_type $dist_name " >> $manifest_file # end space is important + return 1 + fi + + else + echo "$file_type $dist_name " >> $manifest_file # end space is important + return 1 + fi + fi + + for algo in md5 rmd160 sha1 sha256 sha512; do + sum="$sum `echo $algo | tr '[:lower:]' '[:upper:]'` `gethash $algo $file`" + done + + echo $file_type $dist_name `file_size $file` $sum >> $manifest_file + + if [ "$file_type" == "DIST" ] || [ "$file_type" == "PATCH" ]; then + echo "Please make sure that the following hashes are correct:" + grep -e "^$file_type $dist_name " $manifest_file + fi + +} + +function update_manifest_info { + + # update manifest metainfo for a given file + # usage: update_manifest_info + + local tmpfile file="$1" file_type="`echo $2 | tr '[:lower:]' '[:upper:]'`" + + if [ -z "$file_type" ]; then + file_type="`file_extension $file | tr '[:lower:]' '[:upper:]'`" + fi + + # Update Manifest file + if [ ! -e "$WORK/Manifest" ]; then + touch $WORK/Manifest + fi + + # Set temporary file + tmpfile="`mktemp $TMP/mkbuild_manifest.XXXXXX`" + + # Update metadata + sed -e "/^$file_type `basename $file` /d" $WORK/Manifest > $tmpfile + file_metainfo $file $file_type $tmpfile + + if [ "$?" != "0" ]; then + echo "Could not add hashes for $file on Manifest: file not found." + echo "Please do it with --update-manifest." + fi + + # Save Manifest changes + strip_gpg_signature $tmpfile | sort > $WORK/Manifest + + rm -f $tmpfile + +} + +function edit_manifest { + + local option="$1" + + # Check if existing Manifest is properly signed + if ! check_manifest_signature; then + echo "Invalid signature at $WORK/Manifest, aborting." + return 1 + fi + + # Update Manifest file + echo "Updating Manifest..." + + # Update mkbuild metainformation + update_manifest_info $WORK/`basename $MKBUILD_NAME` + + # Update SlackBuild information + update_manifest_info $WORK/`basename $SLACKBUILD` + + # Update slack-required information + if [ -e "$WORK/slack-required" ]; then + update_manifest_info $WORK/slack-required + fi + + if [ "$option" == "--update" ]; then + # Add DIST information only if source is not under revision control + if [ $SVN_MOD -eq $on -o $GIT_MOD -eq $on ]; then + echo "Source is under version control system, not adding hashes to Manifest." + else + echo "Updating DIST information at $MKBUILD_NAME Manifest..." + + # Determine file location + get_dist_file $SOURCE_FILE + + # Update Manifest metadata + if [ -e "$DIST_SRC_LOCATION" ]; then + update_manifest_info $DIST_SRC_LOCATION dist + else + echo "Can't get $DIST_SRC_NAME." + fi + fi + else + # Add source code information if its not already there + if ! grep -q -e "^DIST $DIST_SRC_NAME " $WORK/Manifest; then + update_manifest_info $DIST_SRC_NAME dist + fi + fi + + # Update patches + for i in `find $WORK | grep -E '(.diff$|.diff.gz$|.diff.bz2$|.patch$|.patch.gz$|.patch.bz2$)\*{0,1}$'`; do + if [ ! -d "$WORK/$i" ] && ! grep -q -e "^PATCH `basename $i` " $WORK/Manifest; then + update_manifest_info $i patch + fi + done + + # Update patches from URLs + for i in $PATCH_URLS; do + if ! grep -q -e "^PATCH `basename $i` " $WORK/Manifest; then + update_manifest_info $i patch + fi + done + + # Update miscelaneous information + for i in `find $WORK | grep -E -v '(SlackBuild|old|slack-required|.mkbuild$|.tmp$|Manifest$)\*{0,1}$' | \ + grep -E -v '(.diff$|.diff.gz$|.diff.bz2$|.patch$|.patch.gz$|.patch.bz2$)\*{0,1}$' | \ + grep -v "/\.svn"`; do + # Avoid folders, dotfiles and DIST files + if [ ! -d "$WORK/$i" ] && \ + [ "`basename $i`" != "$DIST_SRC_NAME" ] && \ + ! echo "`basename $i`" | grep -q -e "^\."; then + update_manifest_info $i misc + fi + done + + # Finally, sign the Manifest + sign_manifest + +} + +function get_file { + + # download a file + # usage: download_file [file] [dist_name] + + local folder folders path candidate + local file_type="`echo $1 | tr '[:lower:]' '[:upper:]'`" + local url="$2" file="$3" file_name="$4" + local protocol="`echo $url| cut -d : -f 1 | tr '[:upper:]' '[:lower:]'`" + + if [ -z "$file_name" ]; then + if [ "$file_type" == "DIST" ]; then + file_name="$DIST_SRC_NAME" + else + file_name="`basename $url`" + fi + fi + + # Clean global var + DOWNLOADED_FILE_LOCATION="" + + # Determine file location + if [ -d "$file" ]; then + + folder="$file" + file="$file_name" + for candidate in $(find $folder -name $(basename $file)); do + if [ ! -z "$candidate" ]; then + break 2 + fi + done + + if [ ! -z "$candidate" ]; then + echo "Using $(basename $candidate) found at $(dirname $candidate) to hash at the Manifest." + file="$candidate" + else + echo "Can't find $file at $folder." + return 1 + fi + + elif [ -z "$file" ]; then + + file="$file_name" + folders="$WORK $TMP $SOURCE_DIR" + if ! is_the_same /tmp $TMP; then + folders="$folders /tmp" + fi + + echo "Trying to find $(basename $file) at $folders..." + + for path in $folders; do + for candidate in $(find $path -name $(basename $file) 2> /dev/null); do + if [ ! -z "$candidate" ]; then + break 2 + fi + done + done + + if [ ! -z "$candidate" ]; then + + echo "Using $(basename $candidate) found at $(dirname $candidate) to hash at the Manifest." + file="$candidate" + + elif [ "$protocol" == "https" ] || \ + [ "$protocol" == "http" ] || \ + [ "$protocol" == "ftp" ]; then + + # Try to donwload the file + echo "File $file not found, trying to download it..." + if [ ! -e "$file" ]; then + if is_writable_folder $SOURCE_DIR/$PKG_NAME; then + file="$SOURCE_DIR/$PKG_NAME/`basename $file_name`" + wget "$url" -O "$file" + if [ "$?" != "0" ]; then + echo "Could not download $file" + return 1 + fi + elif is_writable_folder $TMP; then + file="$TMP/`basename $file_name`" + if [ ! -e "$file" ]; then + wget "$url" -O "$file" + if [ "$?" != "0" ]; then + echo "Could not download $file" + return 1 + fi + fi + elif ! is_the_same /tmp $TMP; then + file="/tmp/`basename $file_name`" + if [ ! -e "$file" ]; then + wget "$url" -O "$file" + if [ "$?" != "0" ]; then + echo "Could not download $file" + return 1 + fi + fi + else + echo "Could not download $file" + return 1 + fi + fi + fi + fi + + if [ -e "$file" ]; then + DOWNLOADED_FILE_LOCATION="$file" + fi + +} + +function get_dist_file { + + # get package source code + # usage: get_dist_file [file_name] + + DIST_SRC_LOCATION="" + get_file dist $DIST_SRC_URL + DIST_SRC_LOCATION="$DOWNLOADED_FILE_LOCATION" + +} + +function get_patch_file { + + # get a patch + # usage: get_patch + + local patch_url file_name="$1" + + if [ -z "$file_name" ]; then + return 1 + fi + + DOWNLOADED_PATCH_LOCATION="" + + for patch_url in $PATCH_URLS; do + if [ "`basename $file_name`" == "`basename $patch_url`" ]; then + get_file patch $patch_url + DOWNLOADED_PATCH_LOCATION="$DOWNLOADED_FILE_LOCATION" + break + fi + done + +} + +function update_manifest { + + # Get mkbuild values + get_mkbuild_values + + # Update the Manifest + edit_manifest --update + +} + +function if_previous_error { + + if [ "$?" != "0" ]; then + handle_error $* + fi + +} + +function verbose { + + if [ $VERBOSE -eq $on ]; then + echo $* + fi + +} + +function get_mkbuild_values { + + # Get values + # Author name + AUTHOR=${AUTHOR:="`get_variable "SLACKBUILD AUTHOR"`"} + [ -z "$AUTHOR" ] && handle_error $ERROR_MKBUILD_CONSTRUCTION "SLACKBUILD AUTHOR" + verbose "[[SLACKBUILD AUTHOR]]=\"$AUTHOR\"" + + # Author initials + STR_MOUNT=`echo $AUTHOR | sed 's/ /\n/g' | sed 's/^\([A-Z]\).*/\1/' | sed ':i; $!N; s/\n//; ti' | tr [A-Z] [a-z]` + AUTHOR_INITIALS="`validate_parameter "$AUTHOR_INITIALS" "SLACKBUILD AUTHOR INITIALS" "$STR_MOUNT"`" + if_previous_error $ERROR_MKBUILD_CONSTRUCTION "SLACKBUILD AUTHOR INITIALS" + verbose "[[SLACKBUILD AUTHOR INITIALS]]=\"$AUTHOR_INITIALS\"" + + # URL program + URL=`validate_parameter "$URL" "DOWNLOAD FOLDER URL" ""` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "URL" + verbose "[[URL]]=\"$URL\"" + + AUX=`get_mkbuild_status "svn_source"` + SVN_MOD=`convert_boolean "$AUX"` + + AUX=`get_mkbuild_status "git_source"` + GIT_MOD=`convert_boolean "$AUX"` + + # Check sections + if [ $SVN_MOD -eq $on -o $GIT_MOD -eq $on -o $URL == "" ]; then + LIST_OFF="download_source md5sum_download_and_check_0 md5sum_download_and_check_1 gpg_signature_check untar_source" + verbose -e "\nCheck subversion or empty URL" + for i in $LIST_OFF; do + if [ `get_mkbuild_status "$i"` != "off" ]; then + handle_error $ERROR_MKBUILD_VCS + else + verbose -e "off: $i is ok." + fi + done + fi + + STR_MOUNT="`echo $URL | sed 's/.*\.\([a-z0-9]\+\)$/\1/'`" + if [ $STR_MOUNT = "gz" -o $STR_MOUNT = "tgz" -o $STR_MOUNT = "bz2" -o $STR_MOUNT = "zip" ]; then + SOURCE_NAME=`basename $URL` + URL_BASE=`dirname $URL` + else + URL_BASE=$URL + fi + verbose "[[DOWNLOAD FOLDER URL]]=\"$URL_BASE\"" + + if [ $SVN_MOD -eq $off ] && [ $GIT_MOD -eq $off ]; then + # Extension + EXTENSION=`validate_parameter "$EXTENSION" "EXTENSION" "$STR_MOUNT"` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "EXTENSION" + verbose "[[EXTENSION]]=\"$EXTENSION\"" + + # Unpacker + UNPACKER=`validate_parameter "$UNPACKER" "UNPACKER" "tar"` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "UNPACKER" + verbose "[[UNPACKER]]=\"$UNPACKER\"" + + # Unpacker flags + [ "$UNPACKER" == "tar" ] && STR_MOUNT="--no-same-owner --no-same-permissions -xvf" || STR_MOUNT="" + UNPACKER_FLAGS=`validate_parameter "$UNPACKER_FLAGS" "UNPACKER FLAGS" "$STR_MOUNT"` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "UNPACKER FLAGS" + verbose "[[UNPACKER_FLAGS]]=\"$UNPACKER_FLAGS\"" + + # Decompressor program and test flag + DECOMPRESSOR=`validate_parameter "$DECOMPRESSOR" "DECOMPRESSOR" ""` + [ -z $DECOMPRESSOR ] && decompress_find + verbose "[[DECOMPRESSOR]]=\"$DECOMPRESSOR\"" + + DECOMPRESSOR_TEST_FLAG=`validate_parameter "$DECOMPRESSOR_TEST_FLAG" "DECOMPRESSOR TEST FLAG" ""` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "DECOMPRESSOR TEST FLAG" + verbose "[[DECOMPRESSOR TEST FLAG]]=\"$DECOMPRESSOR_TEST_FLAG\"" + fi + + # Build number + BUILD_NUMBER=`validate_parameter "$BUILD_NUMBER" "BUILD NUMBER" "1"` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "BUILD NUMBER" + + # Build archteture + ARCH=`validate_parameter "$ARCH" "ARCH" "i486"` + verbose "[[ARCH]]=\"$ARCH\"" + + # Source name + STR_MOUNT=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\1/'` + SRC_NAME=`validate_parameter "$SRC_NAME" "SOURCE NAME" "$STR_MOUNT"` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "SOURCE NAME" + verbose "[[SOURCE NAME]]=\"$SRC_NAME\"" + + # SOURCE NAME cannot be empty + if [ -z "$SRC_NAME" ]; then + echo "SOURCE NAME is empty." + handle_error $ERROR_MKBUILD_CONSTRUCTION "SOURCE NAME" + fi + + # Package name + STR_MOUNT=$SRC_NAME + PKG_NAME=`validate_parameter "$PKG_NAME" "PACKAGE NAME" "$STR_MOUNT"` + verbose "[[PACKAGE NAME]]=\"$PKG_NAME\"" + + # PACKAGE NAME cannot be empty + if [ -z "$PKG_NAME" ]; then + echo "PACKAGE NAME is empty." + handle_error $ERROR_MKBUILD_CONSTRUCTION "PACKAGE NAME" + fi + + # Version + STR_MOUNT=`echo $SOURCE_NAME | sed -r 's/(.*)-(.*)\.(.*\..*)$/\2/'` + VERSION=`validate_parameter "$VERSION" "VERSION" "$STR_MOUNT"` + if_previous_error handle_error $ERROR_MKBUILD_CONSTRUCTION "VERSION" + verbose "[[VERSION]]=\"$VERSION\"" + + # Source name construction string + CONST_STRING="`validate_parameter "$CONST_STRING" "SOURCE NAME CONSTRUCTION STRING" "\\\$SRC_NAME-\\\$VERSION.tar.$EXTENSION"`" + verbose "[[SOURCE NAME CONSTRUCTION STRING]]=\"$CONST_STRING\"" + + # Build Source Name + [ -z $SOURCE_NAME ] && SOURCE_NAME=`eval "echo $CONST_STRING"` + verbose "SOURCE_NAME=\"$SOURCE_NAME\"" + + # Eval source code name and URL + DIST_SRC_NAME="`eval "echo $CONST_STRING"`" # we need this to strip some escape strings + DIST_SRC_NAME="`eval "echo $DIST_SRC_NAME"`" # twice does the job + DIST_SRC_URL="`eval "echo $URL_BASE"`" # we need this to strip some escape strings + DIST_SRC_URL="`eval "echo $DIST_SRC_URL"`" # twice does the job + DIST_SRC_URL="$DIST_SRC_URL/$DIST_SRC_NAME" + + # Documentations list + DEFAULT_DOCFILES="NEWS TODO README AUTHORS INSTALL ChangeLog MAINTAINERS COPYING LICENSE SIGNATURE readme.*" + DOCFILES=`validate_parameter "$DOCFILES" "DOCUMENTATION FILES" "$DEFAULT_DOCFILES"` + verbose "[[DOCUMENTATION FILES]]=\"$DOCFILES\"" + + # ./configure option + OPTIONS=`validate_parameter "$OPTIONS" "OTHER CONFIGURE ARGS" ""` + verbose "[[OTHER CONFIGURE ARGS]]=\"$OPTIONS\"" + + # PREFIX + PREFIX=`validate_parameter "$PREFIX" "PREFIX" "/usr"` + verbose "[[PREFIX]]=\"$PREFIX\"" + + # Number of jobs + NUMJOBS=`validate_parameter "$NUMJOBS" "NUMBER OF JOBS" ""` + is_number $NUMJOBS && NUMJOBS="-j${NUMJOBS}" + verbose "[[NUMBER OF JOBS]]=\"$NUMJOBS\"" + + # Make slack-required file + SLACK_REQUIRED=`validate_parameter "$SLACK_REQUIRED" "SLACK REQUIRED" ""` + verbose "[[SLACK REQUIRED]]=\"$SLACK_REQUIRED\"" + + # SlackBuild model + MODEL=`validate_parameter "$MODEL" "SLACKBUILD MODEL" "generic.mkSlackBuild"` + verbose "[[SLACKBUILD MODEL]]=\"$MODEL\"" + + # PATCH FILES + PATCH_FILES=`validate_parameter "$PATCH_FILES" "PATCH FILES" ""` + verbose "[[PATCH_FILES]]=\"$PATCH_FILES\"" + + # PATCH URLs + PATCH_URLS=`validate_parameter "$PATCH_URLS" "PATCH URLS" ""` + verbose "[[PATCH_URLS]]=\"$PATCH_URLS\"" + + # Strip the smallest prefix containing num leading slashes from each file name found in the patch file. + NPS_STRIP=`validate_parameter "$NPS_STRIP" "NUMBER OF PREFIX SLASHES TO STRIP" "1"` + verbose "[[NUMBER OF PREFIX SLASHES TO STRIP]]=\"$NPS_STRIP\"" + + # SlackBuild path + # SlackBuild path in mkbuild parameters file + SLACKBUILD=$WORK/${PKG_NAME}.SlackBuild + SLACKBUILD_PATH=`get_slackbuild_path` + verbose "[[SLACKBUILD PATH]]=\"$SLACKBUILD_PATH\"" + +} + +function make_slackbuild { + + #-------------------------------------------------------------- + #- Start build SlackBuild - + #-------------------------------------------------------------- + + # Get mkbuild values + get_mkbuild_values + + verbose -e "\nStart SlackBuild make" + SLACKBUILD_TEMP=$SLACKBUILD.tmp + cp $MODEL_DIR/$MODEL $SLACKBUILD_TEMP + + # Apply mkpatch + verbose -e "\nMkpatch section ..." + apply_mkpatch + + # On/Off sections + verbose -e "\nEnable/disable sections ..." + activate_sections + + # Change sections + verbose -e "\nEdit sections ..." + section_edit + + # Change strings from model + verbose -e "\nChange strings in $PACKAGE.SlackBuild model..." + start_build $SLACKBUILD_TEMP + + # Remove off sections + verbose -e "\nRemove off sections ..." + build_slackbuild + + # Make slack-required file + verbose -e "\nMake slack-required file ..." + make_slack_required + + if [ -e slack-required ]; then + DEPENDENCY_LIST="`cat $WORK/slack-required | awk '{print $1}' | grep '^[a-z]' | tr '\012' ' '`" + edit_file "REQUIRES" "$DEPENDENCY_LIST" $SLACKBUILD + else + edit_file "REQUIRES" " " $SLACKBUILD + fi + + # Others changes + verbose -e "\nEdit other [[]] parameters ..." + change_other_parameters + + if [ "$SIGN_MANIFESTS" -eq $on ]; then + mkbuild_update_keyring + repo_gpg_key $MKBUILDS_DIR + fi + + # Update Manifest file + edit_manifest + + if [ "$?" == "0" ]; then + + # Commit SlackBuild + [ $SUBMIT_SLACKBUILD -eq $on ] && submit_slackbuild + + # Commit mkbuild + [ $SUBMIT_MKBUILD -eq $on ] && submit_mkbuild + fi + +} + +function create_mkbuild { + + # Create a new .mkbuild parameters-file + cp $MODEL_DIR/model.mkbuild $MKBUILD_NAME + + if [ -z "$AUTHOR" ] && [ ! -z "$MKBUILD_AUTHOR" ]; then + AUTHOR="$MKBUILD_AUTHOR" + fi + + if [ -z "$AUTHOR_INITIALS" ] && [ ! -z "$MKBUILD_AUTHOR_INITIALS" ]; then + AUTHOR_INITIALS="$MKBUILD_AUTHOR_INITIALS" + fi + + # Package Author + if [ ! -z "$AUTHOR" ]; then + edit_file "YOUR NAME" "${AUTHOR}" $MKBUILD_NAME + # Package Author Signature + if [ -z "$AUTHOR_INITIALS" ]; then + AUTHOR_INITIALS=`echo $AUTHOR | tr '[A-Z]' '[a-z]' | sed 's/ /\n/g' | sed 's/^\([a-z]\).*/\1/' | sed ':i ; $! N ; s/\n// ; t i'` + fi + edit_file "YOUR SIGNATURE" "${AUTHOR_INITIALS}" $MKBUILD_NAME + fi + + # Change Default SourceForge URL + [ -z "$URL" ] && URL="http://downloads.sourceforge.net/[[PKG NAME]]/" + edit_file "DEFAULT URL" "${URL}" $MKBUILD_NAME + + # Change Package Name + edit_file "PKG NAME" "${MKBUILD_NAME//.mkbuild}" $MKBUILD_NAME + + # Change SlackBuild Path + if [ ! -z "$MKBUILD_PATH" ]; then + edit_file_full "\[\[SLACKBUILD PATH\]\]=.*" "\[\[SLACKBUILD PATH\]\]=\"`regexp_slash $MKBUILD_PATH`\"" $MKBUILD_NAME + fi + + # Print .mkbuild name + echo "$MKBUILD_NAME" + +} + +function search_mkbuild { + + # find a given mkbuild + # usage: search_mkbuild [-i] + + if [ "$MKBUILD_NAME" == ".mkbuild" ]; then + list_mkbuilds + return + fi + + if [ ! -z "$MKBUILD_PATH" ]; then + if echo $name | grep -q -e "\.mkbuild$"; then + if [ -d "$MKBUILDS_DIR/$MKBUILD_PATH" ]; then + find $MKBUILDS_DIR/$MKBUILD_PATH -name $MKBUILD_NAME + else + find $MKBUILDS_DIR -name $MKBUILD_NAME + fi + else + if [ -d "$MKBUILDS_DIR/$MKBUILD_PATH" ]; then + find $MKBUILDS_DIR/$MKBUILD_PATH -name '*.mkbuild' + fi + fi + else + if [ "$1" == "-i" ]; then + # case insensitive mode + find $MKBUILDS_DIR -iname $MKBUILD_NAME + else + find $MKBUILDS_DIR -name $MKBUILD_NAME + fi + fi + +} + +function set_mkbuild_name { + + local name="$1" + + MKBUILD_PATH="" + + if [ ! -z "$name" ]; then + MKBUILD_NAME="`basename $name`" + fi + + if echo $name | grep -q "/"; then + if echo $name | grep -q -e "\.mkbuild$"; then + MKBUILD_NAME="`basename $name`" + MKBUILD_PATH="`dirname $name`" + else + MKBUILD_PATH="$name" + fi + else + MKBUILD_NAME="${name//.mkbuild}.mkbuild" + fi + +} + +function list_mkbuilds { + + # list all available mkbuilds + # usage: list_mkbuilds + + list_builds $MKBUILDS_DIR mkbuild + +} + +function edit_mkbuild { + + # edit a mkbuild + # usage: edit_mkbuild + + if [ -e "$MKBUILD_NAME" ]; then + if [ -z "$EDITOR" ]; then + EDITOR="vi" + fi + $EDITOR $MKBUILD_NAME + else + echo "Not found: $MKBUILD_NAME" + return 1 + fi + +} + +function mkbuild_update_keyring { + + # Update keyring using GPG-KEY from + # mkbuild repository + + update_keyring $MKBUILDS_DIR/GPG-KEY + +} + +function sign_manifest { + + # sign manifest file + # usage: sign_manifest + + if [ "$SIGN_MANIFESTS" -eq $on ]; then + echo "Signing Manifest..." + if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then + su $SIGN_USER -c "gpg $GPG_AGENT_OPTION --clearsign -u $SIGN_KEYID $WORK/Manifest" + mv $WORK/Manifest.asc $WORK/Manifest + else + gpg $GPG_AGENT_OPTION --clearsign -u $SIGN_KEYID $WORK/Manifest + mv $WORK/Manifest.asc $WORK/Manifest + fi + fi + +} + +function check_manifest_signature { + + # check if a manifest signature is valid + # usage: check_manifest_signature + + if [ -e "$WORK/Manifest" ]; then + if grep -q -- "-----BEGIN PGP SIGNED MESSAGE-----" $WORK/Manifest; then + echo "Checking existing Manifest signature..." + mkbuild_update_keyring + if [ ! -z "$SIGN_USER" ] && [ "`whoami`" != "$SIGN_USER" ]; then + su $SIGN_USER -c "gpg --verify $WORK/Manifest" + if [ "$?" != "0" ]; then + return 1 + fi + else + gpg --verify $WORK/Manifest + if [ "$?" != "0" ]; then + return 1 + fi + fi + fi + fi + +} + +function delete_mkbuild { + + # delete content from a mkbuild folder + # usage: delete_mkbuilds [file] + + local folder candidate file="$1" + local name="`basename $MKBUILD_NAME .mkbuild`.mkbuild" + + for candidate in `find $MKBUILDS_DIR -name $name`; do + folder="`dirname $candidate`" + if [ -d "$folder" ]; then + if [ -z "$1" ]; then + # Delete the whole mkbuild folder + svn_del $folder + elif [ -e "$folder/$file" ]; then + svn_del $folder/$file + fi + fi + done + +} + +function delete_slackbuild { + + # delete content from a SlackBuild folder + # usage: delete_slackbuilds [file] + + local folder candidate file="$1" + local name="`basename $MKBUILD_NAME .mkbuild`.SlackBuild" + + for candidate in `find $SLACKBUILDS_DIR -name $name`; do + folder="`dirname $candidate`" + if [ -d "$folder" ]; then + if [ -z "$1" ]; then + # Delete the whole mkbuild folder + svn_del $folder + elif [ -e "$folder/$file" ]; then + svn_del $folder/$file + fi + fi + done + +} + +function list_mkbuild_contents { + + if [ -e "$MKBUILD_NAME" ]; then + ls `dirname $MKBUILD_NAME` + else + echo "Not found: $MKBUILD_NAME" + return 1 + fi + +} + +function working_copy { + + local copy tmpfolder name + + if [ -e "$MKBUILD_NAME" ]; then + name="$(basename $MKBUILD_NAME .mkbuild)" + copy="$(basename $(basename $MKBUILD_NAME .mkbuild))" + if [ -d "$copy" ]; then + tmpfolder="`mktemp $name.XXXXXX`" + mv $copy $tmpfolder/ + fi + rsync -av --exclude=".svn" --exclude=".git" `dirname $MKBUILD_NAME`/ $copy/ &> /dev/null + echo "Working copy for $name set at $(pwd)/$name." + else + echo "Not found: $MKBUILD_NAME" + return 1 + fi + +} + +function get_param { + + # get a parameter from a mkbuild file + # usage: get_param + + local parameter="`echo $* | tr '[:lower:]' '[:upper:] | tr -d '"' | tr -d "'"'`" + + if [ -e "$MKBUILD_NAME" ]; then + grep -e "\[\[$parameter\]\]" $MKBUILD_NAME | cut -d = -f 2 | tr -d '"' | tr -d "'" + fi + +} + +# ---------------------------------------------------------------- + +#============================= +# Main Program +#============================= + +# Common functions +COMMON_SH="/usr/libexec/simplepkg/common.sh" +PROG_VERSION="`echo '$Rev$' | sed -e 's/[^0-9]//g'`" +BASENAME="`basename $0`" +WORK=`pwd` +LANG=en_US +EXIT_CODE=0 + +if [ -f "$COMMON_SH" ]; then + source $COMMON_SH +else + echo $error "$BASENAME: file $COMMON_SH not found. Check your $BASENAME installation" +fi + +# Start constants +set_constants + +# Set submit off +SUBMIT_SLACKBUILD=$off +SUBMIT_MKBUILD=$off +# Set verbose off +VERBOSE=$off +SVN_MOD=$off + +# Load /etc/simplepkg/simplepkg.conf parameters +load_parameters + +# Select color mode: gray, color or none (*) +color_select $COLOR_MODE + +# Auxiliar file +AUX_TMP=/tmp/mkbuild_tmp.$RANDOM +DIFF_FILE=/tmp/mkbuild.diff.$RANDOM +# Derectory to SlackBuild models +MODEL_DIR=${MODEL_DIR:="/etc/simplepkg/defaults/mkbuild"} +# SlackDesk line length +SLACKDESC_LEN=78 + +# Load error codes +error_codes + +[ $# -eq 0 ] && mkbuild_use && exit 1 + +# Configure input parameters +set_parameters "$@" + +verbose -e "$BASENAME version $PROG_VERSION\n" +case $ACTION in + 'update_manifest') + shift + update_manifest $* + ;; + 'commit_slackbuild') + shift 2 + commit_changes $SLACKBUILDS_DIR $MKBUILD_BASENAME: $* + ;; + 'commit_mkbuild') + shift 2 + commit_changes $MKBUILDS_DIR $MKBUILD_BASENAME: $* + ;; + 'commit_all') + shift 2 + commit_changes $SLACKBUILDS_DIR $MKBUILD_BASENAME: $* + commit_changes $MKBUILDS_DIR $MKBUILD_BASENAME: $* + ;; + 'import_slackbuilds') + shift + import_slackbuilds $* + ;; + 'import_mkbuilds') + shift + import_mkbuilds $* + ;; + 'import_all') + shift + import_mkbuilds $* + import_slackbuilds $* + ;; + 'delete_slackbuild') + delete_slackbuild + ;; + 'delete_mkbuild') + delete_mkbuild + ;; + 'delete_all') + delete_mkbuild + delete_slackbuild + ;; + 'new') + create_mkbuild + ;; + 'build') + make_slackbuild + ;; + 'search') + search_mkbuild -i + ;; + 'status') + repository_status + ;; + 'list') + list_mkbuild_contents + ;; + 'edit') + edit_mkbuild + ;; + 'working_copy') + working_copy + ;; + 'get_param') + shift 2 + get_param $* + ;; +esac + +# Clear temporary files +verbose -e "\nRemove temporary files ..." +clear_files +exit $EXIT_CODE diff --git a/tags/0.6rc1/src/mkjail b/tags/0.6rc1/src/mkjail new file mode 100755 index 0000000..4b00c38 --- /dev/null +++ b/tags/0.6rc1/src/mkjail @@ -0,0 +1,115 @@ +#!/bin/bash +# +# mkjail: chroot jail maker +# feedback: rhatto at riseup.net | GPL +# +# Mkjail 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 2 of the License, or any later version. +# +# Mkjail 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# $Rev$ - $Author$ +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your `basename $0` installation" + exit 1 +fi + +function usage { + + echo "usage: [ARCH=arch] [VERSION=version] [ROOT=/otherroot] $BASENAME [template]" + exit 1 + +} + +function exec_post_install_scripts { + + # exec post installation scripts + # usage: exec_post_install_script + + local list + + if [ -z "$2" ]; then + return 1 + fi + + echo "$BASENAME: executing template scripts..." + if [ -d "`template_scripts`" ]; then + for file in `template_scripts`/*; do + if [ -x "$file" ]; then + $file $1 $2 + fi + done + fi + +} + +function jailist_update { + + # update the jail list file + # usage: jailist_update + + if [ "$ADD_TO_JAIL_LIST" == "1" ]; then + touch $JAIL_LIST + if ! grep -q -e "^$1\$" $JAIL_LIST; then + echo $1 >> $JAIL_LIST + fi + fi + +} + +if [ -z "$1" ]; then + usage +else + server="$1" + eval_config $BASENAME -u +fi + +if [ ! -z "$2" ]; then + search_template $2 + result="$?" +else + search_default_template + result="$?" +fi + +if [ "$result" != "0" ]; then + exit 1 +fi + +TEMPLATE="`template_packages`" + +if [ ! -d "$JAIL_ROOT/$server" ]; then + mkdir -p $JAIL_ROOT/$server +else + if [ ! -z "`ls $JAIL_ROOT/$server | grep -v 'lost+found'`" ]; then + echo $BASENAME: error: folder $JAIL_ROOT/$server already exists and seens to be not empty + echo $BASENAME: probably the jail $1 already exists + exit 1 + fi +fi + +echo "Instaling packages into $JAIL_ROOT/$server..." +echo "Using template $TEMPLATE." + +install_packages +copy_template_files $JAIL_ROOT/$server +set_jail_perms $JAIL_ROOT/$server +jailist_update $JAIL_ROOT/$server +exec_post_install_scripts $JAIL_ROOT $server + +echo $BASENAME: done creating $server jail + diff --git a/tags/0.6rc1/src/mkpatch b/tags/0.6rc1/src/mkpatch new file mode 100644 index 0000000..27d2720 --- /dev/null +++ b/tags/0.6rc1/src/mkpatch @@ -0,0 +1,144 @@ +#!/bin/bash +# +# mkpatch: Simple patch program to .mkbuild models +# feedback: rudsonaalves at yahoo.com.br | gpl +# +# mkbuild 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 2 of the License, or any later version. +# +# mkbuild 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# Input: +# - $1 Diff_File +# - #2 Source_File +# +# Version: +PROG_VERSION=1.1 +BASENAME=`basename $0` + +function get_line { + + # get a line $1 from file $2 + [ $# -ne 2 ] && exit $ERROR_PAR_NUMBER + ! is_number $1 && exit $ERROR_NOT_NUMBER + [ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND + + sed "$1 q;d" $2 +} + +function get_diff_line { + + # get diff line e return: + # - Action in Diff_Action + # - Diff Line in Diff_Str_Line + if [ $1 -gt $Diff_N_Lines ]; then + Diff_Action=" " + Diff_Str_Line="" + return 0 + fi + Line=`get_line $1 $2` + Diff_Action=`echo "$Line" | cut -c1` + Diff_Str_Line=`echo "$Line" | cut -c2-` +} + + +# ---------------------------------------------------------------- +# ------------------- mkpatch program ---------------------------- +# common.sh library start +COMMON_SH="/usr/libexec/simplepkg/common.sh" +if [ -f "$COMMON_SH" ]; then + source $COMMON_SH +else + echo $error "$BASENAME: file $COMMON_SH not found. Check your $BASENAME installation" +fi +# Load error codes +error_codes +# ---------------- + +if [ "$1" = "--help" -o "$1" = "-h" ]; then + echo "Use: $BASENAME " + exit $ERROR_HELP +fi + +# Check input parameters +[ $# -ne 2 ] && exit $ERROR_PAR_NUMBER +[ ! -e $1 ] && exit $ERROR_FILE_NOTFOUND +[ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND + +# Start variables +Diff_File=$1 +Source_File=$2 +Diff_N_Lines=`wc -l $1 | cut -f1 -d" "` +Source_N_Lines=`wc -l $2 | cut -f1 -d" "` + +# Start vars +Diff_Line=1 +Diff_Pointer=1 +Status_Diff=0 + +# Get frist Diff_File line +get_diff_line $Diff_Line $Diff_File || exit $? + +Source_Line=1 +# Get frist Source_File line +Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? +while [ $Source_Line -le $Source_N_Lines ]; do + # make Actions + case $Diff_Action in + '-') + if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then + Status_Diff=1 + let Diff_Line++ + else + Diff_Line=$Diff_Pointer + Status_Diff=0 + echo "$Source_Str_Line" + fi + get_diff_line $Diff_Line $Diff_File || exit $? + let Source_Line++ + Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? + ;; + '+') + echo "$Diff_Str_Line" + let Diff_Line++ + get_diff_line $Diff_Line $Diff_File || exit $? + ;; + ' ') + if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then + Status_Diff=1 + let Diff_Line++ + else + Status_Diff=0 + Diff_Line=$Diff_Pointer + fi + echo "$Source_Str_Line" + get_diff_line $Diff_Line $Diff_File || exit $? + let Source_Line++ + Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? + ;; + '=') + let Diff_Line++ + Status_Diff=0 + Diff_Pointer=$Diff_Line + get_diff_line $Diff_Line $Diff_File || exit $? + ;; + *) + echo "Invalid diff action." + exit $ERROR_MKPATCH + ;; + esac +done + +# Make others addline "+" in the end file +while [ "$Diff_Action" = "+" -a $Diff_Line -le $Diff_N_Lines ]; do + echo "$Diff_Str_Line" + let Diff_Line++ + get_diff_line $Diff_Line $Diff_File || exit $? +done diff --git a/tags/0.6rc1/src/rebuildpkg b/tags/0.6rc1/src/rebuildpkg new file mode 100755 index 0000000..6d3d10c --- /dev/null +++ b/tags/0.6rc1/src/rebuildpkg @@ -0,0 +1,87 @@ +#!/bin/bash +# +# rebuildpkg: build a package from a /var/log/packages entry +# +# feedback: rhatto at riseup.net | gpl +# +# Rebuildpkg 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 2 of the License, or any later version. +# +# Rebuildpkg 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +COMMON="/usr/libexec/simplepkg/common.sh" +TMP="/tmp" + +function usage { + echo "usage: ROOT=/otherroot `basename $0` " +} + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your `basename $0` installation" + exit 1 +fi + +if [ -z "$1" ]; then + usage + exit 1 +fi + +pack="$1" + +for file in `ls $ROOT/var/log/packages/$pack*`; do + if [[ "`package_name $file.tgz`" == "$pack" ]]; then + package_file="$file" + break + fi +done + +if [ -z "$package_file" ]; then + echo error: package $pack does not exist + exit 1 +fi + +if [ -d "$TMP/package-$pack" ]; then + rm -rf $TMP/package-$pack +fi + +mkdir $TMP/package-$pack +cd $TMP/package-$pack + +for file in `grep -v -e "^PACKAGE NAME:" -e "^UNCOMPRESSED PACKAGE SIZE:" \ + -e "^COMPRESSED PACKAGE SIZE:" -e "^PACKAGE LOCATION:" \ + -e "^PACKAGE DESCRIPTION:" -e "^$pack:" -e "^FILE LIST:" $package_file`; do + + if [ "$file" != "install" ] && [ "$file" != "install/slack-desc" ] && [ "$file" != "install/doinst,sh" ]; then + if [ -d /$file ]; then + mkdir -p $TMP/package-$pack/$file + elif [ -f /$file ]; then + cp /$file $TMP/package-$pack/$file + else + echo file /$file was not found, please add it manually, exploding and making the package again + fi + fi + +done + +mkdir $TMP/package-$pack/install +grep "^$pack:" $package_file > $TMP/package-$pack/install/slack-desc + +package_name="`grep "PACKAGE NAME:" $package_file | awk '{ print $3 }'`" + +if [ -f "$ROOT/var/log/scripts/$package_name" ]; then + cp $ROOT/var/log/scripts/$package_name $TMP/package-$pack/install/doinst.sh +fi + +makepkg $package_name.tgz +mv $package_name.tgz $TMP/ +echo "done: package rebuilt and stored at $TMP/$package_name.tgz" diff --git a/tags/0.6rc1/src/simplaret b/tags/0.6rc1/src/simplaret new file mode 100755 index 0000000..04281f2 --- /dev/null +++ b/tags/0.6rc1/src/simplaret @@ -0,0 +1,1185 @@ +#!/bin/bash +# +# simplaret: simplepkg's retrieval tool +# feedback: rhatto at riseup.net | gpl +# +# Simplaret 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 2 of the License, or any later version. +# +# Simplaret 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# $Rev$ - $Author$ +# + +BASENAME="`basename $0`" +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +if [ -f "$HOME/.simplepkg/repos.conf" ]; then + REPOS_CONF="$HOME/.simplepkg/repos.conf" +elif [ -f "/etc/simplepkg/repos.conf" ]; then + REPOS_CONF="/etc/simplepkg/repos.conf" +else + REPOS_CONF="/etc/simplepkg/defaults/repos.conf" +fi + +function simplaret_usage { + + echo "usage: [ARCH=otherarch] [VERSION=otherversion] $BASENAME [OPTION] package-name" + echo -e "\t OPTIONS: --help, --install, --update (or --sync), --upgrade, --search, --get, --get-patches, --purge, --remove" + exit 1 + +} + +function simplaret_get_index { + + for file in `simplaret_metafiles`; do + simplaret_download $1 $file $2 --no-verbose + done + +} + +function simplaret_backup_index { + + for file in `simplaret_metafiles`; do + if [ -f "$1/$file" ]; then + mv $1/$file $1/$file.old + fi + done + +} + +function simplaret_check_index { + + for file in `simplaret_metafiles`; do + if [ ! -f "$1/$file" ] && [ -f "$1/$file.old" ]; then + echo Restoring old $file to $1... + mv $1/$file.old $1/$file + else + rm -f $1/$file.old + fi + done + +} + +function simplaret_import_gpg_keys { + + if [ "$SIGNATURE_CHECKING" == "$on" ]; then + check_gnupg + if [ -f "$1/GPG-KEY" ] && [ -f "$1/GPG-KEY.old" ]; then + if ! diff $1/GPG-KEY $1/GPG-KEY.old &> /dev/null; then + gpg --import < $1/GPG-KEY + fi + elif [ -f "$1/GPG-KEY" ]; then + gpg --import < $1/GPG-KEY + fi + fi + +} + +function simplaret_download { + + # download a file from a repo to a folder + # usage: simplaret [--no-verbose] + + local protocol file + local wget_timeout wget_passive_ftp wget_verbose + local curl_timeout curl_passive_ftp curl_verbose + local ncftpget_timeout ncftpget_passive_ftp + + protocol="`echo $1 | cut -d : -f 1 | tr '[:upper:]' '[:lower:]'`" + file="`basename $2`" + + if [ ! -d "$3" ]; then + mkdir -p $3 + fi + + if [ ! -z "$CONNECT_TIMEOUT" ] || [ "$CONNECT_TIMEOUT" != "0" ]; then + wget_timeout="--timeout $CONNECT_TIMEOUT" + ncftpget_timeout="-t $CONNECT_TIMEOUT" + curl_timeout="--connect-timeout $CONNECT_TIMEOUT" + fi + + if [ "$4" == "--no-verbose" ]; then + wget_verbose="--no-verbose" + curl_verbose="-#" + echo "" + fi + + if [ "$protocol" == "http" ] || [ "$protocol" == "https" ]; then + + echo Getting $1/$2: + if [ "$HTTP_TOOL" == "wget" ]; then + wget $wget_timeout $wget_verbose $1/$2 -O $3/$file + elif [ "$HTTP_TOOL" == "curl" ]; then + curl $curl_timeout $curl_verbose $1/$2 > $3/$file + else + echo $BASENAME: error: invalid value for config variable HTTP_TOOL: $HTTP_TOOL + echo $BASENAME: please check your config file $CONF + exit 1 + fi + + elif [ "$protocol" == "ftp" ]; then + echo Getting $1/$2: + + if [ "$PASSIVE_FTP" == "1" ]; then + wget_passive_ftp="--passive-ftp" + ncftpget_passive_ftp="-F" + curl_passive_ftp="--ftp-pasv" + fi + + if [ "$FTP_TOOL" == "ncftpget" ]; then + ncftpget -c $ncftpget_timeout $ncftpget_passive_ftp $1/$2 > $3/$file + elif [ "$FTP_TOOL" == "wget" ]; then + wget $wget_timeout $wget_passive_ftp $wget_verbose $1/$2 -O $3/$file + elif [ "$FTP_TOOL" == "curl" ]; then + curl $curl_timeout $curl_passive_ftp $curl_verbose $1/$2 > $3/$file + else + echo $BASENAME: error: invalid value for config variable FTP_TOOL: $FTP_TOOL + echo $BASENAME: please check your config file $CONF + exit 1 + fi + + elif [ "$protocol" == "file" ]; then + + url="`echo $1 | sed -e 's/file:\/\///'`" + if [ -f "$3/$file" ]; then + rm -f $3/$file + fi + echo -n "Copying $url/$2..." + if [ -f "$url/$2" ]; then + cp $url/$2 $3/$file 2> /dev/null + fi + if [ -f "$3/$file" ]; then + echo " done." + else + echo " failed." + fi + + else + + echo $BASENAME error: invalid protocol $protocol + + fi + +} + +function simplaret_repository { + + # return repository definitions from $REPOS_CONF file + # usage: simplaret_repository [root|repos|noarch|patches] + + local definition + + if [ -z "$1" ]; then + definition="ROOT" + else + definition="`echo $1 | tr '[:lower:]' '[:upper:]'`" + fi + + if [ "$definition" == "REPOS" ] || [ "$definition" == "PATCHES" ]; then + definition="$definition-$ARCH-$VERSION" + elif [ "$definition" == "ROOT" ]; then + definition="$definition-$ARCH" + fi + + grep -e "^$definition=" $REPOS_CONF | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | cut -d "#" -f 1 + +} + +function simplaret_repository_name { + + # return a repository name according the value of $repository + + if [ -z "$repository" ]; then + false + elif echo $repository | grep -qe %; then + repository_name="`echo $repository | cut -d % -f 1`" + if [ -z "$repository_name" ]; then + echo $BASENAME: you should set a name for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + else + echo $BASENAME: you should set a name for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + +} + +function simplaret_repository_url { + + # return a repository url according the value of $repository + + if echo $repository | grep -qe %; then + repository_url="`echo $repository | cut -d % -f 2`" + if [ -z "$repository_url" ]; then + echo $BASENAME: you should set a url for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + else + echo $BASENAME: you should set a url for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + + if [ "$repos_type" == "root" ]; then + simplaret_set_arch + repository_url="$repository_url/`basename $repository_url`-$VERSION/" + fi + +} + +function simplaret_set_storage_folder { + + storage="$STORAGE/$ARCH/$VERSION/$repos_type" + if [ "$repos_type" == "noarch" ]; then + storage="$STORAGE/noarch" + elif [ "$repos_type" == "patches" ]; then + storage="$PATCHES_DIR/$ARCH/$VERSION" + fi + +} + +function simplaret_update { + + local storage + + echo Updating package information for arch $ARCH and version $VERSION... + + for repos_type in patches root repos noarch; do + + simplaret_set_storage_folder + + for repository in `simplaret_repository $repos_type`; do + + simplaret_repository_name + simplaret_repository_url + + if [ ! -d "$storage/$repository_name" ]; then + mkdir -p $storage/$repository_name + else + simplaret_backup_index $storage/$repository_name + fi + + simplaret_get_index $repository_url $storage/$repository_name + simplaret_import_gpg_keys $storage/$repository_name + simplaret_check_index $storage/$repository_name + + unset repository_name repository_url repository_protocol + + done + done + +} + +function simplaret_find_package { + + # grep packages in a repository's file list + # usage: simplaret_find_package + + if [ "$1" == "-all" ]; then + grep -e ".tgz$" $2/`simplaret_filelist` | awk '{ print $8 }' + else + grep $1 $2/`simplaret_filelist` | awk '{ print $8 }' | grep -e ".tgz$" + fi + +} + +function simplaret_show_package { + + # print a package result + # usage: simplaret_show_package [--basename-only|--filename-only|--formatted] + + if [ "$2" == "--basename-only" ]; then + echo `basename $1` + elif [ "$2" == "--filename-only" ]; then + echo $1 + elif [ "$2" == "--formatted" ]; then + echo $1,$repos_type,$repository + else + if echo $1 | grep -q "/patches/"; then + patch="(patch)" + fi + if [ "$repos_type" == "noarch" ]; then + echo $name repository $repository_name: `basename $1` $patch + else + echo $name repository $repository_name, arch: $ARCH, version: $VERSION: `basename $1` $patch + fi + fi + unset patch + +} + +function simplaret_filelist { + + if [ "$repos_type" == "patches" ]; then + echo FILE_LIST + else + echo FILELIST.TXT + fi + +} + +function simplaret_metafiles { + + if [ "$SIGNATURE_CHECKING" == "$on" ]; then + echo `simplaret_filelist` CHECKSUMS.md5 GPG-KEY + else + echo `simplaret_filelist` CHECKSUMS.md5 + fi + +} + +function simplaret_search { + + # search packages + # usage: simplaret_search [package-name] [-display_mode] + # display_mode can be any accepted by simplaret_show_package + + local priority priority_match message pattern mode + + if [ ! -z "$1" ] && ! echo $1 | grep -q -e "^-"; then + pattern="$1" + mode="$2" + else + pattern="-all" + mode="$1" + fi + + for repos_type in patches root repos noarch; do + + name="`echo $repos_type | tr '[:lower:]' '[:upper:]'`" + simplaret_set_storage_folder + + for repository in `simplaret_repository $repos_type`; do + + simplaret_repository_name + + if [ ! -f "$storage/$repository_name/`simplaret_filelist`" ]; then + if [ "$WARNING" != "0" ] || [ ! -z "$SILENT" ]; then + if [ "$repos_type" == "noarch" ]; then + message="" + else + message="on arch $ARCH version $VERSION" + fi + echo warning: no file list for $repository_name repository $repository_name $message + echo please do a simplaret --update + fi + else + + if [ "$repos_type" == "root" ]; then + # root repositories has ROOT_PRIORITY + for priority in $ROOT_PRIORITY; do + for file in `simplaret_find_package $pattern $storage/$repository_name | grep "/$priority/"`; do + simplaret_show_package $file $mode + done + priority_match="$priority_match|/$priority/" + done + # now we should return all matches that are not part of ROOT_PRIORITY + priority_match="`echo $priority_match | sed -e 's/^|//'`" + for file in `simplaret_find_package $pattern $storage/$repository_name | grep -E -v $priority_match`; do + simplaret_show_package $file $mode + done + priority_match="" + elif [ "$repos_type" == "repos" ]; then + # repos repositories has REPOS_PRIORITY + for priority in $REPOS_PRIORITY; do + for file in `simplaret_find_package $pattern $storage/$repository_name | grep "/$priority/"`; do + simplaret_show_package $file $mode + done + priority_match="$priority_match|/$priority/" + done + # now we should return all matches that are not part of REPOS_PRIORITY + priority_match="`echo $priority_match | sed -e 's/^|//'`" + for file in `simplaret_find_package $pattern $storage/$repository_name | grep -E -v $priority_match`; do + simplaret_show_package $file $mode + done + priority_match="" + else + for file in `simplaret_find_package $pattern $storage/$repository_name`; do + simplaret_show_package $file $mode + done + fi + + fi + + done + done + +} + +function simplaret_purge { + + # purge simplaret package cache + # usage: simplaret_purge [-w N] + + local mtime mtime_message which and_patches + + if [ "$1" == "-w" ] && [ ! -z "$2" ]; then + mtime="-mtime +`echo "$2*7" | bc -l`" + mtime_message="older than $2 weeks" + elif [ "$SIMPLARET_PURGE_WEEKS" != "0" ]; then + mtime="-mtime +`echo "$SIMPLARET_PURGE_WEEKS*7" | bc -l`" + mtime_message="older than $SIMPLARET_PURGE_WEEKS weeks" + else + mtime="" + mtime_mesage="" + fi + + which="root repos noarch" + and_patches="" + + if [ "$SIMPLARET_PURGE_PATCHES" == "1" ]; then + which="patches $which" + and_patches="including patches" + fi + + if [ -z "$SILENT" ]; then + if [ -z "$mtime_message" ]; then + echo "$BASENAME: purging all packages for:" + else + echo "$BASENAME: purging all packages $mtime_message for:" + fi + echo -e "\t- Arch $ARCH and version $VERSION $and_patches" + echo -e "\t- Noarch folder" + fi + + for repos_type in $which; do + + simplaret_set_storage_folder + + for file in `find $storage/ $mtime 2> /dev/null`; do + for extension in tgz asc meta txt slack-required; do + if echo $file | grep -qe ".$extension$"; then + rm $file + fi + done + done + + done + + if [ -z "$SILENT" ]; then + echo $BASENAME: done purging simplaret cache + echo $BASENAME: please run $BASENAME --update to retrieve new package listings on this arch and version + fi + +} + +function simplaret_search_and_delete { + + # search and delete packages + # usage: simplaret_search_and_delete [--silent] + + local file candidate place basename name version build + local name_version name_build + + name="`package_name $1`" + + if [ "$name" != "$1" ]; then + # searching by full package filename + name_version="`package_version $1`" + name_build="`package_build $1`" + + # search wheter the package filename is in the repositories + if [ "`simplaret_search $1 | grep $1 | wc -l`" == "0" ]; then + echo "Error: package not found: $1" + return 1 + fi + + for file in `find $2/ -name $name*tgz 2> /dev/null`; do + candidate="`basename $file`" + version="`package_version $candidate`" + build="`package_build $candidate`" + if [ "`package_name $candidate`" == "$name" ]; then + + if [ "$name_version" == "$version" ] && \ + [ "$name_build" == "$build" ]; then + LAST_DOWNLOADED_PACKAGE="$file" + if [ "$3" != "--silent" ]; then + echo Package $candidate already downloaded + # echo Package $candidate stored at `dirname $file` + else + true + # echo $file + fi + return 1 + else + place="`dirname $file`" + basename="`basename $file tgz`" + rm -f $file + rm -f $place/$candidate.slack-required + rm -f $file.asc $place/$basename.meta $place/$basename.txt + break + fi + + fi + done + + else + + for file in `find $2/ -name $name*tgz 2> /dev/null`; do + candidate="`basename $file`" + version="`package_version $candidate`" + build="`package_build $candidate`" + if [ "`package_name $candidate`" == "$name" ]; then + # check if has the same version and build number, otherwise erase the old one + for result in `simplaret_search $(package_name $candidate) --basename-only`; do + if [ "`package_name $candidate`" == "`package_name $result`" ]; then + + if [ "$version" == "`package_version $result`" ] && \ + [ "$build" == "`package_build $result`" ]; then + LAST_DOWNLOADED_PACKAGE="$file" + if [ "$3" != "--silent" ]; then + echo Package $candidate already downloaded + # echo Package $candidate stored at `dirname $file` + else + true + # echo $file + fi + return 1 + else + place="`dirname $file`" + basename="`basename $file tgz`" + rm -f $file + rm -f $place/$candidate.slack-required + rm -f $file.asc $place/$basename.meta $place/$basename.txt + break + fi + + fi + done + fi + done + + fi + +} + +function simplaret_get { + + # get a package + # usage: simplaret_get [--silent] + + local silent generate_patches search search_results + local name version build + + # prevent user to stay in $storage + cd + + name="`package_name $1`" + + if [ "$name" != "$1" ]; then + # simplaret_get was called with the package file + # name and not with just the package name + version="`package_version $1`" + build="`package_build $1`" + else + version="" + build="" + fi + + # first search for an already downloaded package + for repos_type in patches root repos noarch; do + + simplaret_set_storage_folder + simplaret_search_and_delete $1 $storage $2 + + if [ "$?" == "1" ]; then + return 0 + fi + + done + + # then search for the package in the repositories + search="`simplaret_search $1 --formatted`" + search_results="`echo "$search" | wc -l`" + + for result in $search; do + + # remaining search results + let search_results-- + + file="`echo $result | cut -d , -f 1`" + repos_type="`echo $result | cut -d , -f 2`" + repository="`echo $result | cut -d , -f 3`" + + simplaret_set_storage_folder + simplaret_repository_name + + candidate="`basename $file`" + if [ "`package_name $candidate`" == "$name" ]; then + + if [ ! -z "$build" ] && [ ! -z "$version" ]; then + # simplaret_get was called with the package file + # name and not with just the package name + if [ "$version" != "`package_version $candidate`" ] && \ + [ "$build" != "`package_build $candidate`" ]; then + # the package version and/or build doesnt matched + # the desired one + continue + fi + fi + + simplaret_repository_url + + # if repos_type == root, the package is a patch and + # STORE_ROOT_PATCHES_ON_PATCHES_DIR config parameter is enabled, then + # save it on $PATCHES_DIR/root-$repository_name, so all patches + # are placed in the same tree + if [ "$repos_type" == "root" ] && \ + [ "$STORE_ROOT_PATCHES_ON_PATCHES_DIR" == "1" ] && echo $file | grep -q "patches"; then + folder="$PATCHES_DIR/$ARCH/$VERSION/root-$repository_name" + generate_patches="1" + else + folder="$storage/$repository_name" + fi + + # download the package + simplaret_download $repository_url $file $folder + + if [ -f "$folder/$candidate.asc" ]; then + rm $folder/$candidate.asc + fi + + if [ -f "$folder/$name.slack-required" ]; then + rm $folder/$name.slack-required + fi + + # download the signature, if exist + if simplaret_check_url $repository_url/$file.asc; then + simplaret_download $repository_url $file.asc $folder + fi + + # download slack-required, if exist + if simplaret_check_url $repository_url/`dirname $file`/$name.slack-required; then + simplaret_download $repository_url `dirname $file`/$name.slack-required $folder + fi + + if [ ! -f "$folder/$candidate" ]; then + LAST_DOWNLOADED_PACKAGE="0" + if [ "$2" != "--silent" ]; then + echo Error downloading $candidate from $repos_type repository $repository_url, please check your settings + fi + # check if there's also more repositories to try + if [ "$SIMPLARET_DOWNLOAD_FROM_NEXT_REPO" != "1" ]; then + return 1 + else + if [ "$2" != "--silent" ]; then + echo Trying to fetch $candidate from the next repository... + fi + if (($search_results <= 0)); then + return 1 + fi + fi + else + LAST_DOWNLOADED_PACKAGE="$folder/$candidate" + if [ "$2" != "--silent" ]; then + silent="" + echo Package $candidate stored at $folder + else + # echo $folder/$candidate + silent="--silent" + fi + if [ "$SIGNATURE_CHECKING" == "$on" ]; then + if [ -f "$folder/$candidate.asc" ]; then + gpg --verify $folder/$candidate.asc $folder/$candidate + if [ "$?" != "0" ]; then + echo "Package signature does not match. Removing package." + rm -f $folder/$candidate.asc $folder/$candidate + LAST_DOWNLOADED_PACKAGE="" + return 1 + fi + else + echo "Missing signature. Removing package." + rm -f $folder/$candidate.asc $folder/$candidate + LAST_DOWNLOADED_PACKAGE="" + return 1 + fi + fi + # generate the patches FILE_LIST and PACKAGES.TXT if needed + if [ "$generate_patches" == "1" ]; then + gen_patches_filelist $folder + gen_packages_txt $folder + gen_md5_checksums $folder + fi + simplaret_checksum $storage/$repository_name/CHECKSUMS.md5 $folder/$candidate $silent + return $? + fi + + fi + + done + +} + +function simplaret_search_and_process_patch { + + local package_version package_build installed_version pack + local installed_build repos_type get is_patch package_match + + # get just the file and package name + sugested_filename="`echo $sugested | cut -d , -f 1`" + sugested_pack="`package_name $sugested_filename`" + + # search if its installed in the jail + if grep -q -e "^$sugested_pack$" $PACKAGES_TMP; then + + # get the repository type + repos_type="`echo $sugested | cut -d , -f 2`" + + if echo $sugested | grep -q "patches"; then + is_patch="yes" + else + is_patch="no" + fi + + # now split the file name into pieces + package_version="`package_version $sugested_filename`" + package_build="`package_build $sugested_filename`" + + # check if the patch was already downloaded + if echo "$DOWNLOADED_PATCHES" | grep -q " $ARCH:$VERSION:$sugested_pack "; then + #if [ "$IS_UPGRADE" != "1" ]; then + #echo Package $sugested_pack already downloaded + #echo "Jail $root needs package $sugested_pack (already downloaded, skipping)" + return + #fi + fi + + pack="`echo $sugested_pack | sed -e 's/\+/\\\+/'`" + installed="`check_installed $pack $root`" + installed_version="`package_version $installed.tgz`" + installed_build="`package_build $installed.tgz`" + + get="no" + + # if needed, download the patch + if [ "$repos_type" == "patches" ]; then + + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + elif [ "$DOWNLOAD_EVEN_APPLIED_PATCHES" == "1" ]; then + get="yes" + fi + + elif [ "$repos_type" == "root" ] && [ "$is_patch" == "yes" ]; then + + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + elif [ "$DOWNLOAD_EVEN_APPLIED_PATCHES" == "1" ]; then + get="yes" + fi + + else + # here, we're dealing with repositories other than ROOT and REPOS, + # so we need to check if either version or build number are different, + # otherwise all installed packages would be downloaded + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + fi + fi + + # finally, get the package + if [ "$get" == "yes" ]; then + if [ "$IS_UPGRADE" == "1" ]; then + if [ "$package_match" == "no" ]; then + simplaret_install $sugested_pack + else + simplaret_get $sugested_pack + fi + else + simplaret_get $sugested_pack + fi + if [ "$?" == "0" ]; then + DOWNLOADED_PATCHES="$DOWNLOADED_PATCHES $ARCH:$VERSION:$sugested_pack " # the ending space is important + fi + fi + + fi + + unset get + +} + +function simplaret_get_jail_patches { + + # get patches from a jail + # usage: simplaret_get_jail_patches + + local oldarch oldversion + + if [ ! -z "$1" ]; then + root="$1" + else + root="/" + fi + + # save current arch and version + oldarch="$ARCH" + oldversion="$VERSION" + + ARCH="`default_arch $root`" + VERSION="`default_version $root`" + + # in case there's something wrong with the jail, abort + if [ -z "$VERSION" ] || [ -z "$ARCH" ]; then + return + fi + + # we need to do that for each arch/version pairs, but just once for each pair + if ! echo "$DISTRO_UPDATED" | grep -q " $ARCH:$VERSION "; then + simplaret_update + DISTRO_UPDATED="$DISTRO_UPDATED $ARCH:$VERSION " # the ending space is important + echo "" + fi + + # installed packages at $root + PACKAGES_TMP=/tmp/simplaret_packages.$RANDOM + rm -f $PACKAGES_TMP ; touch $PACKAGES_TMP ; chmod 600 $PACKAGES_TMP + ls -1 $root/var/log/packages/ | sed -e 's/-[^-]*-[^-]*-[^-]*$//' > $PACKAGES_TMP + + echo Fetching patches for arch $ARCH and version $VERSION for jail $root + + # list all available patches from PATCHES and ROOT repositories + for sugested in `simplaret_search --formatted | grep patches | grep -v ",repos," | grep -v ",noarch,"`; do + simplaret_search_and_process_patch + done + + # grab patches from every other places + if [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" == "1" ]; then + + for sugested in `simplaret_search --formatted | grep patches | grep ",repos," | grep ",noarch,"`; do + simplaret_search_and_process_patch + done + + for sugested in `simplaret_search --formatted | grep -v patches`; do + simplaret_search_and_process_patch + done + + fi + + rm $PACKAGES_TMP + + # restore arch and version + ARCH="$oldarch" + VERSION="$oldversion" + +} + +function simplaret_get_patches { + + local jailpath + + if [ "$1" == "--upgrade" ]; then + IS_UPGRADE="1" + fi + + if [ ! -z "$ROOT" ]; then + simplaret_get_jail_patches $ROOT + return $? + fi + + # first get patches from the root system + simplaret_get_jail_patches + + # then get the needed patches for each installed jail + if [ -s "$JAIL_LIST" ]; then + for jailpath in `cat $JAIL_LIST`; do + if [ -d "$jailpath/var/log/packages" ]; then + ROOT="$jailpath" + simplaret_get_jail_patches $jailpath + fi + done + fi + + ROOT="" + +} + +function simplaret_checksum { + + # simplaret_checksum [--silent] + + if [ ! -f "$1" ] || [ ! -f "$2" ]; then + if [ "$3" != "--silent" ]; then + echo Checksum error: file not found + fi + return 1 + fi + + pack="`basename $2`" + checksum="`grep -e "$pack\$" $1 | awk '{ print $1 }'`" + + if [ -z "$checksum" ]; then + echo file $2 not in checksum $1 + return 1 + elif [ "$checksum" != "`md5sum $2 | awk '{ print $1 }'`" ]; then + if [ "$3" != "--silent" ]; then + echo Checksum mismatch for file `basename $file` + fi + return 1 + else + if [ "$3" != "--silent" ]; then + echo Checksum ok for file `basename $file` + fi + return 0 + fi + +} + +function simplaret_install { + + # download and install a package + # usage: simplaret_install ... [--skip-checks] + + local package root jail_arch jail_version slack_required dep dependency tmp + local name version build + + for package in $*; do + + if [ "$package" == "--skip-checks" ]; then + continue + fi + + name="`package_name $package`" + + root="/$ROOT" + mkdir -p $root/var/log/setup/tmp + + if [ "`echo $package | sed -e 's/\(..\).*/\1/g'`" == "--" ]; then + echo $BASENAME: install: syntax error: expected package name + return 1 + fi + + # now we check if ARCH and VERSION from the + # repository are the same of the jail + if ! echo $* | grep -q -- "--skip-checks"; then + jail_arch="`default_arch $root`" + jail_version="`default_version $root`" + if [ "$ARCH" != "$jail_arch" ]; then + echo "$BASENAME: requested repository arch ($ARCH) doesn't match jail arch ($jail_arch)" + echo "$BASENAME: please use \"$BASENAME --get $package --skip-checks\" to ignore this warning and install anyway" + return + elif [ "$VERSION" != "$jail_version" ]; then + echo "$BASENAME: requested repository version ($VERSION) doesn't match jail version ($jail_version)" + echo "$BASENAME: please use \"$BASENAME --get $package --skip-checks\" to ignore this warning and install anyway" + return 1 + fi + fi + + # package="`simplaret_get $package --silent`" + simplaret_get $package --silent + package="$LAST_DOWNLOADED_PACKAGE" + + if [ "$package" != "0" ] && [ ! -z "$package" ]; then + slack_required="`dirname $package`/$name.slack-required" + if [ -f "$package" ]; then + + if [ -f "$slack_required" ] && [ "$DEPENDENCY_CHECKING" == "1" ]; then + # TODO: check dependency versions + # this routine checks for dependencies in package's slack-required + # procedure adapted from createpkg script + ( grep -v '^#' $slack_required | awk '{ print $1 }' | while read dep; do + if [ ! -z "$dep" ]; then + dependency="`echo $dep | awk '{ print $package }'`" + simplaret_solve_dep $name $dependency $root + fi + true + done ) + fi + + ROOT=$root upgradepkg --install-new $package + LAST_DOWNLOADED_PACKAGE="0" + + else + echo "Error: could not install package $package: file not found" + LAST_DOWNLOADED_PACKAGE="0" + return 1 + fi + else + echo "Error: could not install package $package" + LAST_DOWNLOADED_PACKAGE="0" + return 1 + fi + + done + +} + +function simplaret_set_arch { + + # set correct value for ARCH + + local repos_type new_arch + + # any arch defined in ARCH_i486 that hasn't an entry + # on $REPOS_CONF will be mapped to i486 + + ARCH_i486=" nocona prescott pentium4m pentium4 pentium-m pentium3m pentium3 " + ARCH_i486="$ARCH_i486 pentium2 i686 pentium-pro i586 pentium-mmx pentium i486 " + ARCH_i486="$ARCH_i486 athlon-mp athlon-xp athlon4 athlon-tbird athlon k6 k6-2 " + ARCH_i486="$ARCH_i486 k6-3 winchip-c6 winchip2 c3 c3-2 " + + # any arch defined in ARCH_x86_64 that hasn't an entry + # on $REPOS_CONF will be mapped to x86_64 + + ARCH_x86_64=" k8 opteron athlon64 athlon-fx x86_64 " + + for repos_type in patches root repos noarch; do + if [ -z "`simplaret_repository $repos_type`" ]; then + # there's no repository definition for that arch + if echo "$ARCH_i486" | grep -q " $ARCH "; then + new_arch="i486" + elif echo "$ARCH_x86_64" | grep -q " $ARCH "; then + new_arch="x86_64" + else + echo "$BASENAME: error: no repository definition for arch $ARCH" + echo "$BASENAME: please check your $CONF and $REPOS_CONF config files" + exit 1 + fi + else + return + fi + done + + echo "$BASENAME: changing arch from $ARCH to $new_arch" + + ARCH="$new_arch" + +} + +function simplaret_check_url { + + # check if a given url exist, use just with small files + # usage: simplaret_check_url + + if [ -z "$1" ]; then + return 1 + fi + + if echo $1 | grep -q -e "^file:///"; then + url="`echo $1 | sed -e 's/file:\/\///'`" + if [ -e "$url" ]; then + return 0 + else + return 1 + fi + fi + + if [ ! -z "$CONNECT_TIMEOUT" ] || [ "$CONNECT_TIMEOUT" != "0" ]; then + curl_timeout="--connect-timeout $CONNECT_TIMEOUT" + fi + + if [ "`curl $curl_timeout -I $1 2> /dev/null | head -n 1 | awk '{ print $2 }'`" == "200" ]; then + # server gave a 200 response, so the url exist + return 0 + else + # the url is missing + return 1 + fi + +} + +function simplaret_solve_dep { + + # solve dependency for a package + # this function was adapted from createpkg script + # usage: simplaret_solve_dep [root-folder] + + local installed check exit_code + + local package="$1" + local pack="$2" + local root="/$3" + + pack="`echo $pack| sed -e 's/\+/\\\+/'`" + installed="`check_installed $pack $root`" + check=$? + + if [ -z "$installed" ]; then + if [ $check -ne 0 ]; then + echo "$BASENAME: processing $1 dependency $pack" + # simplaret_install $pack + SIMPLARET_CHILD=$SIMPLARET_CHILD ROOT=$root ARCH=$ARCH VERSION=$VERSION \ + simplaret --install $pack + fi + fi + +} + +function simplaret_remove { + + # remove packages + # usage: simplaret_remove [ ... ] + + for package in $*; do + ROOT=/$ROOT removepkg $package + done + +} + +function simplaret_req_arg { + + # requires arg + + if [ -z "$1" ]; then + simplaret_usage; + fi + +} + +if [ -z "$1" ]; then + simplaret_usage + exit 1 +else + eval_config $BASENAME + set_constants +fi + +# This is used to show how many children process we have +if [ -z "$SIMPLARET_CHILD" ]; then + SIMPLARET_CHILD="1" +else + let SIMPLARET_CHILD++ +fi + +BASENAME="`basename $0`[$SIMPLARET_CHILD]" + +case $1 in + "--update" | "update" | "--sync" | "sync" ) simplaret_update ;; + "--upgrade" | "upgrade") simplaret_get_patches --upgrade ;; + "--get-patches" | "get-patches") simplaret_get_patches ;; + "--search" | "search") shift ; simplaret_req_arg $1 ; simplaret_search $* ;; + "--get" | "get") shift ; simplaret_req_arg $1 ; simplaret_get $* ;; + "--purge" | "purge") shift ; simplaret_purge $* ;; + "--install" | "install") shift ; simplaret_req_arg $1 ; simplaret_install $* ;; + "--remove" | "remove") shift ; simplaret_req_arg $1 ; simplaret_remove $* ;; + "--help" | "help") simplaret_usage ;; + *) + if echo $1 | grep -q -v '^--'; then + simplaret_install $* + else + simplaret_usage + fi + ;; +esac + diff --git a/tags/0.6rc1/src/simpletrack b/tags/0.6rc1/src/simpletrack new file mode 100755 index 0000000..c643a89 --- /dev/null +++ b/tags/0.6rc1/src/simpletrack @@ -0,0 +1,66 @@ +#!/bin/bash +# +# simpletrack $Id$: slacktrack/altertrack wrapper from simplepkg suite +# feedback: rhatto at riseup.net | gpl +# +# Simpletrack 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 2 of the License, or any later version. +# +# Simpletrack 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# + +PRIORITY=${SLACKTRACK_PRIORITY:=slacktrack-real slacktrack altertrack} +BASENAME="`basename $0`" + +function slacktrack { + + $1 -b $REPOS -x $TMP,$SRC_DIR,/dev -jefkzp "$PACKAGE-$VERSION-$ARCH-$BUILD.tgz" "./$2" + +} + +function slacktrack-real { + + $1 -b $REPOS -x $TMP,$SRC_DIR,/dev -jefkzp "$PACKAGE-$VERSION-$ARCH-$BUILD.tgz" "./$2" + +} + +function altertrack { + + $1 -b $REPOS -x $TMP,$SRC_DIR,/dev -jefkzp "$PACKAGE-$VERSION-$ARCH-$BUILD.tgz" "./$2" + +} + +# ----------------------------------------------------- +# main +# ----------------------------------------------------- + +if [ -z "$1" ]; then + echo "usage: $BASENAME [options] " + exit 1 +elif [ ! -f "$1" ]; then + echo "$1: file not found" + exit 1 +fi + +for tracker in $PRIORITY; do + path="`which $tracker 2> /dev/null`" + found="$?" + if [ "$found" == "0" ]; then + echo $BASENAME: using $tracker... + $tracker $path $* + break + fi +done + +if [ "$found" != "0" ]; then + echo "Can't find any suitable tracker among $PRIORITY" + echo "Does slacktrack package is installed in your system?" + exit 1 +fi diff --git a/tags/0.6rc1/src/templatepkg b/tags/0.6rc1/src/templatepkg new file mode 100755 index 0000000..2d1ada2 --- /dev/null +++ b/tags/0.6rc1/src/templatepkg @@ -0,0 +1,987 @@ +#!/bin/bash +# +# templatepkg: template maintenance script from simplepkg suite +# feedback: rhatto at riseup.net | gpl +# +# Templatepkg 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 2 of the License, or any later version. +# +# Templatepkg 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 +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# $Rev$ - $Author$ +# + +COMMON="/usr/libexec/simplepkg/common.sh" +BASENAME="`basename $0`" + +if [ -f "$COMMON" ]; then + source $COMMON + eval_config $BASENAME +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function usage_summary { + + echo "options are:" + echo "" + echo " -c | --create: create a template from a jail or existing template" + echo " -u | --update: update a template from a jail" + echo " -a | --add: add files into a template" + echo " -d | --delete: delete files or folders from a template" + echo " -s | --sync: sync $TEMPLATE_FOLDER working copy" + echo " -e | --export: export $TEMPLATE_FOLDER to a svn repository" + echo " -i | --import: grab $TEMPLATE_FOLDER from a svn repository" + echo " -r | --remove: remove a template" + echo " -l | --list: list templates" + echo " -b | --batch-edit: add or edit post-installation scripts" + echo " -p | --pack: create a package from a template" + echo " -t | --template-edit: edit template package list" + echo " -h | --help: display this summary" + echo "" + +} + +function display_help { + + # display help + # usage: help [help-topic] + + local option + + if [ -z "$1" ]; then + echo "type $BASENAME --help