View previous topic :: View next topic |
Author |
Message |
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Sat Apr 05, 2003 11:51 am Post subject: Useful script to filter through what will be emerged quickly |
|
|
Updated April 21, 2003
pfilter is a script that uses dialog (emerge dialog) to allow you to deselect some of the packages portage wants to emerge when you do something like an "emerge -up world". This is very useful if you have a full world-file you don't want to edit and use "emerge -u world" to keep your system up to date, but don't want to emerge all the things portage suggests at once. femerge is simple wrapper for emerge that will take the same options as emerge (but may die horribly if you try to use things like -C or -f yet) and lets you filter down the suggested packages repeatedly until you're happy and then emerge it.
The scripts are below - put the code in /usr/local/bin/pfilter and /usr/local/bin/femerge respectively, make them executable, and emerge dialog if you haven't got it installed.
To use pfilter by itself, do something like:
Code: | # emerge -up world | pfilter |
This will let you filter the packages suggested by emerge -up world and print these to the standard output. To emerge these right away, do:
Code: | # emerge -up world | pfilter | xargs emerge -u |
To make this process a little easier, and to allow you to filter the packages again and again until you're happy with what portage will install, run femerge:
femerge should honour options like --deep, --emptytree, --fetchonly, --nodeps, --noreplace, --oneshot, --resume, --update, --upgradeonly and the binary package-related options, but many of these have not been extensively tested yet (I don't feel like making this box a guinnea pig in a place where I only have a 64k ISDN connection! ). It should work, as options are just passed through to emerge, but please be careful!
Update:femerge now passes options it doesn't recognise through to regular old emerge and exits.
Changelog:
2003-04-06: Fixed silly bug in femerge that was causing the final emerge step to break.
2003-04-06 (a little later): Fixed bug in pfilter that caused it to crash if there were no inputs (i.e. emerge -up XZY had nothing to update). Made femerge a little more aware of command line options.
2003-04-07: Decided to do it properly - the code has now been cleaned up and modularised significantly, femerge should now deal properly with --fetchonly/-f, and also handles compound options like "-uf". Also, it's possible to use another emerge wrapper (e.g. semerge) if it complies sufficiently with emerge's options by changing the variable $emerge_cmd at the top of the femerge script.
2003-04-07 (a little later): pfilter now remembers which version of a package is being emerged specifically (i.e. if you're trying to emerge a package that is not the latest non-masked one). Made femerge output prettier using the functions in /sbin/functions.sh.
2003-04-08: femerge now falls back on emerge for options it doesn't understand, meaning you can use it as a full wrapper for emerge. femerge will no longer add dependencies to the worldfile - only packages specified on the original command line, presuming they are not filtered out and --oneshot is not specified.
2003-04-23 Added -d option to pfilter that will deselect (rather than select) all packages by default. Pass -d to femerge for the same effect.
I'd be very grateful if people could test this more - it seems to work for me, and as long as you're not entirely wreckless, it should be pretty difficult to do any unintended damage with it.
pfilter 1.0:
Code: |
#!/bin/bash
# pfilter 1.0 by Martin Aspeli <optilude@gmx.net>
# Filter for Gentoo Linux (www.gentoo.org)'s Portage system, allowing you to
# select which packages from an emerge -p you wish to update. Takes output
# from emerge -p as its standard input, prints list of selected packages.
# Suggested use: # emerge -up world | pfilter | xargs emerge -u
# This will do an emerge -up world, then allow you to deselect any of the
# packages about to be installed (using dialog) and then do an emerge -u on
# those packages. Note that if you deselect a package which is a dependency
# of a selected package, it will still be installed.
# read from standard input and make items suitable for passing to dialog's
# checklist as checklist options.
select_packages=1
get_checklist_items () {
# Read input and break portage --pretend output into package and info
local line=""
# Read lines
while read line ; do
# ... find its parts: \1 = the status characters, \2 = name of package
# \3 = optionally version of installed package
if test "${select_packages}" = "1" ; then
echo "${line}" | grep "^\[ebuild " | \
sed 's/^\[ebuild \([^]]*\)] \([^[:space:]]*\)[[:space:]]\?\(.*\)$/\2 \"\1\3\" on/'
else
echo "${line}" | grep "^\[ebuild " | \
sed 's/^\[ebuild \([^]]*\)] \([^[:space:]]*\)[[:space:]]\?\(.*\)$/\2 \"\1\3\" off/'
fi
done
}
# display checklist (using dialog) of all the ebuilds given as command line
# options (output from get_checklist_items).
display_checklist () {
if test "${1}" = "" ; then
return 1
fi
# Display the checklist dialogue
eval "dialog --title 'Portage ebuild filter' --separate-output \
--checklist 'Select packages to install:' 0 0 0 ${@} 2>&1" || \
exit 1
}
# format ebuilds output by display_checklist by removing version info and
# double quotes.
format_ebuilds () {
for package in ${@} ; do
# print leading =
echo "=${package}"
done
}
print_help () {
echo "Usage: emerge -p [packages] | pfilter [options]"
echo
echo "Options:"
echo " -d Deselect packages by default"
echo " -h Display this message"
echo
}
init () {
select_packages=1
while getopts "d" opt ; do
case "${opt}" in
d)
select_packages=0
;;
*)
print_help && exit 1
;;
esac
done
}
init ${@}
# get the filtered packages from the checklist
packages=$(display_checklist $(get_checklist_items))
# if any selected, print them
test "${packages}" != "" && format_ebuilds ${packages} || exit 1
|
femerge 1.0:
Code: |
#!/bin/bash
# femerge 1.0 by Martin Aspeli <optilude@gmx.net>
# pfilter-aware wrapper for Gentoo Linux (www.gentoo.org)'s emerge command,
# allowing you to select which packages from an emerge -p you wish to update.
# Takes the same options as emerge, but does not support things like unmerging,
# injecting or emerging only dependencies.
# An option -d is passed to pfilter, causing it to deselect packages by default.
# Suggested use: # femerge -up world
# This will do an emerge -up world, then allow you to deselect any of the
# packages about to be installed (using dialog) and then do an emerge -u on
# those packages. Note that if you deselect a package which is a dependency
# of a selected package, it will still be installed. You will be allowed to
# review what is going to be installed and make further adjustmenets or abort
# if necessary.
# Please ensure dialog and pfilter are both installed in your $PATH.
source /sbin/functions.sh
trap "error 'interrupted'" SIGINT SIGHUP SIGINT
###############################################################################
# Edit these if necessary (e.g. set final_emerge_cmd to semerge to use semerge)
emerge_cmd="emerge" # command used to get emerge -p output.
final_emerge_cmd="emerge" # command used to actually emerge the packages
pfilter_cmd="pfilter" # command used to filter the packages
world_file="/var/cache/edb/world"
###############################################################################
# Do not edit anything below this line
emerge_options="" # options to pass to emerge each time (affect
# dependencies)
final_emerge_options="" # further options to pass to emerge when actually
# emerging.
emerge_packages="" # initial list of packages/profile to emerge
pfilter_options="" # options to pass to pfilter each time
oneshot=0 # set to 1 to not touch world file
# print a message and exit
cancelled () {
ewarn "Cancelled."
echo
exit 0
}
# print an error message and exit
error () {
eend 1 "Error: ${1}"
exit 1
}
# print usage information and exit
usage () {
echo ""
echo "Usage: femerge [options] < packages >"
echo " femerge [options] < system | world >"
echo ""
echo "See emerge --help for more information."
exit 0
}
bad_option () {
eerror "Option ${1} not supported by femerge.">&2
}
# apply pfilter to the emerge-ouput passed as $1
filter_packages () {
echo "${1}" | ${pfilter_cmd} ${pfilter_options}
}
# do an emerge pretend with non-final options
preview_emerge () {
${emerge_cmd} -p ${emerge_options} ${@} || \
error "${emerge_cmd} -p ${emerge_options} ${@} failed."
}
# for all the builds passed as arguments, for the ones that were in the
# original list of packages, add them to the worldfile if necessary.
fix_worldfile () {
test "${oneshot}" = "1" && return 0
local ebuild=""
local short_ebuild=""
einfo "Amending ${world_file}"
for ebuild in ${@} ; do
short_ebuild=$(echo ${ebuild} | sed -e 's/-r[0-9]\+$//' \
-e 's/-[0-9][^-]*$//' -e 's/^=//')
if echo "${emerge_packages}" | grep -qs "${short_ebuild##*/}" && \
! grep -qs "${short_ebuild}" ${world_file} ; then
einfo " Adding: ${short_ebuild}"
echo "${short_ebuild}" >> ${world_file}
fi
done
}
# get options from command line and place in the three variables $emerge_options
# (options to pass to emerge when determining dependencies),
# $final_emerge_options (options that should only be passed to emerge when
# actually emerging) and $emerge_packages (what's being emerged)
get_options () {
local goahead=0
# Get options
while true ; do
case "${1}" in
-h|--help|--usage)
usage
;;
--columns|--nospinner|-q|--quiet)
;;
--oneshot)
oneshot=1
;;
--buildpkg|-b|--buildpkgonly|-B|--fetchonly|-f|--noconfmem|\
--oneshot|--resume|--usepkg|-k|--usepkgonly|-K)
final_emerge_options="${final_emerge_options} ${1}"
;;
--deep|-D|--emptytree|-e|--nodeps|-O|--noreplace|-n|--update|\
-u|--upgradeonly|-U)
emerge_options="${emerge_options} ${1}"
;;
-d)
pfilter_options="${pfilter_options} ${1}"
;;
--*)
bad_option ${1}
goahead=1
;;
-?)
bad_option ${1}
goahead=1
;;
-*) # Multiple one-letter options in one...
local options="${1#-}"
# Deal with -h and -q
echo ${options} | grep -qs "h" && usage
options=${options//q/}
# Deal with final options - remove anything from $options that's not
# b, B, f, k or K
local final_options=$(echo "${options}" | sed s/[^bBfkK]//g)
test "${final_options}" != "" &&
final_emerge_options="${final_emerge_options} -${final_options}"
# Do the same to $emerge_options for D, e, O, n, u or U
local normal_options=$(echo "${options}" | sed s/[^DeOnuU]//g)
test "${normal_options}" != "" &&
emerge_options="${emerge_options} -${normal_options}"
# Then do -d for pfilter
local filter_options=$(echo "${options}" | sed s/[^d]//g)
test "${filter_options}" != "" &&
pfilter_options="${pfilter_options} -${filter_options}"
local unknown_options=$(echo "${options}" | \
sed s/[${final_options}${normal_options}${filter_options}]//g)
test "${unknown_options}" != "" && \
bad_option "-${unknown_options}" && goahead=1
;;
clean|depclean|info|inject|prune|regen|search|unmerge|sync|rsync)
bad_option ${1}
goahead=1
;;
*)
test "${1}" != "" && emerge_packages="${emerge_packages} ${1}"
;;
esac
shift || break
done
return ${goahead}
}
# Main:
# Get emerge command line options and packages/profile to emerge
if ! get_options ${@} ; then
ewarn "Falling back on ${final_emerge_cmd}"
${final_emerge_cmd} ${@}
exit ${?}
fi
test "${emerge_packages}" = "" && usage
einfo "Calculating dependencies..."
emerge_output=$(preview_emerge ${emerge_packages})
packages=""
# loop until exit by abort or emerge
while true ; do
# Filter the packages we have so far"
packages=$(filter_packages "${emerge_output}")
test "${packages}" = "" && cancelled
# Preview the emerge
einfo "Calculating dependencies..."
emerge_output=$(preview_emerge ${packages})
echo "${emerge_output}"
echo
# Ask for action
choice=""
until test "${choice}" = "e" -o "${choice}" = "E" -o \
"${choice}" = "f" -o "${choice}" = "F" -o \
"${choice}" = "a" -o "${choice}" = "A" ; do
einfon "Press (e) to emerge, (f) to filter again, (a) to abort: "
read choice
echo
case "${choice}" in
a|A)
cancelled
;;
f|F)
# do nothing - allow next filtering
;;
e|E)
ebegin "Running ${final_emerge_cmd}..."
${final_emerge_cmd} --oneshot ${emerge_options} \
${final_emerge_options} ${packages} &&
fix_worldfile ${packages}
echo
exit 0
;;
*)
eerror "Invalid input."
;;
esac
done
done
|
Take care,
Martin _________________ --
"Life is both a major and a minor key" -- Travis
Last edited by optilude on Mon Apr 21, 2003 7:03 pm; edited 10 times in total |
|
Back to top |
|
|
plate Bodhisattva
Joined: 25 Jul 2002 Posts: 1663 Location: Berlin
|
Posted: Sun Apr 06, 2003 4:00 am Post subject: |
|
|
This looks useful enough to be moved from Portage & Programming. Excellent, thanks a lot! |
|
Back to top |
|
|
Spack n00b
Joined: 02 Feb 2003 Posts: 32
|
Posted: Sun Apr 06, 2003 5:28 am Post subject: |
|
|
3 things:
1. Awsome idea, just what I was looking for.
2. You need to have dialog installed to use pfilter.
3. I get this when trying to emerge after filtering:
Code: | Press (e) to emerge, (f) to filter again (a) to abort: e
Emerging...
Calculating dependencies
emerge: there are no masked or unmasked ebuilds to satisfy "sys-libs/zlib
sys-apps/findutils
sys-apps/modutils
sys-apps/file
app-editors/nano
dev-libs/libxml2
x11-misc/xscreensaver
sys-apps/diffutils
net-p2p/dctc
net-p2p/dc-gui
sys-devel/bin86
sys-apps/net-tools
sys-apps/gzip
dev-lang/tk
sys-apps/psmisc
sys-apps/debianutils
net-misc/dhcpcd
sys-apps/hdparm
sys-apps/pam-login
sys-apps/devfsd
sys-apps/less".
|
Something specific to my setup maybe? _________________ Gentoo 2004.4
Gnome 2.8
Athlon XP 1800+ 512MB DDR
Promise SATA |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Sun Apr 06, 2003 9:48 am Post subject: |
|
|
Hmm... that's a bit odd... I should've made it clear that this is in need of lots more testing - please help! .
Can you tell me what command you ran? Did you do and then filtered out some packages? If this is the case, can you try this: Code: | #emerge -up world | pfilter | , filter the same packages and then post the output of pfilter? This should basically be the list of packages that femerge is trying to emerge (femerge just passes that list straight to emerge after you press "e").
(A few minutes later:) Hmm... I'm getting it too now and I think I know what the problem is (apart from inadequate testing), so give me a few minutes and I'll see if I can't fix it - I'm gonna edit the original post to make it less confusing - stay tuned.
Lastly - if anyone can come up with a clever way of getting the colour back in emerge's output when it's run within femerge and still be able to pipe it to pfilter, that would be nice - I tried for a while and then gave up.
Martin _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
striscio n00b
Joined: 30 Aug 2002 Posts: 23 Location: milano - italy
|
Posted: Tue Apr 08, 2003 10:13 pm Post subject: Re: Useful script to filter through what will be emerged qui |
|
|
I can't use it.
simpson root # emerge -up world | pfilter
Usage: emerge -p XZY | pfilter.
What is the problem? |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Wed Apr 09, 2003 10:17 am Post subject: Re: Useful script to filter through what will be emerged qui |
|
|
striscio wrote: | I can't use it.
simpson root # emerge -up world | pfilter
Usage: emerge -p XZY | pfilter.
What is the problem? |
Er.... that works just fine here - are you sure you have the latest versions? pfilter should (only) print that message if you supplied any command line arguments to it (seeing as it takes no command line arguments).
Also, try to use femerge (it's nicer to use anyway) - run:
Code: | simposon root # femerge -u world |
And see if that works.
Martin _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
Lars Apprentice
Joined: 06 Feb 2003 Posts: 171 Location: Germany, near baltic sea
|
Posted: Fri Apr 11, 2003 6:53 am Post subject: |
|
|
A simple copy and paste of pfilter or femerge don't work for me too, but the solution is more than simple
Just replace '\ ' by '\'.
Yes, it's the stupid 'space' after the backslash, which the browser creates.
And big thanks to optilude for this famous tools.
Lars |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Fri Apr 11, 2003 9:38 am Post subject: |
|
|
Hmm... that's strange. What browser were you using? I had trouble copying scripts with konqueror, and had to resort to phoenix before.
Glad you like them! Check out ebb/bemerge as well, in another post in this forum. _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
Lars Apprentice
Joined: 06 Feb 2003 Posts: 171 Location: Germany, near baltic sea
|
Posted: Fri Apr 11, 2003 11:18 am Post subject: |
|
|
Most the time I use opera 6.06 (within Windows XP)
there this frailure occur.
Sometimes I use Mozilla 1.3
there this frailure not occur.
Other browser I don't know. |
|
Back to top |
|
|
NeoCORE Tux's lil' helper
Joined: 15 Mar 2003 Posts: 100 Location: Ireland
|
Posted: Sat Apr 19, 2003 11:24 pm Post subject: |
|
|
Works great for me... I hated everytime I did emerge sync that it would want to downgrade packages after I emerge -uD world... I had to go into the package.mask and set xfree-r2 etc. commented out... now I just do fmerge
Cheers
NeoCORE _________________ To err is human, but to really foul things up, you need a computer
NeoCORE Network
Adopt a post today! |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Mon Apr 21, 2003 6:44 pm Post subject: |
|
|
Hehe...
Glad you like it! I've been working on some bash functions to find out whether one package is a dependency on another (mostly done)... I'm gonna build this into pfilter/femerge so that it can show which packages you specified originally on the command line or in your worldfile, and which ones are dependencies, but it'll have to wait till I get some spare time again (assignment time at uni again.... ) Stay tuned. _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
thomasando Tux's lil' helper
Joined: 05 Apr 2003 Posts: 94
|
Posted: Mon Apr 21, 2003 10:15 pm Post subject: |
|
|
Absolute magic!
This is JUST the tool I was looking for - I was having problems with manually masking packages and then dependencies failing etc. when trying to do an emerge --deep -u world.
Works great on my machine! Thanks so much!
EDIT: I spoke too soon. It doesnt work. It still downgrades packages when I run pfilter. When I run femerge, and then go and filter packages again, the dependencies are exactly the same as they were for the previous run through which means taht when doing the actual emerge, it still downgrades a heap of my packages. It is a nice tool and a nice idea, and unless you can tell me how to make it work properly then I'll still be doing things manually. |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Tue Apr 22, 2003 9:53 am Post subject: |
|
|
thomasando wrote: |
This is JUST the tool I was looking for - I was having problems with manually masking packages and then dependencies failing etc. when trying to do an emerge --deep -u world.
EDIT: I spoke too soon. It doesnt work. It still downgrades packages when I run pfilter. When I run femerge, and then go and filter packages again, the dependencies are exactly the same as they were for the previous run through which means taht when doing the actual emerge, it still downgrades a heap of my packages. It is a nice tool and a nice idea, and unless you can tell me how to make it work properly then I'll still be doing things manually. |
Er... can you tell me what you're trying to do? It should work like this: You run "femerge -U world" - the -U means it won't downgrade anything (same as --upgradeonly). pfilter will then come up with a bunch of packages - deselect any packages you want - however, if libXYZ is a dependency of ABC, and you deselect libXYZ but not ABC, then of course libXYZ will still be installed - anything else would be a terrible bug!
You should realise - pfilter works a little like this:
* Get a list of packages from emerge <options> -p <something>
* Allow you deselect any or all of those packages
* Print out the packges you ended up selecting (including all dependencies that you haven't deselected)
femerge lets you run this process repeatedly until you're happy with the result, and runs emerge with those packages at the end. It also makes sure your worldfile won't get mangled with dependencies, and lets you pass specific options, such as -U to emerge.
Does that help?
Martin _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
thomasando Tux's lil' helper
Joined: 05 Apr 2003 Posts: 94
|
Posted: Tue Apr 22, 2003 10:19 am Post subject: |
|
|
yes, it does help thankyou. i didnt realise that there was a -U option (ie. upgrade only) and i was doing complicated masking etc. of packages for my upgrading world. now that i know that, i'll try using femerge again. thanks |
|
Back to top |
|
|
kamikaz3 Apprentice
Joined: 06 Feb 2003 Posts: 187
|
Posted: Thu Apr 24, 2003 8:30 am Post subject: |
|
|
Thx, it works fine for me (for now) |
|
Back to top |
|
|
stevenwang n00b
Joined: 17 Apr 2003 Posts: 4
|
Posted: Fri Jun 06, 2003 8:18 am Post subject: |
|
|
But there is no --usepkg suport. I means that you can not see whether a package wil be installed form source or binary. How can add this feature? Thanks in advance. |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Fri Jun 06, 2003 9:56 pm Post subject: |
|
|
Hmmm.... I never use --usepkg, so I haven't tested it with that, I'll look into it.
If you look at the init function of femerge, it *should* work. femerge has a variable $final_emerge_options which holds a string of command line options that are passed to emerge on the final "real" emerge only - --usepkg should be included here!
Can you tell me what happens when you try to do
$femerge --usepkg <other options> <packages>
Martin _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
morgap98 n00b
Joined: 02 Nov 2002 Posts: 25
|
Posted: Sat Jun 07, 2003 4:23 pm Post subject: |
|
|
great scripts, they work wonderfully, thank you
</P33T> |
|
Back to top |
|
|
legobuff n00b
Joined: 12 May 2003 Posts: 20 Location: ~ N 41 08.5?? W 96 01.7??
|
Posted: Thu Aug 28, 2003 12:42 pm Post subject: Help with --upgradeonly |
|
|
swimmer pointed this out to me and from what I have read, this is exactly what I have been looking for... but, when I do:
Code: | femerge --upgradeonly world |
I get the following...
Code: |
* Calculating dependencies...
* Cancelled.
|
If I remove the --upgradeonly option, it works great.
Any suggestions?
-legobuff |
|
Back to top |
|
|
optilude Apprentice
Joined: 29 May 2002 Posts: 248 Location: England
|
Posted: Thu Aug 28, 2003 1:24 pm Post subject: |
|
|
Hmm.... it works fine here. I'd suggest getting a fresh copy of the script from above. Make sure your browser doesn't mess it up (phoenix/mozilla firebird generally work well for me, but I had problems in konqueror before). Also, try to run 'emerge --pretend --upgradeonly world' and see what it says (this is basically what femerge runs internally). If there are any errors there, try to fix them before trying again. Please let me know if you're still having trouble!
Martin _________________ --
"Life is both a major and a minor key" -- Travis |
|
Back to top |
|
|
shira Tux's lil' helper
Joined: 27 Aug 2002 Posts: 122
|
Posted: Fri Aug 29, 2003 5:40 pm Post subject: |
|
|
thank you so much |
|
Back to top |
|
|
shira Tux's lil' helper
Joined: 27 Aug 2002 Posts: 122
|
Posted: Fri Aug 29, 2003 5:41 pm Post subject: |
|
|
thank you so much |
|
Back to top |
|
|
shira Tux's lil' helper
Joined: 27 Aug 2002 Posts: 122
|
Posted: Fri Aug 29, 2003 5:45 pm Post subject: |
|
|
thank you so much |
|
Back to top |
|
|
asph l33t
Joined: 25 Aug 2003 Posts: 741 Location: Barcelona, Spain
|
Posted: Wed Sep 03, 2003 7:09 am Post subject: nice |
|
|
thanks, it just works
great job _________________ gentoo sex is updatedb; locate; talk; date; cd; strip; look; touch; finger; unzip; uptime; gawk; head; emerge --oneshot condom; mount; fsck; gasp; more; yes; yes; yes; more; umount; emerge -C condom; make clean; sleep |
|
Back to top |
|
|
dh3rm3 Tux's lil' helper
Joined: 26 Aug 2003 Posts: 101
|
Posted: Sun Sep 07, 2003 11:56 pm Post subject: |
|
|
I just dreamed of such a script as pfilter...
great work and congrats _________________ dh3rm3's place |
|
Back to top |
|
|
|