bashbox: multicall bash script

Under development: PCMCIA, wireless, etc.
Message
Author
User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

bashbox: multicall bash script

#1 Post by technosaurus »

I have previously posted about a bash library - here
...and have posted several bash scripts in the past

Now I am combining them into a single script that works like busybox.

here is a list of currently implemented functions
If you have a function to add that isn't implemented please post it
  • addgroupgui() { #uses main_dialog() -> #addgroup [-g GID] [user_name] group_name
    bashbox() { #todo make this more robust
    blockads() { #tweaks /etc/hosts to ban certain sites
    brokenlinks() { #find broken links in given input dir or pwd if not given
    createlinks() { #make executable links for functions matching "()_{"
    for x in `grep "() {" bashbox |cut -d"(" -f1 |grep -v " " |grep -v "#"` do ln -s bashbox $x; done
    fixflash() { #mask your flash version as 10.1 rXXXXXX
    getflash() { #install latest flash
    getflash9() { #flash9 is smaller, fewer deps and still updated
    getinput() { #DIALOG box to return user input to stdout
    google() { #searches google for $@ or if blank uses $DIALOG
    launcher() { #gtkdialog basic launcher program
    main_dialog() { #parses template of vars to gen and eval a dialog then return the results
    maindialogtemplate() {
    percentbar() { #usage: "$0" XX% name=filename fgcolor=XXX bgcolor=XXX height=XXX width=XXX [vertical]
    pget() { #download $1 to HOME/my-documents with axel
    pickdate() { #choose a date - optional input: $1="text" $2=day $3=month $4=year
    picktime() { #output a time - optional input: $1="text" $2=hours $3=minutes $4=seconds
    pickfile() { #DIALOG box to return a user chosen file to stdout
    pickXcolor() { #DIALOG box to return a user chosen X color to stdout
    reset_mixers() { #from /usr/sbin/alsaconf... was called from rc.local0.
    setDIALOG() { #sets $DIALOG to Xdialog if in X or dialog if in console
    setjwmbg() { #TODO tweaks ... include $HOME/.jwmbg in the jwmrc template
    setXCOLORS() { #sets $XCOLORS from ...rgb.txt
    webcam2avi() { #capture your webcam to HOME/webcam.avi - requires ffmpeg & rxvt
    X2avi() { #capture your desktop to HOME/x11-session.avi - ffmpeg needs x11grab
    Xsetvolume() { #set volume with slider
    Xshowimage() { #quick view of image
TODO partview2, mkinitrd, extractinitrd,...suggestions?
more TODO:
  • 1)optimize/integrate puppy bash scripts/functions - replace with links
    2)split off functions to compressed file that auto extracts on 1st run
    3)make separate documentation file
    4)more guis using main_dialog (integrated from my bbgui program)
    5)suggestions?
About
  • 1) each function tries to use other functions if possible - rather than duplicate code
    2) functions are in alphabetical order to quickly find them
    3) functions/comments are set up so that "folding" makes it easy to develop
Examples not yet implemented:

Code: Select all

#optional description -  TODO add $3 for compression type lzma, gz, etc
mkinitrd() { #creates initrd.gz from directory -usage: mkinitrd dir file
	[ $2 == "" ] && echo usage: $0 directory /path/initrd.cpio.gz && exit 1
	[ ! -d $1 ] && echo First argument must be a directory && exit 1
	rm $2
	cd $1
	find . | cpio -o -H newc | gzip > $2
}

extractinitrd() { #extracts initrd.gz to directory -usage: extractinitrd dir file
	[ $2 == "" ] && echo usage: $0 directory /path/initrd.cpio.gz && exit 1
	[ ! -d $1 ] && echo First argument must be a directory && exit 1
	cd $1
	zcat $2 |cpio -id
}
posting here instead of additional softeware because I still consider it alpha/beta quality due to missing checks for bad input corner cases - please report any necessary fixes or additional functions
Attachments
bashbox-0.4.2.pet
(6.21 KiB) Downloaded 1192 times
Last edited by technosaurus on Tue 15 Mar 2011, 16:07, edited 2 times in total.
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#2 Post by technosaurus »

some screenshots of the guis

and the example code:

Code: Select all

addgroupgui() { #uses main_dialog() -> #addgroup [-g GID] [user_name] group_name
DESCRIPTION="addgroup is a busybox builtin that allows you to manage groups on your system."
CBTT1="-S"
CBV1="Create a system group"
EBV1="user"
EBTT1="Enter the group"
NL1="F"
CBTT2="-g"
CBV2="Use a group ID"
EBV2="GID"
EBTT2="Enter the group ID"
MAX="2"
BBCOMMAND=addgroup
`main_dialog`
}
Note: should move all functions to external file except bashbox and createlinks (they contain the "() {" that gets parsed for, so moving the rest out will simplify things ... and allow other scripts to include it using " . /usr/share/bashbox/bbfxns")
Attachments
template.png
(19.92 KiB) Downloaded 3034 times
addgroup.png
(15.1 KiB) Downloaded 2769 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
Lobster
Official Crustacean
Posts: 15522
Joined: Wed 04 May 2005, 06:06
Location: Paradox Realm
Contact:

#3 Post by Lobster »

5)suggestions?
Hope to see this in Saluki (and used extensively) and other Puppys

Any code samples are great as a basis to hack from
I looked at the create an xpm file - that worked
- I may have a use for it
but don't quite get it

Could you provide sample gui code please?
things like
webcam2avi()
X2avi()
are of immense interest and potential
- just remember I can barely program a DVD recorder
and only just about realise what a function is

anyways:
Mic2mp3/mic2ogg
SendEmail
JoinIRCchannel
Check4DevX
CompileCode
would be a initial suggestions
If you look at early versions of precord (in wary I believe)
it was only two lines of code
that would be worth including

Many thanks :)
Puppy Raspup 8.2Final 8)
Puppy Links Page http://www.smokey01.com/bruceb/puppy.html :D

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#4 Post by technosaurus »

I just split off the functions and added Zigbert's external menu and Pprocess2 (as pprocess so that it doesn't conflict)
while I was at it I added 2 parameters to make the output more sane (ps -a / ps -u : to get just the running programs / running programs with more parameters)

I am trying to get the best parts of Zigbert's almost-hidden libraries in here and split them out into usable parts as I go.

Not sure the best gui style for the ffmpeg programs (X/webcam2avi) - maybe just set the directory and filename and open another dialog to play/convert etc...? ... crap I may need to add woo-ff to it, but I lost my latest version when I finally decided to wipe my last ntfs partition and the forum thread was deleted.... maybe I can port ffconvert instead

Edit:forgot to mention - added documentation in /usr/share/bashbox/bbdoc.sh - but I forgot to add this line to the end:
defaulttexteditor $0
Attachments
bashbox-0.4.9.pet
(11.06 KiB) Downloaded 1095 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#5 Post by technosaurus »

added ffconvert-1.1-development-version (no code reductions yet)
added menu entries for pprocess and ffconvert
clicking on the documentation file (or running it will now open it in the defaulttexteditor)
Attachments
bashbox-0.5.0.pet
(21.35 KiB) Downloaded 1129 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
Flash
Official Dog Handler
Posts: 13071
Joined: Wed 04 May 2005, 16:04
Location: Arizona USA

#6 Post by Flash »

Is Tree something that could be incorporated? I'm not sure what you're doing, so if that's a silly question just ignore it. :)

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#7 Post by technosaurus »

that one is in C but I rewrote it in bash (display only)
maybe it is better to echo to a file and then use less in case you have a really large tree? ... also ../ and ./ cornercases (needs full path or it only goes down one dir)

Code: Select all

#!/bin/sh
DIR=$1
[ $2 ] && SPACING=$2 || SPACING="|"
DIRSPACING="|"
while [ "${#DIRSPACING}" -lt "${#SPACING}" ]
do
DIRSPACING=${DIRSPACING}-
done
for x in `ls $DIR`; do
[ -d $DIR/$x ] &&  echo "$DIRSPACING-{"$x && tree $DIR/$x "$SPACING  " || echo "$SPACING\`-"$x
done
Attachments
tree.png
(4.85 KiB) Downloaded 2734 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
Flash
Official Dog Handler
Posts: 13071
Joined: Wed 04 May 2005, 16:04
Location: Arizona USA

#8 Post by Flash »

I use Tree to list the contents of the directory where all my mp3 books are. My mp3_books directory is arranged as in a library, with subdirectories of authors, and each author subdirectory containing subdirectories of mp3 books by that author. Finally, each mp3 book directory contains the mp3 audio files.

When I use Tree, I don't want it to display the actual files the books contain, only the directories. Mp3 audio books can contain hundreds of mp3 files, typically. Displaying those files wastes all the space on the screen for no purpose.

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#9 Post by technosaurus »

like this?

Code: Select all

tree(){ #display a graphical representation of a file tree from $1 with optional first character $2
DIR=$1 
[ $2 ] && SPACING=$2 || SPACING="F"
DIRSPACING="D" 
while [ "${#DIRSPACING}" -lt "${#SPACING}" ] 
do 
DIRSPACING=${DIRSPACING}- 
done 
for x in `ls $DIR`; do 
[ -d $DIR/$x ] &&  echo "$DIRSPACING-{"$x && $0 $DIR/$x "$SPACING  " || echo "$SPACING\`-"$x 
done
}

dir_tree(){ #display a graphical representation of a directory tree from $1 with optional first character $2
DIR=$1 
[ $2 ] && SPACING=$2 || SPACING="D" 
for x in `ls $DIR`; do 
[ -d $DIR/$x ] &&  echo "$SPACING\`-{"$x && $0 $DIR/$x "$SPACING  "
done
}
rather than using a file output within the function to be able to view large output you can just do something like this:
tree $DIR >/tmp/tree && COMMAND /tmp/tree
where COMMAND could be more, less, defaulttexteditor...
Last edited by technosaurus on Tue 12 Oct 2010, 17:51, edited 2 times in total.
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
Flash
Official Dog Handler
Posts: 13071
Joined: Wed 04 May 2005, 16:04
Location: Arizona USA

#10 Post by Flash »

Well, I'm embarrassed to admit that I don't know how to try that out. :oops: I'll be happy to try it if you'll tell me how.

Here's an old post that shows what I mean. Each of the books in that list contains hundreds of mp3 files. Obviously, showing all the mp3 files would make the list all but useless for my purpose, which is to choose a book to listen to.

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#11 Post by technosaurus »

just save this into a script to test the dir_tree portion

Code: Select all

#!/bin/sh 
DIR=$1 
[ $2 ] && SPACING=$2 || SPACING="|" 
for x in `ls $DIR`; do 
[ -d $DIR/$x ] &&  echo "$SPACING\`-{"$x && $0 $DIR/$x "$SPACING  " 
done
I haven't tested it myself since I'm not on a linux machine at the moment.
Edit: btw I think this could be considered an example of recursion in bash.

Here is a simplified one-liner for dirtree

Code: Select all

#!/bin/sh
for x in `ls $1`; do [ -d $1/$x ] &&  echo "$2\`--{"$x && $0 $1/$x "$2    "; done
and for tree

Code: Select all

#!/bin/sh
for x in `ls $1`; do [ -d $1/$x ] &&  echo "D$2\`-{"$x && $0 $1/$x "$2  |" || echo "F$2\`-<"$x; done
example usage:

tree . > tempfile & Xdialog --tailbox tempfile 0 0

I ported a tiny mp3 player to busybox that you may like - here is the thread http://www.murga-linux.com/puppy/viewtopic.php?t=59417

TODO - randomizer, Trash functions
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
Flash
Official Dog Handler
Posts: 13071
Joined: Wed 04 May 2005, 16:04
Location: Arizona USA

#12 Post by Flash »

I opened a rxvt window in the mp3_books directory (by pressing the ` key to the left of the 1 key while in the mp3_books directory), copied the code above, pasted it into the rxvt window - and nothing happened. I suppose I should have first installed the bashbox .pet above? How do I open a bashbox console in the mp3_books directory?

Edit: The last line of code worked in rxvt, but not well. :(

Here's what it looked like:

Code: Select all

# #!/bin/sh
# for x in `ls $1`; do [ -d $1/$x ] &&  echo "D$2\`-{"$x && $0 $1/$x "$2  |" || echo "F$2\`-<"$x; done
F`-<Benchley,
F`-<Peter
F`-<Borneman,
F`-<Walter
F`-<Carey,
F`-<Peter
F`-<Collins,
F`-<Gail
F`-<Conroy,
F`-<Pat
F`-<Fallada,
F`-<Hans
F`-<Farmer,
F`-<Philip
F`-<Jose
F`-<Farnsworth,
F`-<Christopher
F`-<Ferguson,
F`-<Niall
F`-<Grandin,
F`-<Greg
F`-<Hoeg,
F`-<Peter
F`-<Keillor,
F`-<Garrison
F`-<Matthiessen,
F`-<Peter
F`-<Pickard,
F`-<Nancy
F`-<Preston,
F`-<Douglas
F`-<Preston,
F`-<Douglas
F`-<and
F`-<Child,
F`-<Lincoln
F`-<Runyon,
F`-<Brent
F`-<Scottoline,
F`-<Lisa
F`-<Silko,
F`-<Leslie
F`-<Marmon
F`-<Steinhauer,
F`-<Olen
F`-<Thomas,
F`-<Evan
F`-<Truss,
F`-<Lynn
F`-<White,
F`-<Randy
F`-<Wayne
F`-<Zahn,
F`-<Timothy
# 
I tried to make minimp3 work but couldn't see how. I'm just a .pet, point-and-click man at heart. :lol:

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#13 Post by technosaurus »

they have to be run as scripts to work, because they recursively call themselves ($0 $1 & $2 are the inputs to the script), but your output indicates that you also need support for spaces in file names... next up auto-renaming function
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
zigbert
Posts: 6621
Joined: Wed 29 Mar 2006, 18:13
Location: Valåmoen, Norway
Contact:

#14 Post by zigbert »

technosaurus
I added pprocess to my bashbox script - it went fairly smoothly & I even added a couple of parameters for different formatting, but still need to add the locales. (I am trying to consolidate as many functions as possible into a single script to ease development) Once we get everything together we can probably do some significant code reduction through code reuse (another bonus would be a unified look and feel).

Let me know what you think....or any other goodies you'd like to see added. Is there a reason you have separate files for your functions?
Bashbox is an interesting attempt for further perfection. My personal experience with my lib-apps has some down-sides.

- I tried using the external-menu script in the latest Pmusic, but because of slow bash and gtkdialog, I ended up to hardcode the menus. A general menu-script will be most often slower than a built-from-scratch-script.

- Pfind, Pburn and Picker all uses Pfilesearch. My 'good' idea was to split the search-engine for wider use. The down-side is seen in Pburn when search-settings affect global file-search.

- Full effect of Bashbox, requires that Barry includes it in Woof. Else your script gets Bashbox as a dependency (it will anyway depend on it if used outside Puppy). This is the ever-lasting discussing of Perfection or Diversity.

- Please get me right. As I said, I think this is an interesting attempt. I hope you succeed....... Regardless, these script will be wonderful example of Bash code to 'steal' for other projects.



The use of a unique function-file is just my way of coding. The smaller projects like Pprocess would probably be cleaner if including functions in the main-file. Since all my projects has the same logistic, it is easy for me to navigate in my own code. In more complex code like Pburn and Pmusic it would be a coding hell to collect all functions in one file.


Sigmund

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#15 Post by technosaurus »

zigbert wrote:it would be a coding hell to collect all functions in one file.
Sigmund
I always did it that way too until I figured out "folding", now it is my #1 requirement in an editor. To fold in geany just use Alt+D, F to fold and Alt+D, U to unfold (or use the Document menu)... sure beats having 20 tabs open and makes it easier to do a search for code
Attachments
folding.png
the editing experience with folding
(47.3 KiB) Downloaded 2622 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
zigbert
Posts: 6621
Joined: Wed 29 Mar 2006, 18:13
Location: Valåmoen, Norway
Contact:

#16 Post by zigbert »

Nathan Fisher did something in between..... He used a case-function in another file (as I do it), but instead of actual writing the code inside the case-function he linked it to functions in the same file. Like this you could (un)fold them AND keep them in another file.


Sigmund

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#17 Post by technosaurus »

I have already split the files into 2 for convenience

if you want to use bashbox functions just add:
. /usr/share/bashbox/bbfxns.sh

Here is an updated function list:
  • addgroupgui() { #uses main_dialog() -> #addgroup [-g GID] [user_name] group_name
    blockads() { #tweaks /etc/hosts to ban certain sites
    brokenlinks() { #find broken links in given input dir or pwd if not given
    dirtree() { #show a visualization of directories and files
    fixflash() { #mask your flash version as 10.1 rXXXXXX
    getflash() { #install latest flash
    getflash9() { #flash9 is smaller, fewer deps and still updated
    getinput() { #DIALOG box to return user input to stdout
    google() { #searches google for $@ or if blank uses $DIALOG
    gtkdialog_menu() { #Set up an external menu for your gtkdialog gui
    grep "$1() { #" /usr/share/bashbox/bbfxns.sh #list fxn(s)
    launcher() { #gtkdialog basic launcher program like gexec + dropdown menu
    logstdout() { #usage: logstdout logfile.log command arguments (records normal output)
    logstderr() { #usage: logstderr logfile.log command arguments (records error output)
    logall() { #usage: logall logfile.log command arguments (records error & normal output)
    main_dialog() { #parses template of vars to gen and eval a dialog then return the results
    maindialogtemplate() { #example of how to use main_dialog
    percentbar() { #usage: "$0" XX% name=filename fgcolor=XXX bgcolor=XXX height=XXX width=XXX [vertical]
    pget() { #download $1 to HOME/my-documents with axel
    pickdate() { #choose a date - optional input: $1="text" $2=day $3=month $4=year
    picktime() { #output a time - optional input: $1="text" $2=hours $3=minutes $4=seconds
    pickfile() { #DIALOG box to return a user chosen file to stdout
    pickXcolor() { #DIALOG box to return a user chosen X color to stdout
    play_au() { #just sends $@ to /dev/audio
    play_wav() { #just sends $@ to /dev/dsp
    reset_mixers() { #from /usr/sbin/alsaconf... was called from rc.local0.
    setDIALOG() { #sets $DIALOG to Xdialog if in X or dialog if in console
    setjwmbg() { #TODO tweaks ... include $HOME/.jwmbg in the jwmrc template
    setXCOLORS() { #sets $XCOLORS from ...rgb.txt
    silent() { #run a command with no output #usage: silent command arguments
    silentlog() { #usage: silentlog logfile.log command arguments (records only normal output)
    silentlogall() { #usage: silentlogall logfile.log command arguments (records error & normal output)
    silentlogerr() { #usage: silentlogerr logfile.log command arguments (records only error output)
    test_program_with_LANG() { #$1=LANG followed by command to test
    tolower() { #change input $@ to lower case
    toupper() { #change input $@ to upper case
    tree() { #show a cli visualization of directories and files
    tweet() { #send a tweet $1 is username $2 is password "$3" is the tweet (must be in quotes)
    webcam2avi() { #capture your webcam to HOME/webcam.avi - requires ffmpeg & rxvt
    X2avi() { #capture your desktop to HOME/x11-session.avi - ffmpeg needs x11grab
    Xsetvolume() { #set volume with slider
    Xshowimage() { #quick view of image
    pprocess() { #process manager
    ffconvert() { # FFConvert - a frontend of ffmpeg
Edit - tweet needs to be updated for new twitter api - any tweeters want to tackle it?
Attachments
bashbox-0.5.1.pet
(22.97 KiB) Downloaded 683 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#18 Post by technosaurus »

I was testing different build environments for saluki and wanted a way to check the total disk usage including dependencies and came up with these (added a couple similar functions while I was at it)

more functions for next release:

Code: Select all

addlist(){ #adds a space separated list of numbers
echo $((`echo $@ |tr " " "+"`))
}

multlist(){ #multiplies a space separated list of numbers
echo $((`echo $@ |tr " " "*"`))
}

divide(){ #divide first entry by second
echo $(($1/$2))
}

subtract(){ #subtract second entry from first
echo $(($1-$2))
}

du_deps(){ #returns a space separated list of disk usage including dep libs
for x in `echo $1 && ldd $1 |awk '{print $3 }' |grep -v ")" |grep -v dynamic` ; do du `readlink -f $x` |cut -f1 |tr "\n" " "; done
}

realusage(){ #returns total usage of several apps/libs
for x in $@; do echo $x: && addlist `du_deps $x`; done
}

tot_usage() { #adds up total usage of several apps/libs
echo $@: && addlist `realusage $@ |grep -v ":"`
}
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
abushcrafter
Posts: 1418
Joined: Fri 30 Oct 2009, 16:57
Location: England
Contact:

#19 Post by abushcrafter »

I am adding BashBox to my puplet btw.

Feature Request:
With the "webcam2avi()" and the "X2avi()" functions could you add a option too them or a version of them for OGG and/or WebM output please.
[url=http://www.adobe.com/flashplatform/]adobe flash is rubbish![/url]
My Quote:"Humans are stupid, though some are clever but stupid." http://www.dependent.de/media/audio/mp3/System_Syn_Heres_to_You.zip http://www.systemsyn.com/

User avatar
abushcrafter
Posts: 1418
Joined: Fri 30 Oct 2009, 16:57
Location: England
Contact:

#20 Post by abushcrafter »

Here is your in-dev newer version of Woo-FF
Attachments
woo-ff2.bz2
(4.34 KiB) Downloaded 592 times
[url=http://www.adobe.com/flashplatform/]adobe flash is rubbish![/url]
My Quote:"Humans are stupid, though some are clever but stupid." http://www.dependent.de/media/audio/mp3/System_Syn_Heres_to_You.zip http://www.systemsyn.com/

Post Reply