Arch Linux Pacman Proxy Script

Since my Arch box has no internet connection (yes, I'm that much of a masochist), I wrote a bash script to act as a proxy of sorts for pacman, at least as regards downloading. It took a while to get it working (intermittent web access and all) but here it finally is, as promised.
It works well for me, and I only hope that it will help anyone else in the same situation (if there is anyone else in the same situation).
The script has various options to explain everything you need to know, but here's a quick word of warning: it only works on POSIX-compatible computers (i.e. no Wintendows, usually) and the proxy box needs to have bash, wget, tar, grep and sed installed. I don't see this as being a problem, but if I'm wrong, tell me all about it.
#!/bin/bash
readonly VER="2.1"
readonly wgetVER=`wget -V|sed '1!d'`
# DEBUG levels:
# Set to 0 for ALERT-level messages only
# Set to 1 for INFO-level messages (I prefer this)
# Set to 2 for DEBUG-level messages
# Set to 3 for all messages
readonly DEBUG=0
# Set DEBUGLOG=1 to print ALERT, INFO and DEBUG messages to DEBUG.log
readonly DEBUGLOG=0
readonly COLOUR=true
if [[ $COLOUR == true ]] ; then
readonly red='\e[31m'
readonly warn='\e[31;7m '
readonly green='\e[32m'
readonly lgreen='\e[32;1m'
readonly yellow='\e[33;1m'
readonly lblue='\e[34;1m'
readonly dull='\e[0m' ; fi
# Sticky details:
# tar seems very slow (vfat? transform? USB?)
function bugspray {
[[ -z $2 ]] && verbosity=1 || verbosity=$2
if (( DEBUG >= verbosity )) ; then
(( $2 == 0 )) && intro="${warn}ALERT${dull} | "
(( $2 == 1 )) && intro=" INFO | "
(( $2 > 1 )) && intro=" ${yellow}DEBUG${dull} | "
echo -e "$intro$1"
(( DEBUGLOG == 1 )) && echo "`date +%F_%T` | $1">>log-alpps/DEBUG.log ; fi ; }
function compare_versions {
# Requires two ordinary, untweaked version strings, first local, second distant
if [[ -z $2 ]] ; then
bugspray "compare_versions didn't receive two variables." 2 ; fi
update='no'
[[ -z $2 ]] && return
local localversion=(`echo $1|sed -r 's/([[:alpha:]]+)/ \1 /g;s/[\.:~_-]/ /g'`)
local distantversion=(`echo $2|sed -r 's/([[:alpha:]]+)/ \1 /g;s/[\.:~_-]/ /g'`)
local max=$((${#distantversion[*]}))
bugspray "localversion: ${localversion[*]}; distantversion: ${distantversion[*]}" 2
for (( x=0 ; (( x < $max )) ; $((x++)) )) ; do
bugspray "local version part: `echo ${localversion[$x]}` | distant version part: `echo ${distantversion[$x]}`" 2
if [[ `echo ${localversion[$x]}|grep -E '^[0-9]*$'` && `echo ${distantversion[$x]}|grep -E '^[0-9]*$'` ]] ; then
bugspray "Numerical comparison" 2
bugspray "localver (${localversion[$x]}) less than distantver (${distantversion[$x]}): $(( 10#${localversion[$x]} < 10#${distantversion[$x]} ))" 3
# Different compare methods for numbers, single letters and multiple letters.
if (( 10#${localversion[$x]} < 10#${distantversion[$x]} )) ; then
update='yes'
break ; fi ; fi
if [[ `echo ${localversion[$x]}|grep -E '^[[:alpha:]]$'` && `echo ${distantversion[$x]}|grep -E '^[[:alpha:]]$'` ]] ; then # single letter -> compare
bugspray "Lexicographical comparison" 2
bugspray "localver (${localversion[$x]}) less than distantver (${distantversion[$x]}): [[ ${localversion[$x]} < ${distantversion[$x]} ]]" 3
if [[ ${localversion[$x]} < ${distantversion[$x]} ]] ; then
update='yes'
break ; fi ; fi
if [[ `echo ${localversion[$x]}|grep -E '^[[:alpha:]]+$'` && `echo ${distantversion[$x]}|grep -E '^[[:alpha:]]+$'` ]] ; then # string -> drop
# cvs / git / beta -> what are the rules?
bugspray "Sequence of letters. Not treating as version number." 2 ; fi
done ; }
function find_dependencies {
# Determine existence via unique path
bugspray "+ ${lgreen}Building download list for package \"$1\"${dull}" 1
local packagename
local dlfile
local package_found=no
if [[ `ls .temp-alpps/*.db/$1-* 2>/dev/null` ]] ; then
bugspray "Analogous package-name file(s) found" 2
for x in `ls .temp-alpps/*.db/$1-*/desc` ; do
bugspray "Checking $x" 2
packagename=`sed -r '/%NAME%/,+1!d;/%NAME%/d' $x`
if [[ j$packagename == j$1 ]] ; then
bugspray "Exact match found: $packagename = $1" 2
dlfile=`sed '/%FILENAME%/,+1!d;/%FILENAME%/d' $x`
local distantversion=`sed '/%VERSION%/,+1!d;/%VERSION%/d' $x`
local package_full=$packagename-$distantversion
local the_repo=`echo $x|sed -r 's/.temp-alpps\/(.*)\.db.*/\1/'`
local the_path=`echo $x|sed -r 's/desc//'`
unplus=`echo $packagename|sed 's/\+/\\\+/g'`
local local_version=`sed -r '/^'$unplus' /!d;s/.* //' .temp-alpps/snapshot.state`
package_found=yes
break ; fi ; done ; fi
if [[ -z $dlfile ]] ; then
bugspray "Exact match not found -> looking for replacements." 2
if ! [[ -z `grep $1 .temp-alpps/*.db/*/depends` ]] ; then
local provisional=`grep $1 .temp-alpps/*.db/*/depends|sed -r 's/\/depends.*//'`
for package in $provisional ; do
local providence=`sed -r '/%PROVIDES%/,/^$/!d;/%PROVIDES%/d;/^$/d;s/>.*//;s/=.*//' $package/depends`
for y in $providence ; do
if [[ j$y == j$1 ]] ; then
# But what about when several packages provide the same thing and ALPPS picks the wrong one? Can it happen?
local newdep=`sed -r '/%NAME%/,+1!d;/%NAME%/d' $package/desc`
bugspray " -> Package \"$newdep\" provides \"$1\"." 1
find_dependencies $newdep
break 2 ; fi ; done ; done
if [[ -z $newdep ]] ; then
bugspray "${warn}Warning:${dull} package \"$1\" not found in database." 0 ; fi ; fi ; fi
bugspray "package: $1 | package_found = $package_found" 2
# Add file to download_list if not up to date and if not already present
if [[ j$package_found == jyes ]] ; then
local already_got_one=no
unplus=`echo $dlfile|sed 's/\+/\\\+/g'`
[[ `echo $download_files|grep $unplus` ]] && already_got_one="yes" && bugspray "${green}Package in queue${dull}" 1
[[ `ls downloads/$dlfile 2>/dev/null` ]] && already_got_one="yes" && bugspray "${green}Package proxied${dull}" 1
compare_versions $local_version $distantversion
bugspray "compare_versions says: $update" 2
! [[ -z $local_version || $update == yes ]] && already_got_one="yes" && bugspray "${green}Package already installed and up-to-date${dull}" 1
if [[ j$already_got_one != jyes ]] ; then
bugspray "${green}Confirm downloading${dull}" 1
download_files+="$dlfile "
download_array[${dlfile}]=$the_repo
bugspray "Checking for further dependencies" 2
if [[ -a $the_path/depends && `grep -E '^%DEPENDS%$' $the_path/depends` ]] ; then
local dependency=`sed -r '/%DEPENDS%/d;/^$/q' $the_path/depends`
bugspray "Dependencies of \"$packagename\":$dependency" 3
for x in $dependency ; do
# Is this dependency already installed? Sort-of the same as higher up; it just saves time here.
local depname=`echo $x|sed -r 's/>.*//;s/=.*//'`
local depminver=`echo $x|sed -r 's/.*>//'`
bugspray "Dependency name: \"$depname\"" 2
if ! [[ `grep -E '^$depname ' .temp-alpps/snapshot.state` ]] ; then
find_dependencies $depname ; fi ; done
else
bugspray "${lblue}End of the line${dull}: package \"$packagename\" has no dependencies." 2
true ; fi ; fi ; fi ; }
function failover_fetch {
echo "Downloading `echo $1|sed 's/.*\///'`"
[[ -d log-alpps/ ]] || mkdir log-alpps/
[[ -z $success ]] || unset success
for mirror in $(<.temp-alpps/snapshot.mirrorlist) ; do
# If DEBUG>0, shouldn't redirect output
url=`echo $mirror|sed 's/$arch/'$arch'/;s/$repo/'${download_array[$1]}'/'`/$1
bugspray "Connecting to $url" 2
wget -o .temp-alpps/very-temp-log -U "Arch Linux Pacman Proxy Script version $VER / $wgetVER" -P downloads/ $url && success=true
cat .temp-alpps/very-temp-log>>log-alpps/download.log
rm -f .temp-alpps/very-temp-log
if [[ -n $success ]] ; then
bugspray "Download: \$success = true" 2
break ; fi ; done
if [[ -z $success ]] ; then
bugspray "${warn}FAIL:${dull} $1 not accessible on known mirrors." 0 ; fi ; }
case $1 in
warranty)
echo
echo -e " ${green}Warranty${dull}"
echo -e " ${green}========${dull}"
echo " This program is free software. It comes without any warranty, to"
echo " the extent permitted by applicable law. You can redistribute it"
echo " and/or modify it under the terms of the Do What The Fuck You Want"
echo " To Public License, Version 2, as published by Sam Hocevar. See"
echo " http://sam.zoy.org/wtfpl/COPYING for more details."
echo
howto)
echo
echo -e " ${green}How to use ALPPS${dull}"
echo -e " ${green}================${dull}"
echo -e " ${yellow}+ Step 0${dull}: prime the engine"
echo " On your offline box, copy the ALPPS script onto a removable medium, cd into"
echo " it's directory, then run it with the \"init\" option. This essentially"
echo " takes a snapshot of your system, package-wise. Your removable medium is"
echo " now ready for use!"
echo -e " ${yellow}+ Step 1${dull}:"
echo " On the proxy box the first order of business is to download and decompress"
echo " the current package lists. You can do this with the \"fetchdb\" option."
echo -e " ${yellow}+ Step 1 alt${dull}:"
echo " If you want to download the package lists without decompressing them,"
echo " \"fetchdb simple\" will do this. It's a lot quicker, but please keep"
echo " in mind that you cannot then do anything in step 2."
echo -e " ${yellow}+ Step 2${dull}:"
echo " If you want to download packages (and why wouldn't you?), the easiest way"
echo " is to prepare a simple text file containing the names of the packages you"
echo " want, one on each line. Run ALPPS with the option \"fetch <filename>\" and"
echo " sit back and wait until it's done. Don't worry about dependencies: ALPPS"
echo " handles them automatically."
echo -e " ${yellow}+ Step 2 alt${dull}:"
echo " As a convenience, \"fetch full\" will download all the packages needed to"
echo " update the offline box."
echo -e " ${yellow}+ Step 3${dull}:"
echo " Finally, back on your offline box, run ALPPS again with the \"install\""
echo " option. This will update the package list and copy the package files into"
echo " local cache. You can now run \"pacman -S <package names>\" to finish"
echo " installing the packages."
# ALPPS no longer installs the packages, just caches them locally.
# Not entirely sure why; it just felt too klutzy.
echo -e " ${yellow}+ Step 4${dull}:"
echo " You will now probably want to delete all the stuff you no longer need. Run"
echo " ALPPS with the option \"clean\". This won't touch your request file(s). It"
echo -e " ${red}WILL${dull} delete log files, so if you want to keep them, back them up first."
echo " Next time you do this, don't forget to run ALPPS with \"init\" again."
echo
bugs)
echo
echo -e " ${green}Where this goes wrong${dull}"
echo -e " ${green}=====================${dull}"
echo " + ALPPS is a bit slow when packages have many dependencies. It's a recursive"
echo " shell script: what did you expect?"
echo " + It only uses the settings in /etc/pacman.conf. If your conf file is"
echo " elsewhere, you're SOL. Similarly, the repositories are all taken from"
echo " /etc/pacman.d/mirrorlist. If you added any custom repositories in"
echo " /etc/pacman.conf (or any other file), ALPPS ignores them."
echo " + As it stands, ALPPS only works when the proxy box has bash, wget, sed,"
echo " grep and tar installed. The offline box needs bash, pacman and sed (in"
echo " theory, this shouldn't be a problem...)."
echo " + There is as yet no way of handling package groups, short of listing every"
echo " member of the group."
echo " + I don't think ALPPS will ever be able to handle AUR packages. Of course, if"
echo " you're compiling AUR packages, you probably won't need something like this!"
echo
faq)
echo
echo -e " ${green}Frequently Asked Questions${dull}"
echo -e " ${green}==========================${dull}"
echo
echo -e " ${red}Q:${dull} Can I run the whole thing off a USB stick?"
echo -e " ${lblue}A:${dull} Certainly."
echo
echo -e " ${red}Q:${dull} Can I use a non-POSIX computer as a proxy (e.g. Windows)?"
echo -e " ${lblue}A:${dull} Probably not, unless that computer has a POSIX-compatibility layer"
echo " installed (such as Cygwin) with bash, wget, tar, sed and grep."
echo
echo -e " ${red}Q:${dull} Do I need to download the package list, waste time updating my computer,"
echo " then go back again to download the packages I want?"
echo -e " ${lblue}A:${dull} Nope! You can update the packagelist database and download piping-hot"
echo " fresh packages, all in one sitting."
echo -e " ${red}Q:${dull} You mean I won't have to futz around with package lists that keep updating"
echo " ten minutes after I download them?"
echo -e " ${lblue}A:${dull} Exactly. Nice, isn't it?"
echo
echo -e " ${red}Q:${dull} Does this thing handle SSL and signed packages?"
echo -e " ${lblue}A:${dull} ALPPS uses SSL if:"
echo " - the mirror has an https address (at present, none do), and"
echo " - wget on the proxy box is compiled with SSL support"
echo " Concerning signed packages: no, but then again, it doesn't need to. ALPPS"
echo " downloads packages; it's pacman's responsibility to verify them. Your"
echo " system remains safe (or as safe as it ever was, at any rate)."
echo -e " ${red}Q:${dull} What about gpg keys? I need to get them."
echo -e " ${lblue}A:${dull} ...maybe later, say, in version 3."
echo
echo -e " ${red}Q:${dull} ALPPS says it \`prepares databases´. Can pacman still use them after this?"
echo -e " ${lblue}A:${dull} Yes, it can. In fact, what ALPPS does is extract the databases into a"
echo " temp directory, without altering the original .db files."
echo
echo -e " ${red}Q:${dull} Where can I contact you?"
echo -e " ${lblue}A:${dull} For constructive, useful questions and comments: [email protected] and"
echo " be sure to mention Arch Linux in the subject."
echo " For flames, trolling, spam and the like, visit your local bitbucket."
echo
todo)
echo
echo -e " ${green}What's next?${dull}"
echo -e " ${green}============${dull}"
echo -e " + I ${red}might${dull} be able to extend the reach of this thing to the AUR."
echo " Yes, I know I said ALPPS couldn't (in \"bugs\"), but I've learned"
echo " something new since then. It'll be tricky, though, since the AUR web"
echo " interface delivers results in python. While this should be a Good Thing,"
echo " bash isn't very good at handling python-format lists and dicts."
echo
-v|ver|version|--ver|--version)
echo -e "${lgreen}Arch Linux pacman proxy script${dull} | ${yellow}version $VER${dull}"
dl_list) # Debugging
(( DEBUG == 0 )) && echo "the \"dl_list\" option is only for debugging" && exit 0
arch=$(<.temp-alpps/snapshot.architecture)
unset download_files
unset download_array
declare -A download_array
find_dependencies $2
bugspray "Download list: $download_files" 3
echo "Download list v2:"
for x in $download_files ; do
bugspray " File \"$x\" from repo \"${download_array[$x]}\"" 3
echo " Full URL: http://mirror.archlinux.org/${download_array[$x]}/os/$arch/$x" ; done
verint) # Debugging
(( DEBUG == 0 )) && echo "the \"verint\" option is only for debugging" && exit 0
for x in `ls .temp-alpps/*/$2-*/desc` ; do
packagename=`sed -r '/%NAME%/,+1!d;/%NAME%/d' $x`
if [[ j$packagename == j$2 ]] ; then
bugspray "Unique package-name file found: $packagename=$2" 2
distantversion=`sed '/%VERSION%/,+1!d;/%VERSION%/d' $x`
dlfile=`sed '/%FILENAME%/,+1!d;/%FILENAME%/d' $x`
package_full=$packagename-$distantversion
the_repo=`echo $x|sed -r 's/.temp-alpps\/(.*)\.db.*/\1/'`
the_path=`echo $x|sed -r 's/desc//'`
local_version=`sed -r '/^'$packagename' /!d;s/.* //' .temp-alpps/snapshot.state`
break ; fi ; done
echo "full package filename: $dlfile"
echo "Comparing local ($local_version) and distant ($distantversion) versions of $2..."
compare_versions $local_version $distantversion
#compare_versions 2.5beta3-2 2.5cvs4-1
echo "...and the verdict is: $update"
init)
x=`uname -m`
if [[ -x /usr/bin/pacman ]] ; then
[[ -d .temp-alpps ]] || mkdir .temp-alpps/
pacman -Q>.temp-alpps/snapshot.state
sed -r '/^Se/!d;s/Server = //' /etc/pacman.d/mirrorlist>.temp-alpps/snapshot.mirrorlist
sed -r '/^\[/!d;/options/d;s/\[(.*)\]/\1/' /etc/pacman.conf>.temp-alpps/snapshot.repositories
sed -r '/^Architecture/!d;s/^.*= //' /etc/pacman.conf>.temp-alpps/snapshot.architecture
[[ ! -s .temp-alpps/snapshot.architecture || auto == $(<.temp-alpps/snapshot.architecture) ]] && $x>.temp-alpps/snapshot.architecture
sed -r '/^SyncFirst/!d;s/.*= //;s/ /\n/g' /etc/pacman.conf>.temp-alpps/snapshot.prioritypackages
echo "Current state recorded."
else
echo "You seem to be running ALPPs on an unsupported system."
echo "ALPPS is the ${lgreen}Arch Linux Pacman Proxy Script${dull} and simply"
echo "won't run properly on a non-pacman OS (except when proxying)."
echo "Aborting. Sorry."
exit 1 ; fi
fetchdb)
[[ -d downloads ]] || mkdir downloads
arch=$(<.temp-alpps/snapshot.architecture)
declare -A download_array
for repo in $(<.temp-alpps/snapshot.repositories) ; do
download_array[${repo}.db]=$repo
location="${repo}.db"
failover_fetch $location ; done
if [[ j$2 != jsimple ]] ; then
[[ -d log-alpps ]] || mkdir log-alpps
[[ -a syncfirst ]] && rm -f syncfirst
echo "Preparing databases for local processing. This might take a while."
for x in $(<.temp-alpps/snapshot.repositories) ; do
echo "Preparing $x.db"
if [[ -a downloads/$x.db ]] ; then
[[ -d .temp-alpps/$x.db ]] || mkdir .temp-alpps/$x.db/
tar -xzC .temp-alpps/$x.db/ -f downloads/$x.db --transform 's/:/§/' --no-same-owner && echo "$x database ready for use."
else
echo -e "Database $x.db is missing. Skipping. This will probably cause problems." ; fi ; done
# SyncFirst package warning
[[ -z $download_list ]] || unset download_list
[[ -a syncfirst ]] && rm -f syncfirst
for x in $(<.temp-alpps/snapshot.prioritypackages) ; do
find_dependencies $x ; done
bugspray "download_files: $download_files" 2
if [[ ! -z $download_files ]] ; then
echo "New version(s) of SyncFirst package(s):"
for x in $(<.temp-alpps/snapshot.prioritypackages) ; do
[[ ! -z `echo $download_files|grep $x` ]] && echo "- $x" && echo $x>>syncfirst ; done
echo "Package names placed in 'syncfirst'. Don't forget to download them!" ; fi ; fi
fetch)
for x in $(<.temp-alpps/snapshot.repositories) ; do
if ! [[ -d .temp-alpps/$x.db/ ]] ; then
bugspray "You must first download a fresh database with the \"fetchdb\" option" 0
exit 1 ; fi ; done
arch=$(<.temp-alpps/snapshot.architecture)
unset download_array
declare -A download_array
unset download_files
if [[ $2 == full ]] ; then
echo " Building full upgrade list. This will almost certainly take a while."
echo " Please wait..."
for y in `sed -r 's/^(.*) .*/\1/' .temp-alpps/snapshot.state` ; do
bugspray "Examining $y" 1
find_dependencies $y ; done
elif [[ -a $2 ]] ; then
echo " Determining dependencies. This might take a while. Please wait."
for y in $(<$2) ; do
bugspray "Examining $y" 1
find_dependencies $y ; done
else
echo " Error: you should provide a list-file or the keyword \"full\"."
echo " (see 'alpps.sh howto', step 2)"
exit 1 ; fi
if [[ -z $download_files ]] ; then
echo " No files to download: either none found, or all found are up to date."
else
[[ -d downloads ]] || mkdir downloads
for x in $download_files ; do
failover_fetch $x ; done ; fi
install)
dbpath=`sed -r '/^DBPath/!d;s/^.*= //' /etc/pacman.conf`
[[ -z $dbpath ]] && dbpath="/var/lib/pacman/"
bugspray "dbpath: $dbpath" 2
echo " Updating databases"
cp -ft ${dbpath}sync/ downloads/*.db
cachedir=`sed -r '/^CacheDir/!d;s/^.*= //' /etc/pacman.conf`
[[ -z $cachedir ]] && cachedir="/var/cache/pacman/pkg/"
echo " Caching packages"
cp -f downloads/*.pkg.tar.xz $cachedir
echo
echo " Don't forget to install/update your packages."
echo " Exercise proper caution."
echo " Have fun!"
clean)
echo "Cleaning up. This might take a while."
rm -fr .temp-alpps/ && echo "Buffer directory deleted" || echo "Problem deleting buffer directory '.temp-alpps/'"
rm -fr log-alpps/ && echo "Log directory deleted" || echo "Problem deleting 'log-alpps/'"
rm -fr downloads/ && echo "Downloaded packages deleted" || echo "Problem deleting 'downloads/'"
echo
echo -e " ${lgreen}Arch Linux pacman proxy script${dull}"
echo
echo -e " ${green}Description${dull}"
echo -e " ${green}===========${dull}"
echo -e " This is a bash script to fetch and install packages for an offline Arch box"
echo " using another, online box as a proxy of sorts. So far, this only works if"
echo " the proxy box has bash, wget, tar, sed and grep installed."
echo " It's probably also entirely unsafe, incompatible and will destroy your box"
echo " in a fiery blaze if you try to use it (you know the drill)."
echo
echo -e " ${green}Options${dull}"
echo -e " ${green}=======${dull}"
echo " init Step 0 (as it were): take a snapshot of your system"
echo " fetchdb Step 1: download the packagelist database"
echo " fetch <file> Step 2: download requested packages"
echo " install Step 3: update your system"
echo " clean Step 4: delete any unneeded files"
echo
echo " howto More detailed instructions"
echo " bugs Problems and future plans"
echo " faq As it says"
echo " warranty (in case it ever becomes necessary)"
echo " version (to be honest, I wasn't expecting to go beyond v1-rc or so)"
echo " help You're reading it, doofus :^)"
echo
# dl_list Test the find_dependencies function"
# verint Test the compare_versions function"
esac

AnimaInvicta wrote:
Since my Arch box has no internet connection (yes, I'm that much of a masochist), I wrote a bash script to act as a proxy of sorts for pacman, at least as regards downloading. It took a while to get it working (intermittent web access and all) but here it finally is, as promised.
It works well for me, and I only hope that it will help anyone else in the same situation (if there is anyone else in the same situation).
The script has various options to explain everything you need to know, but here's a quick word of warning: it only works on POSIX-compatible computers (i.e. no Wintendows, usually) and the proxy box needs to have bash, wget, tar, grep and sed installed. I don't see this as being a problem, but if I'm wrong, tell me all about it.
#!/bin/bash
readonly VER="2.1"
readonly wgetVER=`wget -V|sed '1!d'`
# DEBUG levels:
# Set to 0 for ALERT-level messages only
# Set to 1 for INFO-level messages (I prefer this)
# Set to 2 for DEBUG-level messages
# Set to 3 for all messages
readonly DEBUG=0
# Set DEBUGLOG=1 to print ALERT, INFO and DEBUG messages to DEBUG.log
readonly DEBUGLOG=0
readonly COLOUR=true
if [[ $COLOUR == true ]] ; then
readonly red='\e[31m'
readonly warn='\e[31;7m '
readonly green='\e[32m'
readonly lgreen='\e[32;1m'
readonly yellow='\e[33;1m'
readonly lblue='\e[34;1m'
readonly dull='\e[0m' ; fi
# Sticky details:
# tar seems very slow (vfat? transform? USB?)
function bugspray {
[[ -z $2 ]] && verbosity=1 || verbosity=$2
if (( DEBUG >= verbosity )) ; then
(( $2 == 0 )) && intro="${warn}ALERT${dull} | "
(( $2 == 1 )) && intro=" INFO | "
(( $2 > 1 )) && intro=" ${yellow}DEBUG${dull} | "
echo -e "$intro$1"
(( DEBUGLOG == 1 )) && echo "`date +%F_%T` | $1">>log-alpps/DEBUG.log ; fi ; }
function compare_versions {
# Requires two ordinary, untweaked version strings, first local, second distant
if [[ -z $2 ]] ; then
bugspray "compare_versions didn't receive two variables." 2 ; fi
update='no'
[[ -z $2 ]] && return
local localversion=(`echo $1|sed -r 's/([[:alpha:]]+)/ \1 /g;s/[\.:~_-]/ /g'`)
local distantversion=(`echo $2|sed -r 's/([[:alpha:]]+)/ \1 /g;s/[\.:~_-]/ /g'`)
local max=$((${#distantversion[*]}))
bugspray "localversion: ${localversion[*]}; distantversion: ${distantversion[*]}" 2
for (( x=0 ; (( x < $max )) ; $((x++)) )) ; do
bugspray "local version part: `echo ${localversion[$x]}` | distant version part: `echo ${distantversion[$x]}`" 2
if [[ `echo ${localversion[$x]}|grep -E '^[0-9]*$'` && `echo ${distantversion[$x]}|grep -E '^[0-9]*$'` ]] ; then
bugspray "Numerical comparison" 2
bugspray "localver (${localversion[$x]}) less than distantver (${distantversion[$x]}): $(( 10#${localversion[$x]} < 10#${distantversion[$x]} ))" 3
# Different compare methods for numbers, single letters and multiple letters.
if (( 10#${localversion[$x]} < 10#${distantversion[$x]} )) ; then
update='yes'
break ; fi ; fi
if [[ `echo ${localversion[$x]}|grep -E '^[[:alpha:]]$'` && `echo ${distantversion[$x]}|grep -E '^[[:alpha:]]$'` ]] ; then # single letter -> compare
bugspray "Lexicographical comparison" 2
bugspray "localver (${localversion[$x]}) less than distantver (${distantversion[$x]}): [[ ${localversion[$x]} < ${distantversion[$x]} ]]" 3
if [[ ${localversion[$x]} < ${distantversion[$x]} ]] ; then
update='yes'
break ; fi ; fi
if [[ `echo ${localversion[$x]}|grep -E '^[[:alpha:]]+$'` && `echo ${distantversion[$x]}|grep -E '^[[:alpha:]]+$'` ]] ; then # string -> drop
# cvs / git / beta -> what are the rules?
bugspray "Sequence of letters. Not treating as version number." 2 ; fi
done ; }
function find_dependencies {
# Determine existence via unique path
bugspray "+ ${lgreen}Building download list for package \"$1\"${dull}" 1
local packagename
local dlfile
local package_found=no
if [[ `ls .temp-alpps/*.db/$1-* 2>/dev/null` ]] ; then
bugspray "Analogous package-name file(s) found" 2
for x in `ls .temp-alpps/*.db/$1-*/desc` ; do
bugspray "Checking $x" 2
packagename=`sed -r '/%NAME%/,+1!d;/%NAME%/d' $x`
if [[ j$packagename == j$1 ]] ; then
bugspray "Exact match found: $packagename = $1" 2
dlfile=`sed '/%FILENAME%/,+1!d;/%FILENAME%/d' $x`
local distantversion=`sed '/%VERSION%/,+1!d;/%VERSION%/d' $x`
local package_full=$packagename-$distantversion
local the_repo=`echo $x|sed -r 's/.temp-alpps\/(.*)\.db.*/\1/'`
local the_path=`echo $x|sed -r 's/desc//'`
unplus=`echo $packagename|sed 's/\+/\\\+/g'`
local local_version=`sed -r '/^'$unplus' /!d;s/.* //' .temp-alpps/snapshot.state`
package_found=yes
break ; fi ; done ; fi
if [[ -z $dlfile ]] ; then
bugspray "Exact match not found -> looking for replacements." 2
if ! [[ -z `grep $1 .temp-alpps/*.db/*/depends` ]] ; then
local provisional=`grep $1 .temp-alpps/*.db/*/depends|sed -r 's/\/depends.*//'`
for package in $provisional ; do
local providence=`sed -r '/%PROVIDES%/,/^$/!d;/%PROVIDES%/d;/^$/d;s/>.*//;s/=.*//' $package/depends`
for y in $providence ; do
if [[ j$y == j$1 ]] ; then
# But what about when several packages provide the same thing and ALPPS picks the wrong one? Can it happen?
local newdep=`sed -r '/%NAME%/,+1!d;/%NAME%/d' $package/desc`
bugspray " -> Package \"$newdep\" provides \"$1\"." 1
find_dependencies $newdep
break 2 ; fi ; done ; done
if [[ -z $newdep ]] ; then
bugspray "${warn}Warning:${dull} package \"$1\" not found in database." 0 ; fi ; fi ; fi
bugspray "package: $1 | package_found = $package_found" 2
# Add file to download_list if not up to date and if not already present
if [[ j$package_found == jyes ]] ; then
local already_got_one=no
unplus=`echo $dlfile|sed 's/\+/\\\+/g'`
[[ `echo $download_files|grep $unplus` ]] && already_got_one="yes" && bugspray "${green}Package in queue${dull}" 1
[[ `ls downloads/$dlfile 2>/dev/null` ]] && already_got_one="yes" && bugspray "${green}Package proxied${dull}" 1
compare_versions $local_version $distantversion
bugspray "compare_versions says: $update" 2
! [[ -z $local_version || $update == yes ]] && already_got_one="yes" && bugspray "${green}Package already installed and up-to-date${dull}" 1
if [[ j$already_got_one != jyes ]] ; then
bugspray "${green}Confirm downloading${dull}" 1
download_files+="$dlfile "
download_array[${dlfile}]=$the_repo
bugspray "Checking for further dependencies" 2
if [[ -a $the_path/depends && `grep -E '^%DEPENDS%$' $the_path/depends` ]] ; then
local dependency=`sed -r '/%DEPENDS%/d;/^$/q' $the_path/depends`
bugspray "Dependencies of \"$packagename\":$dependency" 3
for x in $dependency ; do
# Is this dependency already installed? Sort-of the same as higher up; it just saves time here.
local depname=`echo $x|sed -r 's/>.*//;s/=.*//'`
local depminver=`echo $x|sed -r 's/.*>//'`
bugspray "Dependency name: \"$depname\"" 2
if ! [[ `grep -E '^$depname ' .temp-alpps/snapshot.state` ]] ; then
find_dependencies $depname ; fi ; done
else
bugspray "${lblue}End of the line${dull}: package \"$packagename\" has no dependencies." 2
true ; fi ; fi ; fi ; }
function failover_fetch {
echo "Downloading `echo $1|sed 's/.*\///'`"
[[ -d log-alpps/ ]] || mkdir log-alpps/
[[ -z $success ]] || unset success
for mirror in $(<.temp-alpps/snapshot.mirrorlist) ; do
# If DEBUG>0, shouldn't redirect output
url=`echo $mirror|sed 's/$arch/'$arch'/;s/$repo/'${download_array[$1]}'/'`/$1
bugspray "Connecting to $url" 2
wget -o .temp-alpps/very-temp-log -U "Arch Linux Pacman Proxy Script version $VER / $wgetVER" -P downloads/ $url && success=true
cat .temp-alpps/very-temp-log>>log-alpps/download.log
rm -f .temp-alpps/very-temp-log
if [[ -n $success ]] ; then
bugspray "Download: \$success = true" 2
break ; fi ; done
if [[ -z $success ]] ; then
bugspray "${warn}FAIL:${dull} $1 not accessible on known mirrors." 0 ; fi ; }
case $1 in
warranty)
echo
echo -e " ${green}Warranty${dull}"
echo -e " ${green}========${dull}"
echo " This program is free software. It comes without any warranty, to"
echo " the extent permitted by applicable law. You can redistribute it"
echo " and/or modify it under the terms of the Do What The Fuck You Want"
echo " To Public License, Version 2, as published by Sam Hocevar. See"
echo " http://sam.zoy.org/wtfpl/COPYING for more details."
echo
howto)
echo
echo -e " ${green}How to use ALPPS${dull}"
echo -e " ${green}================${dull}"
echo -e " ${yellow}+ Step 0${dull}: prime the engine"
echo " On your offline box, copy the ALPPS script onto a removable medium, cd into"
echo " it's directory, then run it with the \"init\" option. This essentially"
echo " takes a snapshot of your system, package-wise. Your removable medium is"
echo " now ready for use!"
echo -e " ${yellow}+ Step 1${dull}:"
echo " On the proxy box the first order of business is to download and decompress"
echo " the current package lists. You can do this with the \"fetchdb\" option."
echo -e " ${yellow}+ Step 1 alt${dull}:"
echo " If you want to download the package lists without decompressing them,"
echo " \"fetchdb simple\" will do this. It's a lot quicker, but please keep"
echo " in mind that you cannot then do anything in step 2."
echo -e " ${yellow}+ Step 2${dull}:"
echo " If you want to download packages (and why wouldn't you?), the easiest way"
echo " is to prepare a simple text file containing the names of the packages you"
echo " want, one on each line. Run ALPPS with the option \"fetch <filename>\" and"
echo " sit back and wait until it's done. Don't worry about dependencies: ALPPS"
echo " handles them automatically."
echo -e " ${yellow}+ Step 2 alt${dull}:"
echo " As a convenience, \"fetch full\" will download all the packages needed to"
echo " update the offline box."
echo -e " ${yellow}+ Step 3${dull}:"
echo " Finally, back on your offline box, run ALPPS again with the \"install\""
echo " option. This will update the package list and copy the package files into"
echo " local cache. You can now run \"pacman -S <package names>\" to finish"
echo " installing the packages."
# ALPPS no longer installs the packages, just caches them locally.
# Not entirely sure why; it just felt too klutzy.
echo -e " ${yellow}+ Step 4${dull}:"
echo " You will now probably want to delete all the stuff you no longer need. Run"
echo " ALPPS with the option \"clean\". This won't touch your request file(s). It"
echo -e " ${red}WILL${dull} delete log files, so if you want to keep them, back them up first."
echo " Next time you do this, don't forget to run ALPPS with \"init\" again."
echo
bugs)
echo
echo -e " ${green}Where this goes wrong${dull}"
echo -e " ${green}=====================${dull}"
echo " + ALPPS is a bit slow when packages have many dependencies. It's a recursive"
echo " shell script: what did you expect?"
echo " + It only uses the settings in /etc/pacman.conf. If your conf file is"
echo " elsewhere, you're SOL. Similarly, the repositories are all taken from"
echo " /etc/pacman.d/mirrorlist. If you added any custom repositories in"
echo " /etc/pacman.conf (or any other file), ALPPS ignores them."
echo " + As it stands, ALPPS only works when the proxy box has bash, wget, sed,"
echo " grep and tar installed. The offline box needs bash, pacman and sed (in"
echo " theory, this shouldn't be a problem...)."
echo " + There is as yet no way of handling package groups, short of listing every"
echo " member of the group."
echo " + I don't think ALPPS will ever be able to handle AUR packages. Of course, if"
echo " you're compiling AUR packages, you probably won't need something like this!"
echo
faq)
echo
echo -e " ${green}Frequently Asked Questions${dull}"
echo -e " ${green}==========================${dull}"
echo
echo -e " ${red}Q:${dull} Can I run the whole thing off a USB stick?"
echo -e " ${lblue}A:${dull} Certainly."
echo
echo -e " ${red}Q:${dull} Can I use a non-POSIX computer as a proxy (e.g. Windows)?"
echo -e " ${lblue}A:${dull} Probably not, unless that computer has a POSIX-compatibility layer"
echo " installed (such as Cygwin) with bash, wget, tar, sed and grep."
echo
echo -e " ${red}Q:${dull} Do I need to download the package list, waste time updating my computer,"
echo " then go back again to download the packages I want?"
echo -e " ${lblue}A:${dull} Nope! You can update the packagelist database and download piping-hot"
echo " fresh packages, all in one sitting."
echo -e " ${red}Q:${dull} You mean I won't have to futz around with package lists that keep updating"
echo " ten minutes after I download them?"
echo -e " ${lblue}A:${dull} Exactly. Nice, isn't it?"
echo
echo -e " ${red}Q:${dull} Does this thing handle SSL and signed packages?"
echo -e " ${lblue}A:${dull} ALPPS uses SSL if:"
echo " - the mirror has an https address (at present, none do), and"
echo " - wget on the proxy box is compiled with SSL support"
echo " Concerning signed packages: no, but then again, it doesn't need to. ALPPS"
echo " downloads packages; it's pacman's responsibility to verify them. Your"
echo " system remains safe (or as safe as it ever was, at any rate)."
echo -e " ${red}Q:${dull} What about gpg keys? I need to get them."
echo -e " ${lblue}A:${dull} ...maybe later, say, in version 3."
echo
echo -e " ${red}Q:${dull} ALPPS says it \`prepares databases´. Can pacman still use them after this?"
echo -e " ${lblue}A:${dull} Yes, it can. In fact, what ALPPS does is extract the databases into a"
echo " temp directory, without altering the original .db files."
echo
echo -e " ${red}Q:${dull} Where can I contact you?"
echo -e " ${lblue}A:${dull} For constructive, useful questions and comments: [email protected] and"
echo " be sure to mention Arch Linux in the subject."
echo " For flames, trolling, spam and the like, visit your local bitbucket."
echo
todo)
echo
echo -e " ${green}What's next?${dull}"
echo -e " ${green}============${dull}"
echo -e " + I ${red}might${dull} be able to extend the reach of this thing to the AUR."
echo " Yes, I know I said ALPPS couldn't (in \"bugs\"), but I've learned"
echo " something new since then. It'll be tricky, though, since the AUR web"
echo " interface delivers results in python. While this should be a Good Thing,"
echo " bash isn't very good at handling python-format lists and dicts."
echo
-v|ver|version|--ver|--version)
echo -e "${lgreen}Arch Linux pacman proxy script${dull} | ${yellow}version $VER${dull}"
dl_list) # Debugging
(( DEBUG == 0 )) && echo "the \"dl_list\" option is only for debugging" && exit 0
arch=$(<.temp-alpps/snapshot.architecture)
unset download_files
unset download_array
declare -A download_array
find_dependencies $2
bugspray "Download list: $download_files" 3
echo "Download list v2:"
for x in $download_files ; do
bugspray " File \"$x\" from repo \"${download_array[$x]}\"" 3
echo " Full URL: http://mirror.archlinux.org/${download_array[$x]}/os/$arch/$x" ; done
verint) # Debugging
(( DEBUG == 0 )) && echo "the \"verint\" option is only for debugging" && exit 0
for x in `ls .temp-alpps/*/$2-*/desc` ; do
packagename=`sed -r '/%NAME%/,+1!d;/%NAME%/d' $x`
if [[ j$packagename == j$2 ]] ; then
bugspray "Unique package-name file found: $packagename=$2" 2
distantversion=`sed '/%VERSION%/,+1!d;/%VERSION%/d' $x`
dlfile=`sed '/%FILENAME%/,+1!d;/%FILENAME%/d' $x`
package_full=$packagename-$distantversion
the_repo=`echo $x|sed -r 's/.temp-alpps\/(.*)\.db.*/\1/'`
the_path=`echo $x|sed -r 's/desc//'`
local_version=`sed -r '/^'$packagename' /!d;s/.* //' .temp-alpps/snapshot.state`
break ; fi ; done
echo "full package filename: $dlfile"
echo "Comparing local ($local_version) and distant ($distantversion) versions of $2..."
compare_versions $local_version $distantversion
#compare_versions 2.5beta3-2 2.5cvs4-1
echo "...and the verdict is: $update"
init)
x=`uname -m`
if [[ -x /usr/bin/pacman ]] ; then
[[ -d .temp-alpps ]] || mkdir .temp-alpps/
pacman -Q>.temp-alpps/snapshot.state
sed -r '/^Se/!d;s/Server = //' /etc/pacman.d/mirrorlist>.temp-alpps/snapshot.mirrorlist
sed -r '/^\[/!d;/options/d;s/\[(.*)\]/\1/' /etc/pacman.conf>.temp-alpps/snapshot.repositories
sed -r '/^Architecture/!d;s/^.*= //' /etc/pacman.conf>.temp-alpps/snapshot.architecture
[[ ! -s .temp-alpps/snapshot.architecture || auto == $(<.temp-alpps/snapshot.architecture) ]] && $x>.temp-alpps/snapshot.architecture
sed -r '/^SyncFirst/!d;s/.*= //;s/ /\n/g' /etc/pacman.conf>.temp-alpps/snapshot.prioritypackages
echo "Current state recorded."
else
echo "You seem to be running ALPPs on an unsupported system."
echo "ALPPS is the ${lgreen}Arch Linux Pacman Proxy Script${dull} and simply"
echo "won't run properly on a non-pacman OS (except when proxying)."
echo "Aborting. Sorry."
exit 1 ; fi
fetchdb)
[[ -d downloads ]] || mkdir downloads
arch=$(<.temp-alpps/snapshot.architecture)
declare -A download_array
for repo in $(<.temp-alpps/snapshot.repositories) ; do
download_array[${repo}.db]=$repo
location="${repo}.db"
failover_fetch $location ; done
if [[ j$2 != jsimple ]] ; then
[[ -d log-alpps ]] || mkdir log-alpps
[[ -a syncfirst ]] && rm -f syncfirst
echo "Preparing databases for local processing. This might take a while."
for x in $(<.temp-alpps/snapshot.repositories) ; do
echo "Preparing $x.db"
if [[ -a downloads/$x.db ]] ; then
[[ -d .temp-alpps/$x.db ]] || mkdir .temp-alpps/$x.db/
tar -xzC .temp-alpps/$x.db/ -f downloads/$x.db --transform 's/:/§/' --no-same-owner && echo "$x database ready for use."
else
echo -e "Database $x.db is missing. Skipping. This will probably cause problems." ; fi ; done
# SyncFirst package warning
[[ -z $download_list ]] || unset download_list
[[ -a syncfirst ]] && rm -f syncfirst
for x in $(<.temp-alpps/snapshot.prioritypackages) ; do
find_dependencies $x ; done
bugspray "download_files: $download_files" 2
if [[ ! -z $download_files ]] ; then
echo "New version(s) of SyncFirst package(s):"
for x in $(<.temp-alpps/snapshot.prioritypackages) ; do
[[ ! -z `echo $download_files|grep $x` ]] && echo "- $x" && echo $x>>syncfirst ; done
echo "Package names placed in 'syncfirst'. Don't forget to download them!" ; fi ; fi
fetch)
for x in $(<.temp-alpps/snapshot.repositories) ; do
if ! [[ -d .temp-alpps/$x.db/ ]] ; then
bugspray "You must first download a fresh database with the \"fetchdb\" option" 0
exit 1 ; fi ; done
arch=$(<.temp-alpps/snapshot.architecture)
unset download_array
declare -A download_array
unset download_files
if [[ $2 == full ]] ; then
echo " Building full upgrade list. This will almost certainly take a while."
echo " Please wait..."
for y in `sed -r 's/^(.*) .*/\1/' .temp-alpps/snapshot.state` ; do
bugspray "Examining $y" 1
find_dependencies $y ; done
elif [[ -a $2 ]] ; then
echo " Determining dependencies. This might take a while. Please wait."
for y in $(<$2) ; do
bugspray "Examining $y" 1
find_dependencies $y ; done
else
echo " Error: you should provide a list-file or the keyword \"full\"."
echo " (see 'alpps.sh howto', step 2)"
exit 1 ; fi
if [[ -z $download_files ]] ; then
echo " No files to download: either none found, or all found are up to date."
else
[[ -d downloads ]] || mkdir downloads
for x in $download_files ; do
failover_fetch $x ; done ; fi
install)
dbpath=`sed -r '/^DBPath/!d;s/^.*= //' /etc/pacman.conf`
[[ -z $dbpath ]] && dbpath="/var/lib/pacman/"
bugspray "dbpath: $dbpath" 2
echo " Updating databases"
cp -ft ${dbpath}sync/ downloads/*.db
cachedir=`sed -r '/^CacheDir/!d;s/^.*= //' /etc/pacman.conf`
[[ -z $cachedir ]] && cachedir="/var/cache/pacman/pkg/"
echo " Caching packages"
cp -f downloads/*.pkg.tar.xz $cachedir
echo
echo " Don't forget to install/update your packages."
echo " Exercise proper caution."
echo " Have fun!"
clean)
echo "Cleaning up. This might take a while."
rm -fr .temp-alpps/ && echo "Buffer directory deleted" || echo "Problem deleting buffer directory '.temp-alpps/'"
rm -fr log-alpps/ && echo "Log directory deleted" || echo "Problem deleting 'log-alpps/'"
rm -fr downloads/ && echo "Downloaded packages deleted" || echo "Problem deleting 'downloads/'"
echo
echo -e " ${lgreen}Arch Linux pacman proxy script${dull}"
echo
echo -e " ${green}Description${dull}"
echo -e " ${green}===========${dull}"
echo -e " This is a bash script to fetch and install packages for an offline Arch box"
echo " using another, online box as a proxy of sorts. So far, this only works if"
echo " the proxy box has bash, wget, tar, sed and grep installed."
echo " It's probably also entirely unsafe, incompatible and will destroy your box"
echo " in a fiery blaze if you try to use it (you know the drill)."
echo
echo -e " ${green}Options${dull}"
echo -e " ${green}=======${dull}"
echo " init Step 0 (as it were): take a snapshot of your system"
echo " fetchdb Step 1: download the packagelist database"
echo " fetch <file> Step 2: download requested packages"
echo " install Step 3: update your system"
echo " clean Step 4: delete any unneeded files"
echo
echo " howto More detailed instructions"
echo " bugs Problems and future plans"
echo " faq As it says"
echo " warranty (in case it ever becomes necessary)"
echo " version (to be honest, I wasn't expecting to go beyond v1-rc or so)"
echo " help You're reading it, doofus :^)"
echo
# dl_list Test the find_dependencies function"
# verint Test the compare_versions function"
esac
I've always resorted to use VPN, then I started using cntlm, this looks very useful (and a lot of work on your part!) Thanks alot!
DoctorZeus

Similar Messages

  • Installation Arch Linux via proxy

    How to install Arch Linux via proxy?
    Best regard!

    https://wiki.archlinux.org/index.php/Pa … ettings.3F

  • Arch Linux "pacman-enhanced Tux" :)

    Hey,
    I just wanted to gimp a unique 'start'-button for my fbpanel.. so I inkscaped a 'pacman-enhanced' tux (get it? ) that I'm of course sharing with you folks:
    Well.. maybe somebody else out there also likes him

    Thanks for the nice feedback! Concerning the art svg upload.. Err.. I just tried.. :oops: so where exactly is art.archlinux.org's 'upload' function?
    By the way, Inkscape seems to distinguish 'Inkscape SVG' from 'Plain SVG'. I did not compare the xml and am not yet that much into svg as I'd like to be.. Does someone know the difference? Is it that plain is preferable for web and inkscape formatted files are preferable for editing?

  • Debtap - A script to convert .deb packages to Arch Linux packages

    I wrote this script in my free time to help people who, for any reason, want to convert a .deb to an Arch Linux package. It works in a similar way with alien (which converts .deb packages to .rpm packages and vice versa), but, unlike alien, it is focused on accuracy of conversion, trying to translate Debian/Ubuntu packages names to the correct Arch Linux packages names and store them in the dependencies fields of the .PKGINFO metadata in the final package. In other words, it won't only create an Arch package with the data of the original .deb package, but also it will try to create a valid and as accurate as possible .PKGINFO metadata file in the converted package. It uses pkgfile and pacman utilities to achieve this accuracy. The final package can be installed like any local Arch Linux package. Debtap is now available on AUR!
    FAQ
    Q: What "debtap" stands for?
    A: DEB To Arch (Linux) Package
    Q: Isn't better to download an official package or write a PKGBUILD in case I need to compile a package or convert a .deb package to an Arch Linux package?
    A: Sure it is, and I truely encourage you to do so. Debtap was written to create packages that either cannot be compiled (closed source packages) or cannot be built from AUR for various reasons (error during compiling or unavailable files), as a quick 'n' dirty solution and an extra option for creating Arch Linux packages for Arch Linux users.
    Q: So debtap will help me only in case I need to convert specific .deb packages to Arch Linux packages?
    A: No. In case you need to write a new PKGBUILD for a package that already exists in the Debian/Ubuntu distributions, by converting its .deb package to Arch package with debtap, thanks to the packages names translator function inside the script, it can help you determine which dependencies are needed for the package you write the PKGBUILD for and complete the necessary fields.
    Q: What are the minimum requirements to run this script?
    A: You need to have installed these dependencies: bash, binutils (provides ar utility for extracting .deb package), pkgfile, and fakeroot. You must run at least once (preferably recently) "debtap -u" to create/update pkgfile and debtap database (you do this with root privileges).
    Q: Debtap needs a lot of time to convert a package. So, why this is happening?
    A: Like I said, debtap is focused on accuracy. It won't just unpack a .deb package and then repackage its data to an Arch Linux package, ignoring metadata. Depending on the speed of your processor and the package itself, conversion can take from a few seconds to several minutes.
    Q: During conversion I get several warning messages, why?
    A: Debtap cannot be 100% accurate for several reasons,  the main reason for this is the complexity of packages names. If you want to check the freshly generated .PKGINFO and .INSTALL (this is optional file) metadata files or even fix the untranslated packages names inside .PKGINFO, debtap offers you the option to edit these files before compressing the final package.
    Q: How do I use debtap?
    A: The syntax is quite simple actually: debtap [option] package_filename
    For example: debtap world-of-goo-demo_1.0_i386.deb
    Any recommendations or questions for debtap are welcomed!
    Last edited by helix (2015-05-21 22:54:17)

    Hi helix. I've had trouble trying to use your script with ubuntu software from The Open University
    debtap OpenUniversity-ubuntu-0.1.3.20130104.deb
    ==> Extracting package data...
    ==> Fixing possible directories structure differencies...
    ==> Generating .PKGINFO file...
    debtap OpenUniversity-ubuntu-0.1.3.20130104.deb
    ==> Extracting package data...
    ==> Fixing possible directories structure differencies...
    ==> Generating .PKGINFO file...
    :: Enter Packager name:
    NewPepper2013
    :: Enter package license (you can enter multiple licenses comma seperated):
    closed
    :: If you want to edit .PKGINFO file, press (1) For vi (2) For nano (3) For a cu                                                                                                    stom editor or any other key to continue:
    ==> Generating .MTREE file...
    ==> Creating final package...
    xz: unrecognized option '--1-any.pkg.tar'
    xz: Try `xz --help' for more information.
    mv: cannot stat ‘*.xz’: No such file or directory
    ==> Removing leftover files...
    ==> Package successfully created!
    The software is called NewPepper 2013 but i've not been able to find it online except on the ou website.

  • Archwiz Script for installing Arch Linux

    I created a new Bash Script Project called Archwiz, located on  github flesh/archwiz ,
    its still in Beta for a few reasons, I never figured out how to get computer translations working in the script so I can Localize it, and I never figured out all the details to get an AUR custom repo working and lastly I didn't get the Asynchronous downloads to work right, so there are all disabled in this script.
    This script was a fork of another script found here Archlinux Ultimate Install Script.
    The Script itself has several files, the wizard.sh is a library, that allow programmers to use this library as an API for writing scripts, so its usefully to anyone that wants an API to write Bash Scripts, but the script itself scripts a script that is saved as configuration files, then executes the script inside itself, so you can look at all the configuration files before running it.
    The script was written for use by anyone, but mostly targets programmers like myself who need to setup a machine to use as a work station and want it set up a certain way every time, although this script is far from finished, I have a lot of tweaking to do to it before it would be completely there, but as it is, I can get up and running on a machine with little effort, so this make it ideal for a Linux Administrator who has to install thousands of OS's and have them configured all the same way, but works great for someone just wanting to install Arch Linux.
    The Project is Self Documenting and Self Localizing, although currently only English works, but the po files are there, so it would be easy enough if you wanted to localize it; but the computer translation function I started would be the correct way to do this.
    The scripts makes use of a custom repo, so remove it when finished, the script should do this for you, but just to let you know, it downloads the core to the flash drive, this way it can install very fast, once you install it one, it has all the files on it to install on another computer without an Internet connection, well at least that was my thinking, I never did get the AUR custom repo to work, but the idea is to have all the files on the flash so you do not need to use up bandwidth installing Arch Linux on a new machine, just install it, then run pacman updates.
    The Idea of a Wizard is to make the life of those installing an OS, much easier, they have the Option to do a Custom install, or a Wizard install, even an Automatic install to pre-configure machines.
    The script determines if you have UEFI Bios or not, and formats and configures the Hard Drive correctly, and gives you full control over the partitioning of the drive, within the bounds of the tools used, so its very flexible, it uses systemd, so boot time on my machine is 10 seconds flat, and that's because I mount a lot of network drives and map them at boot time, I got 2 seconds boot time with mounting, so the packages are not perfect, but they do work.
    I only tested GDM, since I installed every Desktop Manager and configuration for my needs, this was the only one I got to work for all of them, but I normally use KDE or Mate, but I ran into issues with Mate and went back to KDE, so I could get back to work.
    This script was designed to Format the Drive you install it to, so do not use this on a Partitioned Drive,  it will format the hard drive, so you are warned once more during the install, but this could be fixed, I had to abandon the project to finish another, so the script is as it is, but could give someone a great start if they want to folk it and finish it, so fork me.
    See the help.html for details.
    Last edited by Flesh (2013-02-28 00:31:54)

    Moving to Community Contributions...

  • Progress on Unity under Arch Linux!

    See here for information about the new GNOME 3.12-compatible packages: https://bbs.archlinux.org/viewtopic.php … 3#p1404683
    I'm now on IRC! Come join us at #unityforarch on Freenode
    To install Unity from my repos:
    See the wiki: https://wiki.archlinux.org/index.php/un … mmended.29
    To install Unity from source:
    See the wiki: https://wiki.archlinux.org/index.php/unity#From_source
    -- You probably don't want to read anything below --
    The story
    So...rather than wasting internet bandwith to download a new Ubuntu ISO to test out the new Unity features, I decided to try to make it work under Arch Linux. It took a whole lot longer than I expected to get it even partially working. So, here's my story:
    Knowing that Unity isn't in the main repositories, I went the AUR's website and looked for a user created Unity package. That didn't go too well. The Unity package hasn't been updated for 6 months. D'oh! I decided to download the existing PKGBUILD and modify it to work with the Unity 4.xx series. After changing the version number, I tried to "makepkg" it, and was greeted with a message about installing Compiz 0.9.x. I thought it would be an easy install. It was quite the opposite. Compiz's install prefix was set to /opt/unity, but FindCompiz cmake build file expected Compiz to be in /usr, so none of the Compiz packages, except for compiz-core would compile. Then, I tried reinstalling compiz-core, but this time, changing the prefix to /usr. The compiled package ended up being only a few kilobytes big. I guess the mouse wheel was invented for a reason. I looked at the PKGBUILD again, only to find that there was a line at the very bottom that ran "rm -rf ${pkgdir}/usr". That explains a lot! I ended up adopting all the compiz*-git packages and fixing them so they would compile and install.
    So, now that Compiz is working (restarted and tested just to make sure I didn't waste my time with something that didn't work), I went on to install the rest of the dependencies listed in the Unity PKGBUILD file. That went relatively well. I was so happy after seeing the progress counter go up after running "makepkg", but at about 8%, gcc spat out an error about an undeclared function (sorry, I forgot what the function was). Natually, I went to Google and searched the name of the function. 0 results! Exactly was I was looking for! I ended up downloading the Ubuntu 11.10 Alpha 3 ISO and running "find -type f /usr/lib | xargs objdump -T | grep the_function". The problem lied in the libindicator package. There was a newer version available which contained that function. I have no idea why a package that's only 0.02 versions ahead of the AUR package would contain new functions...
    Next! Utouch...ugh...great memories! Not! I was so glad that I had fixed the utouch packages earlier (for touchegg to work). I was too frustrated from compiz and libindicator to try to compile more stuff.
    Cmake. Whoever created the CMakeLists.txt file didn't list all the dependencies required. So after running "makepkg" 10 billion times, waiting for "somebodydidntputthisincmake.h not found" errors to appear, I finally got all the dependencies I needed installed...or so I thought. After installing and compiling all these dependencies, the cmake only continues 3% further before encountering another cryptic gcc error. This time, there no error about a file not being found. So not knowing what dependency was missing, I headed over to http://packages.ubuntu.com and downloaded the Unity DEB source to find the dependencies in then debian/control file. After install those few dependencies that I missed, I ran "makepkg" again, hoping that it would finally compile successfully. CMake went a little further--5% further to be exact--before running into another error. It complained about DndSourceDragBegin() having two return types. Sure, enough "./plugins/unityshell/src/ResultViewGrid.h" had the return type as boolean and "/usr/include/Nux-1.0/Nux/InputArea.h" had the return type as void. WTF? How the heck does this even compile under 11.10???
    After changing void to bool in "/usr/include/Nux-1.0/Nux/InputArea.h", I ran "makepkg" once again anxiously waiting to the see the line "Finished making: unity 4.10.2". CMake compiled about 35% before running into error about an undeclared gtk function. Nooooooooooooo!!! I wasn't brave enough to install the git version of gtk3, so I created a chroot, installed the base packages, and installed all of those dependencies fairly quickly (it gets a lot easier after doing it so many times).
    Moving on to gtk3. After cloning the ~200MB git repository, autotools spits out an error about cairo-gl missing. So, I proceeded to install the cairo-gl-git package, which failed to compile (it compiled successfully outside of the chroot...). GREAT. So, Unity fails to compile because GTK version is too old, and GTK failed to compile because cairo-gl is missing, and cairo-gl fails to compile because I'm in a chroot. GAHHH!!! While thinking about throwing the computer out of the window, I searched the AUR for other GTK3 packages. I just happened to find a package named "GTK3-UBUNTU"! That package was still at version 3.0, but it was pretty easy to get the patches and source code for 3.1 from the Ubuntu GTK source package.
    So, FINALLY, Unity compiles. I was so darn happy, I didn't even care if it ran or not. I logged out and logged back into the GNOME 3 fallback mode, and entered the chroot. After running "xhost +SI:localuser:chenxiaolong" to run X11 apps in the chroot, I crossed my fingers and ran "DISPLAY=:0.0 unity --replace". It failed with python 3 complaining about missing modules. That's okay, since the Unity launch script is written in python 2. I changed the shebang line in "/usr/bin/unity" to point to python 2 and ran "DISPLAY=:0.0 unity --replace". It didn't necessarily fail, but it didn't succeed either. It didn't print out any error messages. Weird... I thought I'd try enabling Unity from the compiz settings manager then. I ran "DISPLAY=:0.0 compiz --replace" and "DISPLAY=:0.0 ccsm" and enabled the Unity plugin. Unity runs! Although nothing shows on the screen, it runs! It shows up in the process list! Woohoo!
    And that's about how far I got. There were quite a few Vala errors during the compiling process (I forgot which package it was), which is probably why Unity won't appear. I'll try again later with the vala-devel or vala-git package and hopefully Unity will work then. Here are screenshots of what I've gotten working so far:
    http://i.imgur.com/7F1fm.jpg
    http://i.imgur.com/zGNJc.jpg
    http://i.imgur.com/3mCgd.jpg
    By then way, I love the simplicity of pacman and the AUR. I can't imagine how long this would have taken with other package managers.
    Moderator edit:  Do not place large images in line.  If you want, you may embed links to thumbnails inside url tags.
    Last edited by chenxiaolong (2014-04-15 17:11:04)

    City-busz: I'm getting a ton of Vala errors when I compile libunity (AUR version) with vala or vala-devel. libunity fails to compile with vala-git. I'll try your packages in a virtual machine and see how they work on 64 bit.
    In the meantime, Unity still fails to show up: http://i.imgur.com/btPwo.png I'll try out your PKGBUILDS and see how that works. I'm glad there are people who want to port Unity to Arch Linux
    EDIT: City-busz: Just to let you know, Unity will fail to compile at around 45% with GTK 3.0. Here's my source packaage for Ubuntu's GTK 3.1: http://ubuntuone.com/p/1EzX/ It contains all of the patches in the Ubuntu source package. I'm not sure if all the patches are needed, but GTK compiles fine with all of them.
    EDIT2: Right now, I'm trying to compile Vala 0.10.4, then version used in Ubuntu 11.10. Hopefully that will eliminate some of the Vala errors.
    EDIT3: Vala 0.10 is too old. 0.12 and 0.14 are also in the Ubuntu repository. Trying those...
    EDIT4: 0.14 is actually 0.13.1. Gah... Vala takes longer to compile under VirtualBox than GTK3...
    EDIT5: Okay...so VirtualBox "helpfully" became slow enough that I could read the error messages. The Vala error messages aren't actually error messages, but rather warnings about unused methods. I wonder what prevents Unity from running then...
    Last edited by chenxiaolong (2011-08-30 02:30:29)

  • [Bounty] Free Macbook Pro to get Arch Linux running on Amazon's EC2

    First, the details:
    I will purchase a lowest–end Macbook Pro 13″ ($US 1,200 on Apple's store, new) for the first person to deliver to me a working set of step–by–step instructions for installing the latest Arch Linux on top of Amazon's EC2 platform.
    Caveats & Rules:
    - I don't care how long it takes you—there's a good chance I'm doing something absolutely stupid in my noobishness that's causing the problems I've been experiencing; if it takes you half an hour to make a working AMI, and produce instructions to do such… you just won yourself a Macbook Pro for half an hour's work. Booyah!
    - Again, I say, I don't care how long it takes you—if you don't produce a working set of instructions, there will be no payout, even if you spend 200 hours trying (as I already have!). It's a bounty, not a work contract d-:
    - You must provide me with instructions that work for me (as I don't intend to use your AMI, but rather modify the steps that worked for you a bit at a time until I arrive at an AMI configured exactly as I want it). If you arrive at a working AMI, and can reproduce your steps successfully locally, but they can't be made to work for me, I may be able to go about procuring alternative hardware for myself on which to preform the steps, or taking other measures to reproduce your environment; but the bottom line is I will not shell out until I can, personally, produce a working AMI running Arch Linux.
    - The instructions are considered to be "working" when I can successfully SSH into the root account on an instance instantiated from an AMI created by following the instructions using the key generated by EC2.
    - Your instructions must work both for x86_32 and x86_64 instance types; however, this shouldn't be too much of a problem, as (barring any weirdness) anything that works on x86_32 should be easily made to work on x86_64.
    - Instructions that involve instantiating an intermediate bundling host (say, a CentOS or Fedora Core instance) and then installing Arch to a loopback filesystem using a statically–built pacman are much preferred to instructions that involve me having to install and package Arch locally and then ship it up to S3, because my upstream is unimaginably slow and I eventually will need to create something between eight and twenty different AMIs (see below). But anything that works will be accepted.
    - If you don't want a Macbook Pro, alternative payment methods may be arranged, though you need to contact me before you start and arrange these, as there's only so much I can do.
    - If you are in any way confused or unsure of what I'm offering here, please contact me before you start (see below for contact info)
    Backstory:
    I set up the first AMI for Arch Linux on Amazon, but unfortunately, I did some really stupid things (hey, I was completely new to Linux at the time, gimmie a break!). The root filesystem was limited to 1GB, there was a whole bunch of software that really was completely unnecessary (WiFi drivers? on a virtualized server? seriously?), there were no kernel modules provided… and so on.
    So, after running all my stuff on instances of that for a while, I finally got fed up and found the time to start setting up a newer, cleaner AMI. Unfortunately, I made the mistake of deleting my old AMI before starting work on the first. Now I find myself completely unable to create an AMI that will work whatsoever, and I cannot for the life of me figure out why.
    I've already invested 200 or so hours of my personal time since deleting my original, broken AMI; I'm very fed up and in badly need of working instances. I tried every method I could think of; running the Arch installer from a LiveCD locally and then bundling the running (and thus proved working) Arch install and shipping it off to S3; installing Arch on a loopback filesystem locally, cloning it to a local partition, booting to it to ensure it works, and shipping it off to S3; installing Arch on a loopback filesystem on a remote bundling host running CentOS or whatever and then shipping it off to S3… I've tried installing nothing but the essentials, I've tried installing everything the installer offers… I've tried to do my best to remember the exact steps I took the first time around, years ago, and reproduce them exactly… nothing has worked.
    If I take EC2 out of the equation, and install the images I've prepared locally, they work. If I take Arch out of the equation, and install, say, CentOS instead, and then ship it off to EC2, it works. The only time I have problems is when I attempt to install Arch Linux specifically on EC2 specifically; the exact use–case I need.
    I've run into a lot of problems along the way, and fixed them as I go, but I universally end up with an AMI that, once instantiated, does not successfully boot. Worse yet, I get absolutely no output from the console (provided by the ec2-get-console command–line tool) to help me debug the problem. I can't give you any more specifics beyond this to help you, because I don't want to insinuate some idea that will cause you to make some little stupid mistake that I also made, thus dooming the project.
    Contact:
    For more info of any sort, please hit me up on Google Talk or Jabber (… or any other XMPP–federated chat service, or AIM, or ICQ, or MSN, or whatever you like, they all use the same address anyway) at the following address:
    [email protected]
    Edit: I should point out that it would be good form to post here if you're going to make a stab at it, so interested parties know how many people are already making attempts.
    Last edited by elliottcable (2009-07-25 03:59:46)

    drtoki wrote:
    http://blog.mudy.info/2009/04/archlinux-ec2-public-ami/
    lolwat
    from fryguy
    Public AMIs aren't what I need, because I need to mass–produce quite a few AMIs with different custom configurations for different purposes; so I have to be able to start from scratch and arrive at a working AMI *myself*.
    As for the script, I'm sitting down to play with it now; it looks just about exactly like what I've been doing so far. Maybe there's some small thing he did differently that will make it work. Here's hoping it works for me; that'll be a real load off my chest.

  • System encryption using LUKS and GPG encrypted keys for arch linux

    Update: As of 2012-03-28, arch changed from gnupg 1.4 to 2.x which uses pinentry for the password dialog. The "etwo" hook described here doesn't work with gnupg 2. Either use the openssl hook below or use a statically compiled version of gnupg 1.4.
    Update: As of 2012-12-19, the mkinitcpio is not called during boot, unless the "install" file for the hook contains "add_runscript". This resulted in an unbootable system for me. Also, the method name was changed from install () to build ().
    Update: 2013-01-13: Updated the hook files using the corrections by Deth.
    Note: This guide is a bit dated now, in particular the arch installation might be different now. But essentially, the approach stays the same. Please also take a look at the posts further down, specifically the alternative hooks that use openssl.
    I always wanted to set up a fully encrypted arch linux server that uses gpg encrypted keyfiles on an external usb stick and luks for root filesystem encryption. I already did it once in gentoo using this guide. For arch, I had to play alot with initcpio hooks and after one day of experimentation, I finally got it working. I wrote a little guide for myself which I'm going to share here for anyone that might be interested. There might be better or easier ways, like I said this is just how I did it. I hope it might help someone else. Constructive feedback is always welcome
    Intro
    Using arch linux mkinitcpio's encrypt hook, one can easily use encrypted root partitions with LUKS. It's also possible to use key files stored on an external drive, like an usb stick. However, if someone steals your usb stick, he can just copy the key and potentially access the system. I wanted to have a little extra security by additionally encrypting the key file with gpg using a symmetric cipher and a passphrase.
    Since the encrypt hook doesn't support this scenario, I created a modifed hook called “etwo” (silly name I know, it was the first thing that came to my mind). It will simply look if the key file has the extension .gpg and, if yes, use gpg to decrypt it, then pipe the result into cryptsetup.
    Conventions
    In this short guide, I use the following disk/partition names:
    /dev/sda: is the hard disk that will contain an encrypted swap (/dev/sda1), /var (/dev/sda2) and root (/dev/sda3) partition.
    /dev/sdb is the usb stick that will contain the gpg encrypted luks keys, the kernel and grub. It will have one partition /dev/sdb1 formatted with ext2.
    /dev/mapper/root, /dev/mapper/swap and /dev/mapper/var will be the encrypted devices.
    Credits
    Thanks to the authors of SECURITY_System_Encryption_DM-Crypt_with_LUKS (gentoo wiki), System Encryption with LUKS (arch wiki), mkinitcpio (arch wiki) and Early Userspace in Arch Linux (/dev/brain0 blog)!
    Guide
    1. Boot the arch live cd
    I had to use a newer testing version, because the 2010.05 cd came with a broken gpg. You can download one here: http://releng.archlinux.org/isos/. I chose the “core“ version. Go ahead and boot the live cd, but don't start the setup yet.
    2. Set keymap
    Use km to set your keymap. This is important for non-qwerty keyboards to avoid suprises with passphrases...
    3. Wipe your discs
    ATTENTION: this will DELETE everything on /dev/sda and /dev/sdb forever! Do not blame me for any lost data!
    Before encrypting the hard disc, it has to be completely wiped and overwritten with random data. I used shred for this. Others use badblocks or dd with /dev/urandom. Either way, this will take a long time, depending on the size of your disc. I also wiped my usb stick just to be sure.
    shred -v /dev/sda
    shred -v /dev/sdb
    4. Partitioning
    Fire up fdisk and create the following partitions:
    /dev/sda1, type linux swap.
    /dev/sda2: type linux
    /dev/sda3: type linux
    /dev/sdb1, type linux
    Of course you can choose a different layout, this is just how I did it. Keep in mind that only the root filesystem will be decrypted by the initcpio. The rest will be decypted during normal init boot using /etc/crypttab, the keys being somewhere on the root filesystem.
    5. Format  and mount the usb stick
    Create an ext2 filesystem on /dev/sdb1:
    mkfs.ext2 /dev/sdb1
    mkdir /root/usb
    mount /dev/sdb1 /root/usb
    cd /root/usb # this will be our working directory for now.
    Do not mount anything to /mnt, because the arch installer will use that directory later to mount the encrypted root filesystem.
    6. Configure the network (if not already done automatically)
    ifconfig eth0 192.168.0.2 netmask 255.255.255.0
    route add default gw 192.168.0.1
    echo "nameserver 192.168.0.1" >> /etc/resolv.conf
    (this is just an example, your mileage may vary)
    7. Install gnupg
    pacman -Sy
    pacman -S gnupg
    Verify that gnupg works by launching gpg.
    8. Create the keys
    Just to be sure, make sure swap is off:
    cat /proc/swaps
    should return no entries.
    Create gpg encrypted keys (remember, we're still in our working dir /root/usb):
    dd if=/dev/urandom bs=512 count=4 | gpg -v --cipher-algo aes256 --digest-algo sha512 -c -a > root.gpg
    dd if=/dev/urandom bs=512 count=4 | gpg -v --cipher-algo aes256 --digest-algo sha512 -c -a > var.gpg
    Choose a strong password!!
    Don't do this in two steps, e.g don't do dd to a file and then gpg on that file. The key should never be stored in plain text on an unencrypted device, except if that device is wiped on system restart (ramfs)!
    Note that the default cipher for gpg is cast5, I just chose to use a different one.
    9. Create the encrypted devices with cryptsetup
    Create encrypted swap:
    cryptsetup -c aes-cbc-essiv:sha256 -s 256 -h whirlpool -d /dev/urandom create swap /dev/sda1
    You should see /dev/mapper/swap now. Don't format nor turn it on for now. This will be done by the arch installer.
    Important: From the Cryptsetup 1.1.2 Release notes:
    Cryptsetup can accept passphrase on stdin (standard input). Handling of new line (\n) character is defined by input specification:
        if keyfile is specified as "-" (using --key-file=- or by positional argument in luksFormat and luksAddKey, like cat file | cryptsetup --key-file=- <action> ), input is processed
          as normal binary file and no new line is interpreted.
        if there is no key file specification (with default input from stdin pipe like echo passphrase | cryptsetup <action> ) input is processed as input from terminal, reading will
          stop after new line is detected.
    If I understand this correctly, since the randomly generated key can contain a newline early on, piping the key into cryptsetup without specifying --key-file=- could result in a big part of the key to be ignored by cryptsetup. Example: if the random key was "foo\nandsomemorebaratheendofthekey", piping it directly into cryptsetup without --key-file=- would result in cryptsetup using only "foo" as key which would have big security implications. We should therefor ALWAYS pipe the key into cryptsetup using --key-file=- which ignores newlines.
    gpg -q -d root.gpg 2>/dev/null | cryptsetup -v -–key-file=- -c aes-cbc-essiv:sha256 -s 256 -h whirlpool luksFormat /dev/sda3
    gpg -q -d var.gpg 2>/dev/null | cryptsetup -v –-key-file=- -c aes-cbc-essiv:sha256 -s 256 -h whirlpool -v luksFormat /dev/sda2
    Check for any errors.
    10. Open the luks devices
    gpg -d root.gpg 2>/dev/null | cryptsetup -v –-key-file=- luksOpen /dev/sda3 root
    gpg -d var.gpg 2>/dev/null | cryptsetup -v –-key-file=- luksOpen /dev/sda2 var
    If you see /dev/mapper/root and /dev/mapper/var now, everything is ok.
    11. Start the installer /arch/setup
    Follow steps 1 to 3.
    At step 4 (Prepare hard drive(s), select “3 – Manually Configure block devices, filesystems and mountpoints. Choose /dev/sdb1 (the usb stick) as /boot, /dev/mapper/swap for swap, /dev/mapper/root for / and /dev/mapper/var for /var.
    Format all drives (choose “yes” when asked “do you want to have this filesystem (re)created”) EXCEPT for /dev/sdb1, choose “no”. Choose the correct filesystem for /dev/sdb1, ext2 in my case. Use swap for /dev/mapper/swap. For the rest, I chose ext4.
    Select DONE to start formatting.
    At step 5 (Select packages), select grub as boot loader. Select the base group. Add mkinitcpio.
    Start step 6 (Install packages).
    Go to step 7 (Configure System).
    By sure to set the correct KEYMAP, LOCALE and TIMEZONE in /etc/rc.conf.
    Edit /etc/fstab:
    /dev/mapper/root / ext4 defaults 0 1
    /dev/mapper/swap swap swap defaults 0 0
    /dev/mapper/var /var ext4 defaults 0 1
    # /dev/sdb1 /boot ext2 defaults 0 1
    Configure the rest normally. When you're done, setup will launch mkinitcpio. We'll manually launch this again later.
    Go to step 8 (install boot loader).
    Be sure to change the kernel line in menu.lst:
    kernel /vmlinuz26 root=/dev/mapper/root cryptdevice=/dev/sda3:root cryptkey=/dev/sdb1:ext2:/root.gpg
    Don't forget the :root suffix in cryptdevice!
    Also, my root line was set to (hd1,0). Had to change that to
    root (hd0,0)
    Install grub to /dev/sdb (the usb stick).
    Now, we can exit the installer.
    12. Install mkinitcpio with the etwo hook.
    Create /mnt/lib/initcpio/hooks/etwo:
    #!/usr/bin/ash
    run_hook() {
    /sbin/modprobe -a -q dm-crypt >/dev/null 2>&1
    if [ -e "/sys/class/misc/device-mapper" ]; then
    if [ ! -e "/dev/mapper/control" ]; then
    /bin/mknod "/dev/mapper/control" c $(cat /sys/class/misc/device-mapper/dev | sed 's|:| |')
    fi
    [ "${quiet}" = "y" ] && CSQUIET=">/dev/null"
    # Get keyfile if specified
    ckeyfile="/crypto_keyfile"
    usegpg="n"
    if [ "x${cryptkey}" != "x" ]; then
    ckdev="$(echo "${cryptkey}" | cut -d: -f1)"
    ckarg1="$(echo "${cryptkey}" | cut -d: -f2)"
    ckarg2="$(echo "${cryptkey}" | cut -d: -f3)"
    if poll_device "${ckdev}" ${rootdelay}; then
    case ${ckarg1} in
    *[!0-9]*)
    # Use a file on the device
    # ckarg1 is not numeric: ckarg1=filesystem, ckarg2=path
    if [ "${ckarg2#*.}" = "gpg" ]; then
    ckeyfile="${ckeyfile}.gpg"
    usegpg="y"
    fi
    mkdir /ckey
    mount -r -t ${ckarg1} ${ckdev} /ckey
    dd if=/ckey/${ckarg2} of=${ckeyfile} >/dev/null 2>&1
    umount /ckey
    # Read raw data from the block device
    # ckarg1 is numeric: ckarg1=offset, ckarg2=length
    dd if=${ckdev} of=${ckeyfile} bs=1 skip=${ckarg1} count=${ckarg2} >/dev/null 2>&1
    esac
    fi
    [ ! -f ${ckeyfile} ] && echo "Keyfile could not be opened. Reverting to passphrase."
    fi
    if [ -n "${cryptdevice}" ]; then
    DEPRECATED_CRYPT=0
    cryptdev="$(echo "${cryptdevice}" | cut -d: -f1)"
    cryptname="$(echo "${cryptdevice}" | cut -d: -f2)"
    else
    DEPRECATED_CRYPT=1
    cryptdev="${root}"
    cryptname="root"
    fi
    warn_deprecated() {
    echo "The syntax 'root=${root}' where '${root}' is an encrypted volume is deprecated"
    echo "Use 'cryptdevice=${root}:root root=/dev/mapper/root' instead."
    if poll_device "${cryptdev}" ${rootdelay}; then
    if /sbin/cryptsetup isLuks ${cryptdev} >/dev/null 2>&1; then
    [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated
    dopassphrase=1
    # If keyfile exists, try to use that
    if [ -f ${ckeyfile} ]; then
    if [ "${usegpg}" = "y" ]; then
    # gpg tty fixup
    if [ -e /dev/tty ]; then mv /dev/tty /dev/tty.backup; fi
    cp -a /dev/console /dev/tty
    while [ ! -e /dev/mapper/${cryptname} ];
    do
    sleep 2
    /usr/bin/gpg -d "${ckeyfile}" 2>/dev/null | cryptsetup --key-file=- luksOpen ${cryptdev} ${cryptname} ${CSQUIET}
    dopassphrase=0
    done
    rm /dev/tty
    if [ -e /dev/tty.backup ]; then mv /dev/tty.backup /dev/tty; fi
    else
    if eval /sbin/cryptsetup --key-file ${ckeyfile} luksOpen ${cryptdev} ${cryptname} ${CSQUIET}; then
    dopassphrase=0
    else
    echo "Invalid keyfile. Reverting to passphrase."
    fi
    fi
    fi
    # Ask for a passphrase
    if [ ${dopassphrase} -gt 0 ]; then
    echo ""
    echo "A password is required to access the ${cryptname} volume:"
    #loop until we get a real password
    while ! eval /sbin/cryptsetup luksOpen ${cryptdev} ${cryptname} ${CSQUIET}; do
    sleep 2;
    done
    fi
    if [ -e "/dev/mapper/${cryptname}" ]; then
    if [ ${DEPRECATED_CRYPT} -eq 1 ]; then
    export root="/dev/mapper/root"
    fi
    else
    err "Password succeeded, but ${cryptname} creation failed, aborting..."
    exit 1
    fi
    elif [ -n "${crypto}" ]; then
    [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated
    msg "Non-LUKS encrypted device found..."
    if [ $# -ne 5 ]; then
    err "Verify parameter format: crypto=hash:cipher:keysize:offset:skip"
    err "Non-LUKS decryption not attempted..."
    return 1
    fi
    exe="/sbin/cryptsetup create ${cryptname} ${cryptdev}"
    tmp=$(echo "${crypto}" | cut -d: -f1)
    [ -n "${tmp}" ] && exe="${exe} --hash \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f2)
    [ -n "${tmp}" ] && exe="${exe} --cipher \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f3)
    [ -n "${tmp}" ] && exe="${exe} --key-size \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f4)
    [ -n "${tmp}" ] && exe="${exe} --offset \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f5)
    [ -n "${tmp}" ] && exe="${exe} --skip \"${tmp}\""
    if [ -f ${ckeyfile} ]; then
    exe="${exe} --key-file ${ckeyfile}"
    else
    exe="${exe} --verify-passphrase"
    echo ""
    echo "A password is required to access the ${cryptname} volume:"
    fi
    eval "${exe} ${CSQUIET}"
    if [ $? -ne 0 ]; then
    err "Non-LUKS device decryption failed. verify format: "
    err " crypto=hash:cipher:keysize:offset:skip"
    exit 1
    fi
    if [ -e "/dev/mapper/${cryptname}" ]; then
    if [ ${DEPRECATED_CRYPT} -eq 1 ]; then
    export root="/dev/mapper/root"
    fi
    else
    err "Password succeeded, but ${cryptname} creation failed, aborting..."
    exit 1
    fi
    else
    err "Failed to open encryption mapping: The device ${cryptdev} is not a LUKS volume and the crypto= paramater was not specified."
    fi
    fi
    rm -f ${ckeyfile}
    fi
    Create /mnt/lib/initcpio/install/etwo:
    #!/bin/bash
    build() {
    local mod
    add_module dm-crypt
    if [[ $CRYPTO_MODULES ]]; then
    for mod in $CRYPTO_MODULES; do
    add_module "$mod"
    done
    else
    add_all_modules '/crypto/'
    fi
    add_dir "/dev/mapper"
    add_binary "cryptsetup"
    add_binary "dmsetup"
    add_binary "/usr/bin/gpg"
    add_file "/usr/lib/udev/rules.d/10-dm.rules"
    add_file "/usr/lib/udev/rules.d/13-dm-disk.rules"
    add_file "/usr/lib/udev/rules.d/95-dm-notify.rules"
    add_file "/usr/lib/initcpio/udev/11-dm-initramfs.rules" "/usr/lib/udev/rules.d/11-dm-initramfs.rules"
    add_runscript
    help ()
    cat<<HELPEOF
    This hook allows for an encrypted root device with support for gpg encrypted key files.
    To use gpg, the key file must have the extension .gpg and you have to install gpg and add /usr/bin/gpg
    to your BINARIES var in /etc/mkinitcpio.conf.
    HELPEOF
    Edit /mnt/etc/mkinitcpio.conf (only relevant sections displayed):
    MODULES=”ext2 ext4” # not sure if this is really nessecary.
    BINARIES=”/usr/bin/gpg” # this could probably be done in install/etwo...
    HOOKS=”base udev usbinput keymap autodetect pata scsi sata usb etwo filesystems” # (usbinput is only needed if you have an usb keyboard)
    Copy the initcpio stuff over to the live cd:
    cp /mnt/lib/initcpio/hooks/etwo /lib/initcpio/hooks/
    cp /mnt/lib/initcpio/install/etwo /lib/initcpio/install/
    cp /mnt/etc/mkinitcpio.conf /etc/
    Verify your LOCALE, KEYMAP and TIMEZONE in /etc/rc.conf!
    Now reinstall the initcpio:
    mkinitcpio -g /mnt/boot/kernel26.img
    Make sure there were no errors and that all hooks were included.
    13. Decrypt the "var" key to the encrypted root
    mkdir /mnt/keys
    chmod 500 /mnt/keys
    gpg –output /mnt/keys/var -d /mnt/boot/var.gpg
    chmod 400 /mnt/keys/var
    14. Setup crypttab
    Edit /mnt/etc/crypttab:
    swap /dev/sda1 SWAP -c aes-cbc-essiv:sha256 -s 256 -h whirlpool
    var /dev/sda2 /keys/var
    15. Reboot
    We're done, you may reboot. Make sure you select the usb stick as the boot device in your bios and hope for the best. . If it didn't work, play with grub's settings or boot from the live cd, mount your encrypted devices and check all settings. You might also have less trouble by using uuid's instead of device names.  I chose device names to keep things as simple as possible, even though it's not the optimal way to do it.
    Make backups of your data and your usb stick and do not forget your password(s)! Or you can say goodbye to your data forever...
    Last edited by fabriceb (2013-01-15 22:36:23)

    I'm trying to run my install script that is based on https://bbs.archlinux.org/viewtopic.php?id=129885
    Decrypting the gpg key after grub works, but then "Devce root already exists." appears every second.
    any idea ?
    #!/bin/bash
    # This script is designed to be run in conjunction with a UEFI boot using Archboot intall media.
    # prereqs:
    # EFI "BIOS" set to boot *only* from EFI
    # successful EFI boot of Archboot USB
    # mount /dev/sdb1 /src
    set -o nounset
    #set -o errexit
    # Host specific configuration
    # this whole script needs to be customized, particularly disk partitions
    # and configuration, but this section contains global variables that
    # are used during the system configuration phase for convenience
    HOSTNAME=daniel
    USERNAME=user
    # Globals
    # We don't need to set these here but they are used repeatedly throughout
    # so it makes sense to reuse them and allow an easy, one-time change if we
    # need to alter values such as the install target mount point.
    INSTALL_TARGET="/install"
    HR="--------------------------------------------------------------------------------"
    PACMAN="pacman --noconfirm --config /tmp/pacman.conf"
    TARGET_PACMAN="pacman --noconfirm --config /tmp/pacman.conf -r ${INSTALL_TARGET}"
    CHROOT_PACMAN="pacman --noconfirm --cachedir /var/cache/pacman/pkg --config /tmp/pacman.conf -r ${INSTALL_TARGET}"
    FILE_URL="file:///packages/core-$(uname -m)/pkg"
    FTP_URL='ftp://mirrors.kernel.org/archlinux/$repo/os/$arch'
    HTTP_URL='http://mirrors.kernel.org/archlinux/$repo/os/$arch'
    # Functions
    # I've avoided using functions in this script as they aren't required and
    # I think it's more of a learning tool if you see the step-by-step
    # procedures even with minor duplciations along the way, but I feel that
    # these functions clarify the particular steps of setting values in config
    # files.
    SetValue () {
    # EXAMPLE: SetValue VARIABLENAME '\"Quoted Value\"' /file/path
    VALUENAME="$1" NEWVALUE="$2" FILEPATH="$3"
    sed -i "s+^#\?\(${VALUENAME}\)=.*$+\1=${NEWVALUE}+" "${FILEPATH}"
    CommentOutValue () {
    VALUENAME="$1" FILEPATH="$2"
    sed -i "s/^\(${VALUENAME}.*\)$/#\1/" "${FILEPATH}"
    UncommentValue () {
    VALUENAME="$1" FILEPATH="$2"
    sed -i "s/^#\(${VALUENAME}.*\)$/\1/" "${FILEPATH}"
    # Initialize
    # Warn the user about impending doom, set up the network on eth0, mount
    # the squashfs images (Archboot does this normally, we're just filling in
    # the gaps resulting from the fact that we're doing a simple scripted
    # install). We also create a temporary pacman.conf that looks for packages
    # locally first before sourcing them from the network. It would be better
    # to do either *all* local or *all* network but we can't for two reasons.
    # 1. The Archboot installation image might have an out of date kernel
    # (currently the case) which results in problems when chrooting
    # into the install mount point to modprobe efivars. So we use the
    # package snapshot on the Archboot media to ensure our kernel is
    # the same as the one we booted with.
    # 2. Ideally we'd source all local then, but some critical items,
    # notably grub2-efi variants, aren't yet on the Archboot media.
    # Warn
    timer=9
    echo -e "\n\nMAC WARNING: This script is not designed for APPLE MAC installs and will potentially misconfigure boot to your existing OS X installation. STOP NOW IF YOU ARE ON A MAC.\n\n"
    echo -n "GENERAL WARNING: This procedure will completely format /dev/sda. Please cancel with ctrl-c to cancel within $timer seconds..."
    while [[ $timer -gt 0 ]]
    do
    sleep 1
    let timer-=1
    echo -en "$timer seconds..."
    done
    echo "STARTING"
    # Get Network
    echo -n "Waiting for network address.."
    #dhclient eth0
    dhcpcd -p eth0
    echo -n "Network address acquired."
    # Mount packages squashfs images
    umount "/packages/core-$(uname -m)"
    umount "/packages/core-any"
    rm -rf "/packages/core-$(uname -m)"
    rm -rf "/packages/core-any"
    mkdir -p "/packages/core-$(uname -m)"
    mkdir -p "/packages/core-any"
    modprobe -q loop
    modprobe -q squashfs
    mount -o ro,loop -t squashfs "/src/packages/archboot_packages_$(uname -m).squashfs" "/packages/core-$(uname -m)"
    mount -o ro,loop -t squashfs "/src/packages/archboot_packages_any.squashfs" "/packages/core-any"
    # Create temporary pacman.conf file
    cat << PACMANEOF > /tmp/pacman.conf
    [options]
    Architecture = auto
    CacheDir = ${INSTALL_TARGET}/var/cache/pacman/pkg
    CacheDir = /packages/core-$(uname -m)/pkg
    CacheDir = /packages/core-any/pkg
    [core]
    Server = ${FILE_URL}
    Server = ${FTP_URL}
    Server = ${HTTP_URL}
    [extra]
    Server = ${FILE_URL}
    Server = ${FTP_URL}
    Server = ${HTTP_URL}
    #Uncomment to enable pacman -Sy yaourt
    [archlinuxfr]
    Server = http://repo.archlinux.fr/\$arch
    PACMANEOF
    # Prepare pacman
    [[ ! -d "${INSTALL_TARGET}/var/cache/pacman/pkg" ]] && mkdir -m 755 -p "${INSTALL_TARGET}/var/cache/pacman/pkg"
    [[ ! -d "${INSTALL_TARGET}/var/lib/pacman" ]] && mkdir -m 755 -p "${INSTALL_TARGET}/var/lib/pacman"
    ${PACMAN} -Sy
    ${TARGET_PACMAN} -Sy
    # Install prereqs from network (not on archboot media)
    echo -e "\nInstalling prereqs...\n$HR"
    #sed -i "s/^#S/S/" /etc/pacman.d/mirrorlist # Uncomment all Server lines
    UncommentValue S /etc/pacman.d/mirrorlist # Uncomment all Server lines
    ${PACMAN} --noconfirm -Sy gptfdisk btrfs-progs-unstable libusb-compat gnupg
    # Configure Host
    # Here we create three partitions:
    # 1. efi and /boot (one partition does double duty)
    # 2. swap
    # 3. our encrypted root
    # Note that all of these are on a GUID partition table scheme. This proves
    # to be quite clean and simple since we're not doing anything with MBR
    # boot partitions and the like.
    echo -e "format\n"
    # shred -v /dev/sda
    # disk prep
    sgdisk -Z /dev/sda # zap all on disk
    #sgdisk -Z /dev/mmcb1k0 # zap all on sdcard
    sgdisk -a 2048 -o /dev/sda # new gpt disk 2048 alignment
    #sgdisk -a 2048 -o /dev/mmcb1k0
    # create partitions
    sgdisk -n 1:0:+200M /dev/sda # partition 1 (UEFI BOOT), default start block, 200MB
    sgdisk -n 2:0:+4G /dev/sda # partition 2 (SWAP), default start block, 200MB
    sgdisk -n 3:0:0 /dev/sda # partition 3, (LUKS), default start, remaining space
    #sgdisk -n 1:0:1800M /dev/mmcb1k0 # root.gpg
    # set partition types
    sgdisk -t 1:ef00 /dev/sda
    sgdisk -t 2:8200 /dev/sda
    sgdisk -t 3:8300 /dev/sda
    #sgdisk -t 1:0700 /dev/mmcb1k0
    # label partitions
    sgdisk -c 1:"UEFI Boot" /dev/sda
    sgdisk -c 2:"Swap" /dev/sda
    sgdisk -c 3:"LUKS" /dev/sda
    #sgdisk -c 1:"Key" /dev/mmcb1k0
    echo -e "create gpg file\n"
    # create gpg file
    dd if=/dev/urandom bs=512 count=4 | gpg -v --cipher-algo aes256 --digest-algo sha512 -c -a > /root/root.gpg
    echo -e "format LUKS on root\n"
    # format LUKS on root
    gpg -q -d /root/root.gpg 2>/dev/null | cryptsetup -v --key-file=- -c aes-xts-plain -s 512 --hash sha512 luksFormat /dev/sda3
    echo -e "open LUKS on root\n"
    gpg -d /root/root.gpg 2>/dev/null | cryptsetup -v --key-file=- luksOpen /dev/sda3 root
    # NOTE: make sure to add dm_crypt and aes_i586 to MODULES in rc.conf
    # NOTE2: actually this isn't required since we're mounting an encrypted root and grub2/initramfs handles this before we even get to rc.conf
    # make filesystems
    # following swap related commands not used now that we're encrypting our swap partition
    #mkswap /dev/sda2
    #swapon /dev/sda2
    #mkfs.ext4 /dev/sda3 # this is where we'd create an unencrypted root partition, but we're using luks instead
    echo -e "\nCreating Filesystems...\n$HR"
    # make filesystems
    mkfs.ext4 /dev/mapper/root
    mkfs.vfat -F32 /dev/sda1
    #mkfs.vfat -F32 /dev/mmcb1k0p1
    echo -e "mount targets\n"
    # mount target
    #mount /dev/sda3 ${INSTALL_TARGET} # this is where we'd mount the unencrypted root partition
    mount /dev/mapper/root ${INSTALL_TARGET}
    # mount target
    mkdir ${INSTALL_TARGET}
    # mkdir ${INSTALL_TARGET}/key
    # mount -t vfat /dev/mmcb1k0p1 ${INSTALL_TARGET}/key
    mkdir ${INSTALL_TARGET}/boot
    mount -t vfat /dev/sda1 ${INSTALL_TARGET}/boot
    # Install base, necessary utilities
    mkdir -p ${INSTALL_TARGET}/var/lib/pacman
    ${TARGET_PACMAN} -Sy
    ${TARGET_PACMAN} -Su base
    # curl could be installed later but we want it ready for rankmirrors
    ${TARGET_PACMAN} -S curl
    ${TARGET_PACMAN} -S libusb-compat gnupg
    ${TARGET_PACMAN} -R grub
    rm -rf ${INSTALL_TARGET}/boot/grub
    ${TARGET_PACMAN} -S grub2-efi-x86_64
    # Configure new system
    SetValue HOSTNAME ${HOSTNAME} ${INSTALL_TARGET}/etc/rc.conf
    sed -i "s/^\(127\.0\.0\.1.*\)$/\1 ${HOSTNAME}/" ${INSTALL_TARGET}/etc/hosts
    SetValue CONSOLEFONT Lat2-Terminus16 ${INSTALL_TARGET}/etc/rc.conf
    #following replaced due to netcfg
    #SetValue interface eth0 ${INSTALL_TARGET}/etc/rc.conf
    # write fstab
    # You can use UUID's or whatever you want here, of course. This is just
    # the simplest approach and as long as your drives aren't changing values
    # randomly it should work fine.
    cat > ${INSTALL_TARGET}/etc/fstab <<FSTAB_EOF
    # /etc/fstab: static file system information
    # <file system> <dir> <type> <options> <dump> <pass>
    tmpfs /tmp tmpfs nodev,nosuid 0 0
    /dev/sda1 /boot vfat defaults 0 0
    /dev/mapper/cryptswap none swap defaults 0 0
    /dev/mapper/root / ext4 defaults,noatime 0 1
    FSTAB_EOF
    # write etwo
    mkdir -p /lib/initcpio/hooks/
    mkdir -p /lib/initcpio/install/
    cp /src/etwo_hooks /lib/initcpio/hooks/etwo
    cp /src/etwo_install /lib/initcpio/install/etwo
    mkdir -p ${INSTALL_TARGET}/lib/initcpio/hooks/
    mkdir -p ${INSTALL_TARGET}/lib/initcpio/install/
    cp /src/etwo_hooks ${INSTALL_TARGET}/lib/initcpio/hooks/etwo
    cp /src/etwo_install ${INSTALL_TARGET}/lib/initcpio/install/etwo
    # write crypttab
    # encrypted swap (random passphrase on boot)
    echo cryptswap /dev/sda2 SWAP "-c aes-xts-plain -h whirlpool -s 512" >> ${INSTALL_TARGET}/etc/crypttab
    # copy configs we want to carry over to target from install environment
    mv ${INSTALL_TARGET}/etc/resolv.conf ${INSTALL_TARGET}/etc/resolv.conf.orig
    cp /etc/resolv.conf ${INSTALL_TARGET}/etc/resolv.conf
    mkdir -p ${INSTALL_TARGET}/tmp
    cp /tmp/pacman.conf ${INSTALL_TARGET}/tmp/pacman.conf
    # mount proc, sys, dev in install root
    mount -t proc proc ${INSTALL_TARGET}/proc
    mount -t sysfs sys ${INSTALL_TARGET}/sys
    mount -o bind /dev ${INSTALL_TARGET}/dev
    echo -e "umount boot\n"
    # we have to remount /boot from inside the chroot
    umount ${INSTALL_TARGET}/boot
    # Create install_efi script (to be run *after* chroot /install)
    touch ${INSTALL_TARGET}/install_efi
    chmod a+x ${INSTALL_TARGET}/install_efi
    cat > ${INSTALL_TARGET}/install_efi <<EFI_EOF
    # functions (these could be a library, but why overcomplicate things
    SetValue () { VALUENAME="\$1" NEWVALUE="\$2" FILEPATH="\$3"; sed -i "s+^#\?\(\${VALUENAME}\)=.*\$+\1=\${NEWVALUE}+" "\${FILEPATH}"; }
    CommentOutValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^\(\${VALUENAME}.*\)\$/#\1/" "\${FILEPATH}"; }
    UncommentValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^#\(\${VALUENAME}.*\)\$/\1/" "\${FILEPATH}"; }
    echo -e "mount boot\n"
    # remount here or grub et al gets confused
    mount -t vfat /dev/sda1 /boot
    # mkinitcpio
    # NOTE: intel_agp drm and i915 for intel graphics
    SetValue MODULES '\\"dm_mod dm_crypt aes_x86_64 ext2 ext4 vfat intel_agp drm i915\\"' /etc/mkinitcpio.conf
    SetValue HOOKS '\\"base udev pata scsi sata usb usbinput keymap consolefont etwo encrypt filesystems\\"' /etc/mkinitcpio.conf
    SetValue BINARIES '\\"/usr/bin/gpg\\"' /etc/mkinitcpio.conf
    mkinitcpio -p linux
    # kernel modules for EFI install
    modprobe efivars
    modprobe dm-mod
    # locale-gen
    UncommentValue de_AT /etc/locale.gen
    locale-gen
    # install and configure grub2
    # did this above
    #${CHROOT_PACMAN} -Sy
    #${CHROOT_PACMAN} -R grub
    #rm -rf /boot/grub
    #${CHROOT_PACMAN} -S grub2-efi-x86_64
    # you can be surprisingly sloppy with the root value you give grub2 as a kernel option and
    # even omit the cryptdevice altogether, though it will wag a finger at you for using
    # a deprecated syntax, so we're using the correct form here
    # NOTE: take out i915.modeset=1 unless you are on intel graphics
    SetValue GRUB_CMDLINE_LINUX '\\"cryptdevice=/dev/sda3:root cryptkey=/dev/sda1:vfat:/root.gpg add_efi_memmap i915.i915_enable_rc6=1 i915.i915_enable_fbc=1 i915.lvds_downclock=1 pcie_aspm=force quiet\\"' /etc/default/grub
    # set output to graphical
    SetValue GRUB_TERMINAL_OUTPUT gfxterm /etc/default/grub
    SetValue GRUB_GFXMODE 960x600x32,auto /etc/default/grub
    SetValue GRUB_GFXPAYLOAD_LINUX keep /etc/default/grub # comment out this value if text only mode
    # install the actual grub2. Note that despite our --boot-directory option we will still need to move
    # the grub directory to /boot/grub during grub-mkconfig operations until grub2 gets patched (see below)
    grub_efi_x86_64-install --bootloader-id=grub --no-floppy --recheck
    # create our EFI boot entry
    # bug in the HP bios firmware (F.08)
    efibootmgr --create --gpt --disk /dev/sda --part 1 --write-signature --label "ARCH LINUX" --loader "\\\\grub\\\\grub.efi"
    # copy font for grub2
    cp /usr/share/grub/unicode.pf2 /boot/grub
    # generate config file
    grub-mkconfig -o /boot/grub/grub.cfg
    exit
    EFI_EOF
    # Install EFI using script inside chroot
    chroot ${INSTALL_TARGET} /install_efi
    rm ${INSTALL_TARGET}/install_efi
    # Post install steps
    # anything you want to do post install. run the script automatically or
    # manually
    touch ${INSTALL_TARGET}/post_install
    chmod a+x ${INSTALL_TARGET}/post_install
    cat > ${INSTALL_TARGET}/post_install <<POST_EOF
    set -o errexit
    set -o nounset
    # functions (these could be a library, but why overcomplicate things
    SetValue () { VALUENAME="\$1" NEWVALUE="\$2" FILEPATH="\$3"; sed -i "s+^#\?\(\${VALUENAME}\)=.*\$+\1=\${NEWVALUE}+" "\${FILEPATH}"; }
    CommentOutValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^\(\${VALUENAME}.*\)\$/#\1/" "\${FILEPATH}"; }
    UncommentValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^#\(\${VALUENAME}.*\)\$/\1/" "\${FILEPATH}"; }
    # root password
    echo -e "${HR}\\nNew root user password\\n${HR}"
    passwd
    # add user
    echo -e "${HR}\\nNew non-root user password (username:${USERNAME})\\n${HR}"
    groupadd sudo
    useradd -m -g users -G audio,lp,optical,storage,video,games,power,scanner,network,sudo,wheel -s /bin/bash ${USERNAME}
    passwd ${USERNAME}
    # mirror ranking
    echo -e "${HR}\\nRanking Mirrors (this will take a while)\\n${HR}"
    cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.orig
    mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.all
    sed -i "s/#S/S/" /etc/pacman.d/mirrorlist.all
    rankmirrors -n 5 /etc/pacman.d/mirrorlist.all > /etc/pacman.d/mirrorlist
    # temporary fix for locale.sh update conflict
    mv /etc/profile.d/locale.sh /etc/profile.d/locale.sh.preupdate || true
    # yaourt repo (add to target pacman, not tmp pacman.conf, for ongoing use)
    echo -e "\\n[archlinuxfr]\\nServer = http://repo.archlinux.fr/\\\$arch" >> /etc/pacman.conf
    echo -e "\\n[haskell]\\nServer = http://www.kiwilight.com/\\\$repo/\\\$arch" >> /etc/pacman.conf
    # additional groups and utilities
    pacman --noconfirm -Syu
    pacman --noconfirm -S base-devel
    pacman --noconfirm -S yaourt
    # sudo
    pacman --noconfirm -S sudo
    cp /etc/sudoers /tmp/sudoers.edit
    sed -i "s/#\s*\(%wheel\s*ALL=(ALL)\s*ALL.*$\)/\1/" /tmp/sudoers.edit
    sed -i "s/#\s*\(%sudo\s*ALL=(ALL)\s*ALL.*$\)/\1/" /tmp/sudoers.edit
    visudo -qcsf /tmp/sudoers.edit && cat /tmp/sudoers.edit > /etc/sudoers
    # power
    pacman --noconfirm -S acpi acpid acpitool cpufrequtils
    yaourt --noconfirm -S powertop2
    sed -i "/^DAEMONS/ s/)/ @acpid)/" /etc/rc.conf
    sed -i "/^MODULES/ s/)/ acpi-cpufreq cpufreq_ondemand cpufreq_powersave coretemp)/" /etc/rc.conf
    # following requires my acpi handler script
    echo "/etc/acpi/handler.sh boot" > /etc/rc.local
    # time
    pacman --noconfirm -S ntp
    sed -i "/^DAEMONS/ s/hwclock /!hwclock @ntpd /" /etc/rc.conf
    # wireless (wpa supplicant should already be installed)
    pacman --noconfirm -S iw wpa_supplicant rfkill
    pacman --noconfirm -S netcfg wpa_actiond ifplugd
    mv /etc/wpa_supplicant.conf /etc/wpa_supplicant.conf.orig
    echo -e "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=network\nupdate_config=1" > /etc/wpa_supplicant.conf
    # make sure to copy /etc/network.d/examples/wireless-wpa-config to /etc/network.d/home and edit
    sed -i "/^DAEMONS/ s/)/ @net-auto-wireless @net-auto-wired)/" /etc/rc.conf
    sed -i "/^DAEMONS/ s/ network / /" /etc/rc.conf
    echo -e "\nWIRELESS_INTERFACE=wlan0" >> /etc/rc.conf
    echo -e "WIRED_INTERFACE=eth0" >> /etc/rc.conf
    echo "options iwlagn led_mode=2" > /etc/modprobe.d/iwlagn.conf
    # sound
    pacman --noconfirm -S alsa-utils alsa-plugins
    sed -i "/^DAEMONS/ s/)/ @alsa)/" /etc/rc.conf
    mv /etc/asound.conf /etc/asound.conf.orig || true
    #if alsamixer isn't working, try alsamixer -Dhw and speaker-test -Dhw -c 2
    # video
    pacman --noconfirm -S base-devel mesa mesa-demos
    # x
    #pacman --noconfirm -S xorg xorg-xinit xorg-utils xorg-server-utils xdotool xorg-xlsfonts
    #yaourt --noconfirm -S xf86-input-wacom-git # NOT NEEDED? input-wacom-git
    #TODO: cut down the install size
    #pacman --noconfirm -S xorg-server xorg-xinit xorg-utils xorg-server-utils
    # TODO: wacom
    # environment/wm/etc.
    #pacman --noconfirm -S xfce4 compiz ccsm
    #pacman --noconfirm -S xcompmgr
    #yaourt --noconfirm -S physlock unclutter
    #pacman --noconfirm -S rxvt-unicode urxvt-url-select hsetroot
    #pacman --noconfirm -S gtk2 #gtk3 # for taffybar?
    #pacman --noconfirm -S ghc
    # note: try installing alex and happy from cabal instead
    #pacman --noconfirm -S haskell-platform haskell-hscolour
    #yaourt --noconfirm -S xmonad-darcs xmonad-contrib-darcs xcompmgr
    #yaourt --noconfirm -S xmobar-git
    # TODO: edit xfce to use compiz
    # TODO: xmonad, but deal with video tearing
    # TODO: xmonad-darcs fails to install from AUR. haskell dependency hell.
    # switching to cabal
    # fonts
    pacman --noconfirm -S terminus-font
    yaourt --noconfirm -S webcore-fonts
    yaourt --noconfirm -S fontforge libspiro
    yaourt --noconfirm -S freetype2-git-infinality
    # TODO: sed infinality and change to OSX or OSX2 mode
    # and create the sym link from /etc/fonts/conf.avail to conf.d
    # misc apps
    #pacman --noconfirm -S htop openssh keychain bash-completion git vim
    #pacman --noconfirm -S chromium flashplugin
    #pacman --noconfirm -S scrot mypaint bc
    #yaourt --noconfirm -S task-git stellarium googlecl
    # TODO: argyll
    POST_EOF
    # Post install in chroot
    #echo "chroot and run /post_install"
    chroot /install /post_install
    rm /install/post_install
    # copy grub.efi file to the default HP EFI boot manager path
    mkdir -p ${INSTALL_TARGET}/boot/EFI/Microsoft/BOOT/
    mkdir -p ${INSTALL_TARGET}/boot/EFI/BOOT/
    cp ${INSTALL_TARGET}/boot/grub/grub.efi ${INSTALL_TARGET}/boot/EFI/Microsoft/BOOT/bootmgfw.efi
    cp ${INSTALL_TARGET}/boot/grub/grub.efi ${INSTALL_TARGET}/boot/EFI/BOOT/BOOTX64.EFI
    cp /root/root.gpg ${INSTALL_TARGET}/boot/
    # NOTES/TODO

  • [HOWTO] Installing Arch Linux stable release on Acer Aspire One 522

    [This is a work on progress and my first howto ever]
    These steps will teach you how to install ArchLinux x64 stable release (currently 2010.05) on Acer Aspire One 522 from an existing ArchLinux (your desktop computer)
    As you need a 2.6.37+ kernel to make networking work on the AO522, installing stable release as is won't work.
    This Howto borns with the intention to address this problem.
    You need to be familiarized with Linux internals to follow this howto.
    (Expect this howto to become useless with new stable releases of ArchLinux.)
    Remember to make a backup of your Windows 7 Starter system before installing ArchLinux.
    I did a full raw copy of the harddisk by using systemrescuecd, an external harddisk and dd utility:
    Just boot with systemrescuecd
    Mount your external harddisk on /mnt/floppy for example
    Clone harddisk with: dd if=/dev/sda |gzip -c > /mnt/floppy/ao522.img
    This process took me a lot of time since my external harddisk is USB-1 (almost an entire evening)
    Result image was about 22GB size
    This image will restore partition table, boot sector and all data if things go wrong.
    I followed some of the steps from this guide: https://wiki.archlinux.org/index.php/In … ting_Linux
    If you have some Gentoo Linux experience you will find those steps really familiar.
    You will need 2 USB pendrives or similar storage options.
    One is needed to boot into your netbook, and the other to store our custom archlinux build.
    Making an updated ArchLinux system
    1) Make a local dir on your existing linux system
    # mkdir ./newarch
    2) Install pacman database on it
    # pacman -Sy -r ./newarch
    3) Install base system
    # pacman -S base -r ./newarch
    4) Let's chroot inside
    # cp /etc/resolv.conf ./newarch/etc/
    # cp /etc/pacman.d/mirrorlist ./newarch/etc/pacman.d
    # mount -t proc proc ./newarch/proc
    # mount -t sysfs sys ./newarch/sys
    # mount -o bind /dev ./newarch/dev
    # chroot ./newarch /bin/bash
    5) Edit configuration files
    # nano -w /etc/rc.conf
    # nano -w /etc/hosts
    # nano -w /etc/mkinitcpio.conf
    Forget /etc/fstab for now since you don't know what partitions to use yet
    6) Generate kernel image
    # mkinitcpio -p kernel26
    7) Generate locales
    # nano -w /etc/locale.gen
    # locale-gen
    8) Make a tarball with our custom ArchLinux
    # exit
    # umount ./newarch/proc
    # umount ./newarch/dev
    # umount ./newarch/sys
    # tar -cvpf newarch.tar ./newarch
    9) Copy this tarball to an USB pendrive or external harddisk
    10) Boot your netbook with a Linux bootable USB stick (I used systemrescuecd, and remember to pick the x64 bit kernel at grub screen)
    You can use any linux distribution with usb bootable options. I suppose ArchLinux works too
    To install SystemRescueCD on an USB stick follow this tutorial -> SystemRescueCD on usb stick
    Insert the usb stick on your netbook, switch on, hit F2 to enter BIOS menu, and choose to boot from USB as first option. Save and Exit.
    You should be booting into SystemRescueCD without any problem.
    After initialization you will end in a root prompt.
    11) Let's partition the disk
    You will find 3 partitions if this is your first time:
    /dev/sda1 2048 29362175 14680064 27 Hidden NTFS WinRE
    /dev/sda2 * 29362176 29566975 102400 7 HPFS/NTFS/exFAT
    /dev/sda3 29566976 488397167 229312696 7 HPFS/NTFS/exFAT
    My recomendation is to leave sda1 and sda2 intact, as they have the recovery information to restore Windows 7 Starter
    You have plenty of space with sda3, about 230G.
    So run fdisk/cfdisk and delete /dev/sda3
    Now create a 100M partition for boot
    Now create a Extended partition with all the space left
    Now create a 1GB logical partition for swap
    Now create a 10-15 GB  logical partition for root system
    And finally a logical partition for our home partition with all space left
    Your partition table should look like this:
    /dev/sda1 2048 29362175 14680064 27 Hidden NTFS WinRE
    /dev/sda2 * 29362176 29566975 102400 7 HPFS/NTFS/exFAT
    /dev/sda3 29566976 29771775 102400 83 Linux
    /dev/sda4 29771776 488397167 229312696 5 Extended
    /dev/sda5 29773824 31821823 1024000 83 Linux
    /dev/sda6 31823872 63281151 15728640 83 Linux
    /dev/sda7 63283200 488397167 212556984 83 Linux
    12) Create filesystems
    I choosed ext2 for boot, and reiserfs for root and home partitions.
    # mke2fs /dev/sda3
    # mkreiserfs /dev/sda6
    # mkreiserfs /dev/sda7
    # mkswap /dev/sda5
    13) Mount partitions
    # mkdir arch
    # mount /dev/sda6 arch
    # mkdir arch/boot
    # mount /dev/sda3 arch/boot
    # mkdir arch/home
    # mount /dev/sda7 arch/home
    14) Copy our custom ArchLinux build on it
    # mount /dev/sdb1 /mnt/floppy (for example)
    # cd arch
    # tar -xvpf /mnt/flopy/newarch.tar
    15) Configure /etc/fstab
    Mine is as follows:
    devpts /dev/pts devpts defaults 0 0
    shm /dev/shm tmpfs nodev,nosuid 0 0
    /dev/sda3 /boot ext2 defaults 0 1
    /dev/sda6 / reiserfs defaults 0 1
    /dev/sda7 /home reiserfs defaults 0 1
    /dev/sda5 swap swap defaults 0 0
    16) Chroot in your new system
    # mount -t proc proc ./proc
    # mount -t sysfs sys ./sys
    # mount -o bind /dev ./dev
    # chroot ./ /bin/bash
    17) Install grub
    # grub-install
    Edit /boot/grub/menu.lst to suit your needs
    Mine looks like this:
    timeout 5
    default 0
    color light-blue/black light-cyan/blue
    title Arch Linux
    root (hd0,2)
    kernel /vmlinuz26 root=/dev/sda6 ro
    initrd /kernel26.img
    title Arch Linux Fallback
    root (hd0,2)
    kernel /vmlinuz26 root=/dev/sda6 ro
    initrd /kernel26-fallback.img
    title Windows 7 Recovery
    rootnoverify (hd0,0)
    makeactive
    chainloader +1
    As you see, you can restore Windows 7 Starter from Grub.
    18) Change root password
    # passwd
    19) Add a regular  user account
    # useradd -G video,audio,users -m username
    # passwd username
    20) You're done!
    # exit
    # cd ..
    # umount ./arch/proc
    # umount ./arch/dev
    # umount ./arch/sys
    # umount ./arch/boot
    # umount ./arch/
    # reboot
    Remove the usb stick from your netbook.
    If all went ok, you will be inside your new stable and updated ArchLinux system
    Next post is reserved for software configurations specific to the Acer Aspire One 522
    Last edited by tigrezno (2011-04-20 12:22:38)

    Using acpid to achieve the following:
    - Change screen brightness when operating in battery mode
    - Power off when the power button is pressed
    - Suspend when the lid is down
    - Reduce CPU frequency speed to maximize battery usage
    Remember that system suspend is only supported by ati free driver xf86-video-ati
    1) Install acpid daemon and cpufrequtils
    # pacman -S apcid cpufrequtils
    2) edit acpid handler script
    # nano -w /etc/acpi/handler.sh
    Change the following section:
    ac_adapter)
    case "$2" in
    AC)
    case "$4" in
    00000000)
    echo -n $minspeed >$setspeed
    #/etc/laptop-mode/laptop-mode start
    00000001)
    echo -n $maxspeed >$setspeed
    #/etc/laptop-mode/laptop-mode stop
    esac
    *) logger "ACPI action undefined: $2" ;;
    esac
    for:
    ac_adapter)
    case "$2" in
    ACAD)
    case "$4" in
    00000000)
    echo 3 > /sys/devices/virtual/backlight/acpi_video0/brightness
    cpufreq-set -c 0 -f 800Mhz
    cpufreq-set -c 1 -f 800Mhz
    00000001)
    echo 9 > /sys/devices/virtual/backlight/acpi_video0/brightness
    cpufreq-set -c 0 -f 1000Mhz
    cpufreq-set -c 1 -f 1000Mhz
    esac
    *) logger "ACPI action undefined: $2" ;;
    esac
    Make sure you changed AC) for ACAD)
    Now change this other section:
    button/power)
    #echo "PowerButton pressed!">/dev/tty5
    case "$2" in
    PWRF) logger "PowerButton pressed: $2" ;;
    *) logger "ACPI action undefined: $2" ;;
    esac
    with:
    button/power)
    #echo "PowerButton pressed!">/dev/tty5
    case "$2" in
    PWRF) poweroff ;;
    *) logger "ACPI action undefined: $2" ;;
    esac
    Change:
    button/lid)
    #echo "LID switched!">/dev/tty5
    logger "ACPI group/action undefined: $1 / $2"
    for:
    button/lid)
    pm-suspend && /etc/rc.d/network restart
    logger "ACPI group/action undefined: $1 / $2"
    Network restart is used because wlan0 will disconnect from AP after some time. You can try using iwconfig wlan0 essid <ap> key <key> instead of the network script, but haven't tested it myself.
    3) Start acpid and load modules
    # modprobe powernow-k8
    # /etc/rc.d/acpid start
    Add "acpid" to DAEMONS in /etc/rc.conf to start on boot
    Add "powernow-k8" to the modules sections on /etc/rc.conf to load at boot
    Stopping system freezes due to ethernet driver
    The only way people have found to avoid freezes is by blacklisting atheros kernel drivers.
    To do it at boot just edit /etc/rc.conf and change the MODULES line as this:
    MODULES=(!ath9k !atl1c)
    Reboot and you're done, but remember to not press the Wifi key, because it can freeze your system.
    Correctly starting wireless at boot
    I've found that standard scripts wont load properly my wireless lan. It gave an error telling you to use the WIRELESS_TIMEOUT variable and such.
    To solve this, edit /etc/rc.d/network script and change the wi_up function by adding a second iwconfig command like this:
    wi_up()
    eval iwcfg="\$wlan_${1}"
    [[ ! $iwcfg ]] && return 0
    /usr/sbin/iwconfig $iwcfg
    [[ $WIRELESS_TIMEOUT ]] || WIRELESS_TIMEOUT=2
    sleep $WIRELESS_TIMEOUT
    /usr/sbin/iwconfig $iwcfg
    bssid=$(iwgetid $1 -ra)
    It will do the trick and will start at boot correctly. This is not a solution but a fix.
    Adjust Touchpad to disable false taps
    What I did here is defining an area to be ignored. This area are 3 rectangles on top, left and right of the touchpad.
    This means you can write and press space without having the cursor click out of the window and such.
    # synclient AreaLeftEdge=150
    # synclient AreaRightEdge=1300
    # synclient AreaTopEdge=300
    Also, add it to your /etc/X11/xorg.conf.d/10-evdev.conf:
    Section "InputClass"
    Identifier "evdev touchpad catchall"
    MatchIsTouchpad "on"
    MatchDevicePath "/dev/input/event*"
    Driver "evdev"
    Option "AreaTopEdge" "300"
    Option "AreaLeftEdge" "150"
    Option "AreaRightEdge" "1300"
    EndSection
    You can play with those values. They just work for me.
    Last edited by tigrezno (2011-04-23 13:49:48)

  • Is there an Arch Linux equivalent of debconf?

    I have a debian based configuration that I roll out to clients using a scripted installation.  Essentially, the base system is imaged onto the box (currently RaspberryPi) then my script and an archive containing extra files I want to push is copied to the card.  The script runs and performs some automated tasks like downloading firmware, updating/upgrading packages and then installing the packages I need.  For some packages (e.g. mysql and phpmyadmin), I use debconf in order to set the answers to the installation questions  - this allows a completely unattended installation.  This script also works on a regular Debian system - I can pass parameters to switch off functionality that isn't required on a desktop (e.g. the RPi firmware update or HostAPD installation) and the same script can commission a dev environment for me to work on.
    I'm now looking to support other SBCs like the HummingBoard or perhaps the BananaPi which means I need to consider a platform that would work universally across any platform.  So, I am looking at the feasibility of Arch Linux.  From what I have read, it would probably suit my needs a lot better as it starts off as a very minimal installation.  However I'm struggling to find a definitive alternative to debconf for performing my unattended installation.
    My less preferred option would be to build an image by hand and then script the package updates, but this would put me in the realms of having to maintain images for each platform I end up supporting rather than having a script that would build the config on any supported system with latest packages.

    There is interaction:
    * you may be be prompted to OK removing package A and installing package B - happens when renaming packages via package conflicts e.g.
    :: lzo2 and lzo are in conflict. Remove lzo? [y/N]
    * you are asked to pick packages from a group or which one of the packages providing the thing you want to install, e.g. when installing libgl or phonon
    $ sudo pacman -S phonon
    resolving dependencies...
    :: There are 2 providers available for phonon-qt4-backend:
    :: Repository extra
    1) phonon-qt4-gstreamer 2) phonon-qt4-vlc
    Enter a number (default=1):

  • Arch Linux 0.7.1 - my feedback

    please read the post before vote
    Well, I've used Arch linux for many months in late 2004 / early 2005 and then I've switched to Ubuntu...
    some days ago I've installed version 0.7.1 and updated it with pacman -Syu
    I've seen a lot of improvement since the last time I used it and I was near to think "ok let's switch back to Arch" until I found I that thing I really hate  :!: is still here..
    You can't install old versions of some packages. For example, kernel.. or.. php (ok there is one in Aur that is maybe "too" old) and mysql..
    in the php/mysql example it's true that version 5 is the latest one but they (at least php) still develope the 4.x version for security and many server still have it and also many scripts supports only php4 and 5.
    also, as I am a php developer, I need to test scripts with old versions.
    but as I said this is just an example. I think that while you can't think to have a big repository of binaries it would be great to be able to install old versions via source.
    and recompiling software by hand using old PKGBUILDS is a problem case you don't have a tool that tells you wich packaged were "aligned" with wich.. I mean.. the new php works only with the mysql5 extension so even if you build mysql by yourself it won't work with php.. and so on for apache..
    anyway.. if a user is able to block a package and prevent the automatic update he should also be able to use the non-latest version of it.
    I know that arch is a bleeding edge distro but this shouldn't mean that you have only the bleeding things. (see gentoo for example)
    Another thing that will help a lot in my opinion is to have in the wiki 2 lists:
    - one very detailed with available daemons and their use.. for example.. ok.. fam is the file alteration monitor.. but why you need it and wich are the main programs that takes advantage from it and what happens if you doesn't run it? and so on for hal, etc. ..
    - one list with all available standard groups that tells user to wich group subscribe in order to be able to performe a specific action
    imho this 2 lists will help the (new) user understand better what is doing and why The arch philosophy of "do it yourself  and learn doing it" is great but have to be encouraged, and in fact there already is a very good documentation.
    Just my 2 cents. And sorry if some one else already said this before; in this case take my post as an underline mark btw.. I'll attach a poll to it.
    bye,
    Giovanni.

    iphitus wrote:To me this thread looks more like "i dont want to make a second package for myself, so let's get the devs to do it".
    hmm.. this sounds a bit offenisve to me. Cause I don't actually need that packages as I'm not using Arch as main distro. This post was meant to give a feedback..
    iphitus wrote:Especially as there isnt a huge demand for such a package, and you are most likely to be one of a very small minority to use that duplicate package.
    ok I agree with this. but from my point of view it is because users that needed it too already switched to another distro..
    and this leads us to this:
    tomk wrote:I voted "No, there is no need", because I think this is simply an indication that Arch is not the right distro for you - it doesn't meet your requirements.
    Imho, the point is that Arch have a lot of great features. The one I'd like to have is a feature that I think will just increase the number of great features Arch already have and will make Arch the right distro for more users. So users that switch to another distro will lose a lot of features that they like to get one or two that they need..
    tomk wrote:This "thing that you really hate" is still there because firstly the Arch devs, and secondly Arch users, have not needed to change it. If you want to work "from within" to change that, with polls like this, feature requests, etc, I wish you the best of luck, but I think your poll result so far should tell you something about the support you can expect.
    the poll was mainly for myself to get an idea of the users opinion not to change the things. And as I said it is not a change from my point of view, but just a new feature. About Arch devs I agree but about users I don't.. how you can say it if you say to me that I should change distro? In this way people that thinks like me will always remain a minority in arch community. And I don't think that having a old version of a "core" package would be against the Arch philosophy.
    tomk wrote:Finally a general point, and this applies to wiki entries as well - you will get a better response if you do something, and then ask "what do you think?" instead of asking "Why doesn't Arch do this?"
    I did it for the software thing with the poll and anyway also for the wiki I didn't wrote it but I thought it was clear.. For the wiki I posted my idea and there was no need for the question "what do you think" cause is a discussion forum Also please keep in mind that I wrote the original post in late night and that I'm italian so my english isn't so good  :oops:
    anyway.. thanks for the tip about subit a feature request and for your answers.
    bye,
    Giovanni.

  • Kalu: Keeping Arch Linux Up-to-date

    Hi all,
    Yes, there are already a few “update notifier” out there, but I couldn’t find one that would fit my needs (granted I didn’t search too hard, I was also interested in making my own as a fun exercice…) so I decided to make a new one.
    kalu (which could stand for “Keeping Arch Linux Up-to-date”) is a small application that will add an icon to your systray and sit there, regularly checking if there’s anything new for you to upgrade. As soon as it finds something, it’ll show a notification to let you know about it. (In other words, revolutionary. )
    What kalu can check for:
    - updated packages (A word about this: kalu does not sync your "actual" databases, to avoid potential problems, but instead uses temporary copies of the dbs.)
    - updated watched packages (i.e. packages not installed, but for which you still wanna know when there's an update)
    - updated AUR packages
    - updated watched AUR packages (same as watched ones, but for AUR packages. Who would've guessed?)
    - news (from archlinux.org)
    (on its tooltip, kalu can also report how many (if any) dbs can be synced)
    When system/AUR upgrades are available, notifications can include a button to start the system/AUR upgrades. You can specify the command line to be executed when the button is clicked.
    And for the fun of it, it comes with an integrated "system updater," to do what `pacman -Syu` does but in a GTK GUI. Because why not? Also, I wanted one. :-)
    The system updater can also execute one (or more) command lines of your choice after a successfull upgrade, and you can use a variable ($PACKAGES) to be replaced by the list of upgraded packages. (Note that the list actually is of all packages involved in the sysupgrade, i.e. also those removed or added, e.g. when a package is replaced by another one.)
    If you don't like it/the idea of a graphical system updater, and not using it isn't enough, you can use configure option --disable-updater and turn kalu into a notifier only.
    From v1.1.0 onwards, two command line options - --manual-checks (-m) and --auto-checks (-a) - allow to run manual/auto checks from command line. No GUI will be used at all, everything gets printed on stderr/stdout (using the same templates as for notifications).
    This can be done without the need for a DISPLAY/running X server (i.e. no GTK init performed), thus works from a tty or through SSH. This can also be useful to use kalu from scripts.
    Alongside those options is a configure option (--disable-gui) to make kalu a small CLI-only binary (i.e. no dependency to GTK nor libnotify), which could be useful on GUIless box (e.g. servers), where kalu can then still be used to check for upgrades, watched packages, etc
    With v1.2.0 it is now possible to have kalu re-show the last notifications. So if you missed them or forgot what it was about, one click will re-show all notifications instantly without the need to ran the checks again. And, somewhat similarly to what happens after a system upgrade using kalu's updater, you can now use variable $PACKAGES on the command line to perform AUR updates. Can be useful to start some helper/script to handle the update of those packages automatically for you.
    Also note that kalu's source code (and issue tracker) has been moved to a git repo (was mercurial before), and is now hosted on github.
    Thanks to Painless Rob for his great icons.
    Links:
    - Slightly more verbose description
    - Source code
    - PKGBUILD in the AUR
    - Complete changelog
    Hopefully someone may find it useful.
    Cheers,
    -jacky
    Edit: Added info about recent changes/additions to latest version.
    Last edited by jjacky (2012-09-15 11:37:49)

    OK - a quick report.
    The news does not appear to have a 'mark read' button.
    Here is the debug;
    [neil@arch ~]$ sudo kalu --debug
    [08:34:02] debug mode enabled
    [08:34:02] config: attempting to read file /root/.config/kalu/kalu.conf
    [08:34:02] config: finished parsing /root/.config/kalu/kalu.conf
    [08:34:02] config: attempting to read file /root/.config/kalu/watched.conf
    [08:34:02] config: finished parsing /root/.config/kalu/watched.conf
    [08:34:02] config: attempting to read file /root/.config/kalu/watched-aur.conf
    [08:34:02] config: finished parsing /root/.config/kalu/watched-aur.conf
    [08:34:02] config: attempting to read file /root/.config/kalu/news.conf
    [08:34:02] config: finished parsing /root/.config/kalu/news.conf
    [08:34:04] downloading http://www.archlinux.org/feeds/news/
    [08:34:05] downloaded 12335 bytes
    [08:34:05] -> Minimum kernel requirement 2.6.32
    [08:34:05] -> libpng/libtiff rebuilds move from [testing]
    [08:34:05] -> Arch Linux @ FOSDEM 2012
    [08:34:05] -> kmod replaces module-init-tools
    [08:34:05] -> pacman 4 moves to [core]
    [08:34:05] -> Users of unofficial kernels must enable devtmpfs support
    [08:34:05] -> filesystem upgrade - manual intervention required
    [08:34:05] -> wiki and bbs downtime
    [08:34:05] -> initscripts update - manual intervention required
    [08:34:05] -> Hostname utility moved from net-tools to inetutils
    [08:34:05] parsing pacman.conf (/etc/pacman.conf) for options
    [08:34:05] config: attempting to read file /etc/pacman.conf
    [08:34:05] config: new section 'options'
    [08:34:05] config: SyncFirst: pacman
    [08:34:05] config: arch: x86_64
    [08:34:05] config: checkspace
    [08:34:05] config: SigLevel: Never
    [08:34:05] config: new section 'core'
    [08:34:05] config file /etc/pacman.conf, line 82: including /etc/pacman.d/mirrorlist
    [08:34:05] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:05] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:05] config: new section 'extra'
    [08:34:05] config file /etc/pacman.conf, line 86: including /etc/pacman.d/mirrorlist
    [08:34:05] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:05] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:05] config: new section 'community'
    [08:34:05] config file /etc/pacman.conf, line 94: including /etc/pacman.d/mirrorlist
    [08:34:05] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:05] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:05] config: new section 'multilib'
    [08:34:05] config file /etc/pacman.conf, line 105: including /etc/pacman.d/mirrorlist
    [08:34:05] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:05] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:05] config: new section 'archlinuxfr'
    [08:34:05] config: finished parsing /etc/pacman.conf
    [08:34:05] setting up libalpm
    [08:34:05] creating local db
    [08:34:05] created tmp folder /tmp/kalu-YB259V
    [08:34:05] created symlink /tmp/kalu-YB259V/local
    [08:34:05] created folder /tmp/kalu-YB259V/sync
    [08:34:05] copying /var/lib/pacman/sync/multilib.db to /tmp/kalu-YB259V/sync/multilib.db
    [08:34:05] ..done
    [08:34:05] updated time for /tmp/kalu-YB259V/sync/multilib.db
    [08:34:05] copying /var/lib/pacman/sync/archlinuxfr.db to /tmp/kalu-YB259V/sync/archlinuxfr.db
    [08:34:05] ..done
    [08:34:05] updated time for /tmp/kalu-YB259V/sync/archlinuxfr.db
    [08:34:05] copying /var/lib/pacman/sync/extra.db to /tmp/kalu-YB259V/sync/extra.db
    [08:34:05] ..done
    [08:34:05] updated time for /tmp/kalu-YB259V/sync/extra.db
    [08:34:05] copying /var/lib/pacman/sync/community.db to /tmp/kalu-YB259V/sync/community.db
    [08:34:05] ..done
    [08:34:05] updated time for /tmp/kalu-YB259V/sync/community.db
    [08:34:05] copying /var/lib/pacman/sync/core.db to /tmp/kalu-YB259V/sync/core.db
    [08:34:05] ..done
    [08:34:05] updated time for /tmp/kalu-YB259V/sync/core.db
    [08:34:05] register core
    [08:34:05] add server http://mir1.archlinux.fr/archlinux/core/os/x86_64 into core
    [08:34:05] add server http://archlinux.mirror.dkm.cz/pub/archlinux/core/os/x86_64 into core
    [08:34:05] add server http://archlinux.mirror.kangaroot.net/core/os/x86_64 into core
    [08:34:05] add server http://ftp.uni-kl.de/pub/linux/archlinux/core/os/x86_64 into core
    [08:34:05] add server http://archlinux.mirror.root.lu/core/os/x86_64 into core
    [08:34:05] add server http://ftp.halifax.rwth-aachen.de/archlinux/core/os/x86_64 into core
    [08:34:05] register extra
    [08:34:05] add server http://mir1.archlinux.fr/archlinux/extra/os/x86_64 into extra
    [08:34:05] add server http://archlinux.mirror.dkm.cz/pub/archlinux/extra/os/x86_64 into extra
    [08:34:05] add server http://archlinux.mirror.kangaroot.net/extra/os/x86_64 into extra
    [08:34:05] add server http://ftp.uni-kl.de/pub/linux/archlinux/extra/os/x86_64 into extra
    [08:34:05] add server http://archlinux.mirror.root.lu/extra/os/x86_64 into extra
    [08:34:05] add server http://ftp.halifax.rwth-aachen.de/archlinux/extra/os/x86_64 into extra
    [08:34:05] register community
    [08:34:05] add server http://mir1.archlinux.fr/archlinux/community/os/x86_64 into community
    [08:34:05] add server http://archlinux.mirror.dkm.cz/pub/archlinux/community/os/x86_64 into community
    [08:34:05] add server http://archlinux.mirror.kangaroot.net/community/os/x86_64 into community
    [08:34:05] add server http://ftp.uni-kl.de/pub/linux/archlinux/community/os/x86_64 into community
    [08:34:05] add server http://archlinux.mirror.root.lu/community/os/x86_64 into community
    [08:34:05] add server http://ftp.halifax.rwth-aachen.de/archlinux/community/os/x86_64 into community
    [08:34:05] register multilib
    [08:34:05] add server http://mir1.archlinux.fr/archlinux/multilib/os/x86_64 into multilib
    [08:34:05] add server http://archlinux.mirror.dkm.cz/pub/archlinux/multilib/os/x86_64 into multilib
    [08:34:05] add server http://archlinux.mirror.kangaroot.net/multilib/os/x86_64 into multilib
    [08:34:05] add server http://ftp.uni-kl.de/pub/linux/archlinux/multilib/os/x86_64 into multilib
    [08:34:05] add server http://archlinux.mirror.root.lu/multilib/os/x86_64 into multilib
    [08:34:05] add server http://ftp.halifax.rwth-aachen.de/archlinux/multilib/os/x86_64 into multilib
    [08:34:05] register archlinuxfr
    [08:34:05] add server http://repo.archlinux.fr/x86_64 into archlinuxfr
    [08:34:05] core was updated
    [08:34:07] extra was updated
    [08:34:09] community was updated
    [08:34:09] multilib was updated
    [08:34:10] archlinuxfr was updated
    [08:34:10] -> gdome2 0.8.1-3 -> 0.8.1-4 [dl=106416; ins=942080]
    [08:34:10] -> gsm 1.0.13-6 -> 1.0.13-7 [dl=33196; ins=163840]
    [08:34:10] -> libcdaudio 0.99.12-5 -> 0.99.12-6 [dl=51152; ins=266240]
    [08:34:10] -> libgme 0.6.0-1 -> 0.6.0-2 [dl=117552; ins=348160]
    [08:34:10] -> libid3tag 0.15.1b-6 -> 0.15.1b-7 [dl=42820; ins=307200]
    [08:34:10] -> libieee1284 0.2.11-3 -> 0.2.11-4 [dl=62344; ins=421888]
    [08:34:10] -> libirman 0.4.5-2 -> 0.4.5-3 [dl=12576; ins=69632]
    [08:34:10] -> libmodplug 0.8.8.3-1 -> 0.8.8.4-1 [dl=150248; ins=409600]
    [08:34:10] -> libofa 0.9.3-3 -> 0.9.3-4 [dl=57572; ins=327680]
    [08:34:10] -> libwpg 0.2.0-1 -> 0.2.1-1 [dl=100924; ins=610304]
    [08:34:10] -> libzip 0.10-1 -> 0.10-2 [dl=108000; ins=503808]
    [08:34:10] -> lsb-release 1.4-10 -> 1.4-11 [dl=6204; ins=53248]
    [08:34:10] -> menu-cache 0.3.2-1 -> 0.3.2-2 [dl=47280; ins=188416]
    [08:34:10] -> neon 0.29.6-2 -> 0.29.6-3 [dl=182224; ins=1282048]
    [08:34:10] -> openbox 3.5.0-4 -> 3.5.0-5 [dl=324440; ins=2306048]
    [08:34:10] -> p11-kit 0.9-1 -> 0.11-1 [dl=61216; ins=438272]
    [08:34:10] -> perl-encode-locale 1.02-1 -> 1.03-1 [dl=9544; ins=53248]
    [08:34:10] -> perl-error 0.17016-2 -> 0.17017-1 [dl=17860; ins=77824]
    [08:34:10] -> perl-http-date 6.00-1 -> 6.01-1 [dl=8252; ins=49152]
    [08:34:10] -> perl-file-listing 6.03-1 -> 6.04-1 [dl=7300; ins=49152]
    [08:34:10] -> perl-html-tagset 3.20-2 -> 3.20-3 [dl=9916; ins=57344]
    [08:34:10] -> perl-http-message 6.02-1 -> 6.03-1 [dl=70156; ins=229376]
    [08:34:10] -> perl-http-cookies 6.00-1 -> 6.01-1 [dl=19828; ins=90112]
    [08:34:10] -> perl-http-negotiate 6.00-1 -> 6.01-1 [dl=11104; ins=57344]
    [08:34:10] -> sudo 1.8.3.p2-2 -> 1.8.4-1 [dl=519196; ins=2236416]
    [08:34:10] -> taglib 1.7-3 -> 1.7-4 [dl=231812; ins=1265664]
    [08:34:10] -> tint2 0.11-4 -> 0.11-5 [dl=89756; ins=417792]
    [08:34:10] -> vlc 1.1.13-6 -> 2.0.0-1 [dl=6922380; ins=36552704]
    [08:34:10] looking for AUR updates
    [08:34:10] downloading http://aur.archlinux.org/rpc.php?type=multiinfo&arg[]=alan-bzr&arg[]=archey&arg[]=archlinux-lxdm-theme&arg[]=conky-lua&arg[]=exaile&arg[]=gnome-menus2&arg[]=graveman&arg[]=gtk-engines-clearlooks-colors&arg[]=i2c-tools&arg[]=kalu&arg[]=openbox-menu&arg[]=pacmanxg4-bin&arg[]=python-xrandr&arg[]=read-edid&arg[]=readahead-fedora&arg[]=toluapp&arg[]=wicked-git&arg[]=wmfs-git&arg[]=xdg-su&arg[]=yapan
    [08:34:10] downloaded 7730 bytes
    [08:34:10] parsing json
    [08:34:10] got 20 results
    [08:34:10] pacmanxg4-bin 4.7-2 -> 4.8-1
    [08:34:10] -> pacmanxg4-bin 4.7-2 -> 4.8-1 [dl=0; ins=0]
    [08:34:10] removing /tmp/kalu-YB259V/sync/archlinuxfr.db success (0)
    [08:34:10] removing /tmp/kalu-YB259V/sync/multilib.db success (0)
    [08:34:10] removing /tmp/kalu-YB259V/sync/community.db success (0)
    [08:34:10] removing /tmp/kalu-YB259V/sync/extra.db success (0)
    [08:34:10] removing /tmp/kalu-YB259V/sync/core.db success (0)
    [08:34:10] removing /tmp/kalu-YB259V/sync success (0)
    [08:34:10] removing /tmp/kalu-YB259V/local success (0)
    [08:34:10] removing /tmp/kalu-YB259V success (0)
    [08:34:18] config: attempting to read file /etc/pacman.conf
    [08:34:18] config: new section 'options'
    [08:34:18] config: SyncFirst: pacman
    [08:34:18] config: arch: x86_64
    [08:34:18] config: checkspace
    [08:34:18] config: SigLevel: Never
    [08:34:18] config: new section 'core'
    [08:34:18] config file /etc/pacman.conf, line 82: including /etc/pacman.d/mirrorlist
    [08:34:18] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:18] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:18] config: new section 'extra'
    [08:34:18] config file /etc/pacman.conf, line 86: including /etc/pacman.d/mirrorlist
    [08:34:18] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:18] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:18] config: new section 'community'
    [08:34:18] config file /etc/pacman.conf, line 94: including /etc/pacman.d/mirrorlist
    [08:34:18] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:18] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:18] config: new section 'multilib'
    [08:34:18] config file /etc/pacman.conf, line 105: including /etc/pacman.d/mirrorlist
    [08:34:18] config: attempting to read file /etc/pacman.d/mirrorlist
    [08:34:18] config: finished parsing /etc/pacman.d/mirrorlist
    [08:34:18] config: new section 'archlinuxfr'
    [08:34:18] config: finished parsing /etc/pacman.conf
    [08:34:18] [kalu-updater] sender is :1.16 -- client is (null)
    [08:34:18] [kalu-updater] client is :1.16
    [08:34:18] MethodFinished for method Init
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:18] [kalu-updater] getting alpm params
    [08:34:18] [kalu-updater] init alpm
    [08:34:18] MethodFinished for method InitAlpm
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:18] [kalu-updater] add server http://mir1.archlinux.fr/archlinux/core/os/x86_64 into core
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.dkm.cz/pub/archlinux/core/os/x86_64 into core
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.kangaroot.net/core/os/x86_64 into core
    [08:34:18] [kalu-updater] add server http://ftp.uni-kl.de/pub/linux/archlinux/core/os/x86_64 into core
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.root.lu/core/os/x86_64 into core
    [08:34:18] [kalu-updater] add server http://ftp.halifax.rwth-aachen.de/archlinux/core/os/x86_64 into core
    [08:34:18] MethodFinished for method AddDb
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:18] [kalu-updater] add server http://mir1.archlinux.fr/archlinux/extra/os/x86_64 into extra
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.dkm.cz/pub/archlinux/extra/os/x86_64 into extra
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.kangaroot.net/extra/os/x86_64 into extra
    [08:34:18] [kalu-updater] add server http://ftp.uni-kl.de/pub/linux/archlinux/extra/os/x86_64 into extra
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.root.lu/extra/os/x86_64 into extra
    [08:34:18] [kalu-updater] add server http://ftp.halifax.rwth-aachen.de/archlinux/extra/os/x86_64 into extra
    [08:34:18] MethodFinished for method AddDb
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:18] [kalu-updater] add server http://mir1.archlinux.fr/archlinux/community/os/x86_64 into community
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.dkm.cz/pub/archlinux/community/os/x86_64 into community
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.kangaroot.net/community/os/x86_64 into community
    [08:34:18] [kalu-updater] add server http://ftp.uni-kl.de/pub/linux/archlinux/community/os/x86_64 into community
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.root.lu/community/os/x86_64 into community
    [08:34:18] [kalu-updater] add server http://ftp.halifax.rwth-aachen.de/archlinux/community/os/x86_64 into community
    [08:34:18] MethodFinished for method AddDb
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:18] [kalu-updater] add server http://mir1.archlinux.fr/archlinux/multilib/os/x86_64 into multilib
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.dkm.cz/pub/archlinux/multilib/os/x86_64 into multilib
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.kangaroot.net/multilib/os/x86_64 into multilib
    [08:34:18] [kalu-updater] add server http://ftp.uni-kl.de/pub/linux/archlinux/multilib/os/x86_64 into multilib
    [08:34:18] [kalu-updater] add server http://archlinux.mirror.root.lu/multilib/os/x86_64 into multilib
    [08:34:18] [kalu-updater] add server http://ftp.halifax.rwth-aachen.de/archlinux/multilib/os/x86_64 into multilib
    [08:34:18] MethodFinished for method AddDb
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:18] [kalu-updater] add server http://repo.archlinux.fr/x86_64 into archlinuxfr
    [08:34:18] MethodFinished for method AddDb
    [08:34:18] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:22] MethodFinished for method SyncDbs
    [08:34:22] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:27] [kalu-updater] sender is :1.16 -- client is :1.16
    [08:34:47] MethodFinished for method SysUpgrade
    [08:35:26] downloading http://www.archlinux.org/feeds/news/
    [08:35:27] downloaded 12335 bytes
    I still have '1 AUR packages updated' on the mouseover...

  • Why not use Arch Linux only?

    Named as an Arch Linux "Linux Addict" (according to my upgraded user profile ), for some times I have asked myself why use other distros than AL, especially RedHat, SuSE and Mandrake. What do they provide what AL doesn't?
    One of the roles of RedHat became clear reading Linux Today, though it may not be for the common users but have to admit its impressive (there are three major advances in the new RHEL3 product line....):
    http://linuxtoday.com/it_management/2003102200926NWRHSW
    PS.
    Does it sound like I am addicted??... it feels natural   :idea: 

    maturity? stable? can't trust?
    let me tell you something i learned by experience ...
    i runed SuSE for long time (from 5.2 to 8.1) and what i know they do wrong is: if you have e.g. 6.0 (the most stable SuSE i know) then you can update your packages over internet, but after some time you will be "forced" to  buy the next release that is totally differently constructed (7.1, because it uses YaST2 instead of the YaST and other stupid inovations that you cannot easily update from internet) ... and after a while again you have to upgrade by buying the next one ...
    sure, you install it in about an hour and everything works, but hey, each package costs some money and this install is each time from quite 0 (because the integrated update often does not work) :-(
    trusting?
    i trust only in systems i configure myself ... and since SuSE 7.2 i lost the overview in where you can configure what and why ... and you are not sure that YaST2 will change your changed settings to default
    archlinux is fully configureable and does not have a tool that changes files behind your back (well, there is one case: when you update init-scripts with packman without setting in pacman.conf to exclude some files you changed ... but also then you can restore the settings by mv'ing the original files to their right name-links :-)
    why using also other distros?
    well since arch 0.5 i removed all other linuces from my machine (to save space) and now have only arch and winXP ... xp is used only for watching tv (because hauppauge usb "usbvision" module cannot be compiled with  a 2.4.x or 2.6.0tx kernel (but 2.5.x) and because of ebanking software that will not install on archlinux but easily on SuSE and WinXP (need the original sun's java vm, but have no time to construct a PKGBUILD for sun's jdk 1.4)
    ... and the needed other software i built packages of and installed on my local repository (and also copied in incoming) ... now i'm quite happy with archlinux as an OS (and i hope with a more advanced 2.6.x TV will come too, and java i will find one day time to build for ebanking)
    -> "use an OS that works, use archlinux"
    ps
    and about "linux addict":
    no, i dont think i'm addict, but i use this forum as a normal member  (to help others switching to an os that works,  to help people with problems i had myself often some time ago, to ask if i find something interessting or funny about something in arch, to inform that i built packages and put them in incoming :-) ... i would be much happier to have "regular user" instead of "linux addict", but that's something i cannot change

  • Slackware TGZ to Arch Linux Package Converter

    I have two programs that interest me (LilyPond and Battle for Wesnoth) that don't have Arch Linux packages and compiling them would involve hunting everywhere for obscure dependencies (LilyPond in particular) so I just downloaded the Slackware packages, inspected them and found that by unzipping them onto the root folder (as superuser) and running the install script (if there is one) I can get them to run with minimal fuss.
    Has the idea of making a Slackware to Arch package converter been brought up before? Is there any problems with this? (Slackware is i386-optimised if I remember correctly, but I think it's still worth it since there is more Slackware packages than Arch Linux ones out there.)

    i3839 wrote:Flames?? Where? You sure you didn't misread something?
    Probably.
    Here's what I read, admitting that it doesn't seem quite as bad the second time around...:
    Oh? All I was hearing is that Arch already has enough packages, and that the devs are overloaded and almost down.
    "you don't know which way is up, you contradict yourself while continuing to ignore the problems and aren't fixing anything".
    Also getting custom packages into Arch's official repository seems a bit hard currently, not to mention that it's totally unclear how to do that (drop it in incomming and wait a year? Lotto?).
    "The system isn't working and you haven't done anything to try to fix it. I haven't read or noticed any of the threads illustrating that this topic has been argued to death and isn't going unnoticed"
    Maintaining packages is the most work, and every distro maintains the same packages over and over again. Tell me why to not use good, working packages from another sane distro?
    "The other distros are better."
    (Personally, I don't care if anybody likes another distro better, but if so, use it instead, don't talk about it)
    Changing GCC often gives the same problem as updating to new major libraries. Simply leave the old GCC libs or make a seperate package for them. Currently it's rather impossible in Arch to install new packages with an outdated system, if that's solved then it's also easy to use Slackware packages.
    "The Arch philosophy of keeping packages stable but up to date is just plain wrong.  I don't bother to pacman -Syu before I mention problems."
    Of course if would be best if there was a nice, good binary package standard that works on all distros, so that the application makers can make and maintain the packages themselves, but that's utopia (paths are too often hardcoded for instance).
    "hey, I do have some good ideas".
    It isn't a matter of being able to do something or not, it's a matter of convenience. All programs should be relative easy to compile from source, but that doesn't mean that everyone should compile all programs themselves.
    "There aren't enough Arch binaries to go around"
    OR:
    "ABS sucks"
    OR:
    "Hold my hand, I can't compile."
    OR:
    "I use Arch cause I don't like Gentoo". :-D 
    Yeah, some of that is a little (or quite, or even very) harsh, you can blame it on me rather than taking it to heart.
    As for the slackware packages issue, I'm personally not writing a script to convert them; I've never used slackware in my life. The idea has merit, but I get tired of people discussing pros and cons and not doing anything. I think that's because I'm about as bad as anyone on that front, possibly worse.
    Dusty

  • Bootstrap a base Arch Linux on another distro

    Hi!
    I needed to install an Arch Linux environment on a Debian server, so I searched the wiki and found this page:
    http://wiki.archlinux.org/index.php/Archbootstrap
    Unfortunately, the script is outdated. So I wrote a new one:
    http://tokland.googlecode.com/svn/trunk … otstrap.sh
    (tested only on Debian Lenny)
    $ sudo bash arch-bootstrap.sh myarch i686
    Now, my questions:
    1) is there another script that performs this task better?
    2) if not, can you please give some feedback so as to update the wiki with (a -hopefully- more polished version of) this script?
    Last edited by tokland (2010-02-09 21:27:31)

    Hi,
    I'm working on a script.
    It's working with pacman-static.
    pacman, in version 3.3.0, introduce xz archive format support and now, some packages use this format (mkinitcpio-0.6.3-1-any.pkg.tar.xz)
    So, my script is endding with pacman-static error (unrecognized archive format) !
    Where can I find the 3.3.0 (or more) pacman-static ?
    Here's the script (it's a first step...) :
    #!/bin/bash
    # install an Arch in the specified location (debbootstrap like)
    # work over pacman-static
    # must run on GNU/Linux systems
    # http://wiki.archlinux.org/index.php/Install_from_Existing_Linux
    # http://wiki.archlinux.fr/install/chroot?DokuWiki=153b0c6847435682de50a6061e6f75a4
    [ "${1}" ] || { echo "usage: $( basename $0 ) chrootdir [packages]" >/dev/stderr && exit 1; }
    B='\033[29;1m'
    b='\033[0m'
    # load variables defined in configuration file
    echo -e "${B}load configuration file...${b}"
    . /usr/local/etc/$( basename $0 ).conf || exit $?
    # test packages cache
    echo -e "${B}test packages cache...${b}"
    [ "${abs_cache}" ] || abs_cache=/var/cache/pacman/pkg
    [ -d "${abs_cache}" ] || { mkdir -vp ${abs_cache} || exit $?; }
    touch ${abs_cache}/$( basename $0 ) && rm ${abs_cache}/$( basename $0 ) || exit $?
    # make minimal chroot for pacman
    echo -e "${B}make minimal chroot...${b}"
    abs_chroot=${1}
    mkdir -v ${abs_chroot} || exit $?
    mkdir -vp ${abs_chroot}/etc/pacman.d
    mkdir -vm 1777 ${abs_chroot}/tmp
    mkdir -vp ${abs_chroot}/usr/bin
    mkdir -vp ${abs_chroot}/var/lib/pacman
    # install pacman.static in chroot
    abs_static_package=$( find ${abs_cache} | grep pacman-static )
    if [ ! "${abs_static_package}" ]
    then
    # download it
    echo -e "${B}download pacman...${b}"
    [ "${abs_static_host}" ] || abs_static_host="http://repo.archlinux.fr/i686"
    abs_static_package=$( curl -sSL ${abs_static_host} | egrep -io 'href="pacman-static[^"]+\.pkg\.tar\.gz"' | awk -F '"' '{print $2}' )
    [ "${abs_static_package}" ] && abs_static_package=${abs_cache}/${abs_static_package} || exit $?
    curl --progress-bar ${abs_static_host}/${abs_static_package} > ${abs_static_package} || exit $?
    fi
    echo -e "${B}install pacman...${b}"
    mkdir -p ${abs_chroot}/tmp/pacman
    tar vxzf ${abs_static_package} -C ${abs_chroot}/tmp/pacman || exit $?
    cp -v ${abs_chroot}/tmp/pacman/usr/bin/pacman.static ${abs_chroot}/usr/bin/
    rm -vrf ${abs_chroot}/tmp/pacman
    # install pacman configuration in chroot
    echo -e "${B}configure pacman...${b}"
    [ "${abs_repository}" ] || abs_repository='http://mirrors.kernel.org/archlinux/$repo/os/i686'
    abs_pacman_conf=${abs_chroot}/tmp/pacman.conf
    echo "
    [core]
    Server = ${abs_repository}
    [extra]
    Server = ${abs_repository}
    [community]
    Server = ${abs_repository}
    " > ${abs_pacman_conf}
    # install the core
    echo -e "${B}install the core...${b}"
    ${abs_chroot}/usr/bin/pacman.static \
    --sync \
    --refresh \
    --root ${abs_chroot} \
    --cachedir ${abs_cache} \
    --config ${abs_pacman_conf} \
    --logfile /dev/null \
    --verbose \
    --noprogressbar \
    base || exit $?

Maybe you are looking for

  • Email and digital signatures

    When I open a .pdf document from an email attachment, I am unable to digitally sign it. After I sign it, the signature just disappears. Before the new IT people took over, I was able to open the document, select the digitable signature option, and Ac

  • Full Screen Video in iWeb

    I created a video on iMovie an then put it on one of my sites on iWeb. I want viewers to be able to view it in fullscreen but that doesn't to be an option. Any suggestions on how to do this?

  • Import Multiple Excel Into Sql Server

    I have 4 Excel spreadsheets all with different formatting and column names that I want to use powershell to import into ONE Sql Server Table that I will want to create with powershell.  I have found several instances of importing one workbook, but I

  • HT1338 iPhoto can't be installed on "Macintosh HD" because OS X version 10.8.2 or later is required. You can update OS X from the Updates page of the App Store.

    I get a message that I have 2 updates available.  I updated OS X for Mountain Lion to the latest version, but I can't update my iPhoto app.  I get the following message: iPhoto can't be installed on "Macintosh HD" because OS X version 10.8.2 or later

  • How to change IM Profile after AUC settlement done

    Hi, I have an issue here.We have a WBS element having an IM profile allowing summary settlement.WBS released,AUC created.Cost have been posted and settled to AUC.Later it was noticed that the IM profile is in correct and need another IM profile for t