Solaris 11 - run a simple BASH script on computer startup
I need to have a simple BASH script run on my Solaris 11 machine automatically whenever the computer (re)starts. It should be run with root permissions and after the computer has fully booted. What is the easiest way to do that?
Thank you
Dusan
Hi user9368043
Yes, that should be right, and be intended this way.
See /etc/rc3.d/README and the following part from smf(5):
Legacy Startup Scripts
Startup programs in the /etc/rc?.d directories are executed
as part of the corresponding run-level milestone:
/etc/rcS.d milestone/single-user:default
/etc/rc2.d milestone/multi-user:default
/etc/rc3.d milestone/multi-user-server:default
Your question concerning upgrading to Solaris 11.1:
In the Gnome menus, you should look for (and start)
System --> Administration --> Update Manager
Let it do its work. It will give you a new boot environment, containing Solaris 11.1. Possibly, you have to perform upgrading twice. With "beadm activate", see beadm(1M), you can go back to Solaris 11.0 whenever you want.
"Local" parts of your zfs root pool, like /usr/local, home directories, /root, and so on, should be in separated file systems, and be mounted outside the root pool before upgrading. They are availlable then from any boot environment, and will not be duplicated. See more in zfs(1M), zpool(1M).
I strongly recommend upgrading. Solaris 11.1 is great.
Similar Messages
-
Simple BASH script to update subversion files
This is just a simple BASH script that will update all .svn files in a specified directory. If an update fails, it will attempt to update all the subdirectories in the failed one, so as much will be updated as possible. Theoretically, you should be able to supply this script with only your root directory ( / ), and all the .svn files on your computer will be updated.
#! /bin/bash
# Contributor: Dylon Edwards <[email protected]>
# ================================
# svnup: Updates subversion files.
# ================================
# If the user supplies no arguments
#+ then, update the current directory
#+ else, update each of those specified
[[ $# == 0 ]] \
&& dirs=($PWD) \
|| dirs=($@)
# Update the target directories
for target in ${dirs[@]}; do
# If the target file contains a .svn file
if [[ -d $target/.svn ]]; then
# Update the target
svn up $target || {
# If the update fails, update each of its subdirectories
for subdir in $( ls $target ); do
[[ -d $target/$subdir ]] &&
( svnup $target/$subdir )
done
# If the target file doesn't contain a .svn file
else
# Update each of its subdirectories
for subdir in $( ls $target ); do
[[ -d $target/$subdir ]] &&
( svnup $target/$subdir )
done;
fi
doneCerebral wrote:
To filter out blank lines, you could just modify the awk command:
${exec awk '!/^$/ { print "-", $_ }' stuffigottado.txt}
very nice; awk and grep: two commands that never cease to amaze me. -
Simple bash scripting help needed..
I want to learn som simple bash scripting in order to automate various tasks.. Im totally noob, so bear with me
First of all I would like to set configs without using nano.. is there a simple command for this? For example if i want change my hostname in /etc/rc.conf.. how can i print the current vallue and how can i change it`?
i was thinking something like this to get the current value:
# cat /etc/rc.conf | grep HOSTNAME=
which returns HOSTNAME="myhostname"
how can i change this value with one or more commands whitout touching the rest of the file?abesto wrote:
A slightly naive solution:
CHOICE="lisa"
NAMES="homer marge lisa bart maggie"
if [ "`echo \" $NAMES \" | grep \" $CHOICE \"`" ]; then
echo "this is how you do it"
fi
The extra spaces inside the escaped quotes are to ensure that only a whole word is "matched".
You can also replace the elif's with a loop through a list of "the other variables". Then you'd use the loop variable instead of $CHOICE above.
grep can check on word-bounderies with \< and \>, or with the -w switch. The -q switch suppresses any messages and exits with exit-code 0 when the first match is found:
if echo "${NAMES}" | grep -qw "${CHOICE}"; then
Nice and readable, should work, but i haven't tested it
EDIT:
Procyon wrote:CHOICE="lisa"
NAMES="homer marge lisa bart maggie"
if [[ $NAMES =~ $CHOICE ]]; then echo match; fi
This one also matches elisa, ie. no check on word bounderies. You should be carefull with that
Last edited by klixon (2009-04-23 09:40:22) -
Not being a regular user of terminal on OSX, I have managed to forget how to run a simple shell script. The purpose of the script is to rename a set of files contained in a specific directory. Here is a sample of the script I wrote some time back:
mv product_22.jpg 080688614423.jpg
This command repeats for each file I need to rename. My recollection is that I simply put the actual script text file in the same directory as the images to be renamed and drag the script file into a new terminal window and hit enter to run. When I try this however I receive the following error:
ord2: Permission denied
Can anyone help me out here? I'm running 10.2.8. I seem to beforgetting a critical step somewhere along the way.
Thanks
Mac OS X (10.2.x)Have you set the execution bit for the script? When not, use: chmod 755 script.
-
Solaris sends SIGKILL to bash script?
I have this bash script that just loops forever (until stopped), it outputs data to files and runs various other commands to display information on the terminal. The problem I'm having is that solaris seems to send SIGKILL to this script after it's been running for a period of time. Typically a few hours. As far as I can tell there's doesn't appear to be anything obviously wrong with the script. Why would solaris send a SIGKILL?? I know it's a sigkill from the exit code 137.
Anyone have any suggestions?? I'm running Solaris 8.
ThanksNo idea, it doesn't really make sense.
You could check if there is anything in crontab or similar which kills processes of idle users, but thats a bit of a long-shoot.
Make your script log to a file frequently, so you can figure out when to determine if its always around the same time, and in which part of the script.
If Solaris would send it a kill signal it wouldn't be SIGKILL.
.7/M. -
Hi all,
I need to run a bash script in Linux which will then run a java program. I managed to run the script successfully (and running the java program eventually) by doing ./myScript. However, when my script is being called by some other programs, the java program doesn't run. I've check the classpath and path, seems everything is in place. I tried having this :
java myjavaProg
in myScript, it doesn't work.
I also tried this, it doesn't work as well :
java -classpath /usr/local/nagios/libexec myjavaProg
Anyone has any idea why? Thanks in advance.I'd suggest editing your bash script, replacing the java call with one that invokes a class with a clearer sense of what it's doing. I mean, write a small class that creates a file in /tmp or something, so you can be more sure whether or not it's being invoked.
Perhaps your java program is running, but it's behaving differently in these circumstances. -
Why does do shell work differntly from running the same bash script in terminal?
i have the following a/s:
set scriptPath to quoted form of ((POSIX path of (path to me)) & lnThumb) set ftn to "" repeat try do shell script scriptPath & " " & ppath & " " & ftn exit repeat on error error_message number error_number if error_number is not -128 then set ftn to (choose file with prompt "select folder thumbnail" default location dir without invisibles) set ftn to quoted form of the POSIX path of ftn end if end try end repeat
calling this bash script:
#!/bin/bash -f cd "$1" rm ./folderthumb.jpg if [ $# -gt 1 ] then ft=${2/#"$1"\//} else ft=$(awk '/folderIcon=/{printf("%s",$1)}' meta.properties | sed s/folderIcon=// ) if [ 0$ft -eq 0 ] then exit 1 fi ft="thumbs/"$ft fi ln -s $ft ./folderthumb.jpg exit 0
which works as expected when run from the cli:
tomw> /Applications/imageProc/fixJAlbum.app/Contents/Resources/Scripts/lnThumb.sh `pwd` `pwd`/thumbs/P1040161.JPG tomw> ls -l folderthumb.jpg lrwxr-xr-x 1 tomw admin 19 Oct 22 10:36 folderthumb.jpg -> thumbs/P1040161.JPG
but fails to strip the common directory when called from do shell:
tomw> ls -l folderthumb.jpg lrwxr-xr-x 1 tomw admin 89 Oct 22 10:36 folderthumb.jpg -> /Users/tomw/Desktop/trip2albequerque/albequerque/oldRailyards2nobHill/thumbs/P1 040133.JPG
w-t-f???Click on the "Use Advanced editor" on the upper Right of the edit box.
Select the text you want preserved
Click on the >> icon then select "Syntax Highlighting" -> "Plain"
And you will get this
kind of
output when you post -
[Systemd] - How to tell if a service is running in a bash script
I need a bash script to query systemd (systemctl or systemd or?) to see if a given service is running. Is there a way to do it talking to systemd directly, not by looking for a pid file or seeing if a process is running? Thank you.
Good point.
I'd say that, in the case of "RemainAfterExit=yes" services, it's not really black and white. The effects of the service are active, even if the service itself has exited, but it's up to the user to decide whether or not that's "running" in their opinion. -
HOW DO I RUN A UNIX BASH SCRIPT FROM JAVA??
HI. Here's a tricky little problem i have. There's a unix bash script that has some commands in it, that manipulate a file. It appends a certain string variable to a file called users. The users file is an ordinary text file.
I know this script to work perfectly, when i invoke it like this directyl from the command line: ./addusers.sh
or even: bash /downloads/selinux/policy/addusers.sh
Now, i have a java program, and its meant to just execute that script. It doesnt throw any Exceptions at runtime. But when i look at the users file, and expect it to have an extra line that was the string variable, the file is UNTOUCHED!
Again, direct command line invocation works, but not from java. Here's what my invocation from java looks like:
Process p = Runtime.getRunTime().exec("bash downloads/selinux/policy/addusers.sh");
The strange thing is, i tried a different bash command. I tried:
Process p = Runtime.getRunTime().exec("mkdir /temporary");
and this worked!
so why not the other one??
I cant figure it out.You say:
bash /downloads/selinux/policy/addusers.sh
And you say in Java:
Process p = Runtime.getRunTime().exec("bash
downloads/selinux/policy/addusers.sh");
As if a leading / would be missing from the Java
version...nyix says:>
...OK sorry about that. i DO have a / in front of the downloads.... section in the java method. So its:
Process p = Runtime.getRunTime().
exec("bash /downloads/selinux/policy/addusers.sh");
HELP please? -
Simple bash script to add a '-' [Solved]
I need to write a small bash script to add a '-' to each line in a file before displaying via conky!
Todo
- Get Milk
- Buy Food
- Pay Bills
Currently I use
TEXT
Todo
${hr}
${head /home/mrgreen/.stuffigottado.txt 30 20}
In .conkyrc but have to add '-' each time I edit .stuffigottado.txt
Thanks in advance....Cerebral wrote:
To filter out blank lines, you could just modify the awk command:
${exec awk '!/^$/ { print "-", $_ }' stuffigottado.txt}
very nice; awk and grep: two commands that never cease to amaze me. -
Another simple bash script to clean pacman cache
here is a simple script that I have written which cleans pacman cache folder in a way that only the packages which are now "updated" in the repositories, will get removed. This is different from what "pacman -Sc" does. pacman -Sc also removes any package which is not installed, while this script keeps all the packages which are updated whether they are installed or not.
The functionality is some how like what "apt-get autoclean" does in debian.
to use this script you need to run it with "list" or "clean" arguments. you can also use the "help" argument for more help.
I hope it helps
#! /bin/bash
# clcache - This script cleans pacman cache folder in a way that only the packages
#+ which are now updated in the repositories, will get removed. This is
#+ different from what "pacman -Sc" does. pacman -Sc also removes any package
#+ which is not installed, while this script keeps all the packages which are
#+ updated whether they are installed or not.
# I have tweaked this script to be as fast as possible, it might still need a
#+ couple of minutes to compelete based on the size of your cache folder.
# to use this script you need to run it with "list" or "clean" arguments.
# you can also use the "help" argument for more help.
# This script is written by "Ali Mousavi". Please report bugs to [email protected]
DIR="/var/cache/pacman/pkg" #the default directory of pacman cache.
ROOT_UID=0 #Only users with $UID 0 have root privilages.
TMPFILE="/tmp/cache.tmp"
# Run as root
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Must be root to run this script"
exit 1
fi
# Check for the arguments
if [ -z "$1" ]
then
echo -e 'What should I do?\nValid Argument are "list", "clean" or "help"'
exit 1
elif [ "$1" = "list" ]
then
ACTION="ls"
MESSAGE="Are you sure you want to continue?"
elif [ "$1" = "clean" ]
then
ACTION="rm -vf"
MESSAGE="Are you sure you want to remove outdated packages? This process can not be undone!"
elif [ "$1" = "help" -o "$1" = "-h" -o "$1" = "--help" ]
then
echo -e "This script checks the packages in your pacman cache directory and removes the packages that are outdated. It doesn't matter if the package is installed or not.\n\n3 arguments can be passed to the script:\n\nlist:\n\tchecks for package that are outdated and prints the names.\n\nclean:\n\tremoves outdated packages.\n\nhelp,-h,--help:\n\tprints this help text.\n\nThis script is written by \"Ali Mousavi\". Please report bugs to [email protected]"
exit 0
else
echo 'Valid Argument are "list", "clean" or "help"'
exit 1
fi
# Check if the user is sure!
echo "This might take a while based on the amount of cached packages."
echo -n "$MESSAGE(y/n) "
read ANS
if [ $ANS = "y" -o $ANS = "Y" -o $ANS = "yes" ]
then
echo "Processing packages..."
elif [ $ANS = "n" -o $ANS = "N" -o $ANS = "No" ]
then
echo "Exiting on user request"
exit 0
else
echo "Invalid answer"
exit 1
fi
# Process the packages
cd $DIR #change to cache directory.
pacman -Sl | awk '{ print $2" "$3; }' > $TMPFILE
for f in $(ls $DIR)
do
pname=$(file $f | cut -d: -f1) #Produces filename, like: fetchmail-6.3.19-1-i686.pkg.tar.xz"
spname=$(echo $pname | sed 's/-[0-9][0-9]*.*//g') #removes package version: fetchmail
pver=$(echo $pname | sed 's/.*-\([0-9\-\.][0-9\-\.]*-[0-9\-\.][0-9\-\.]*\).*/\1/g') #using pacman -Qi for all files takes a lot of time.
if [ $(echo $pver | grep '[^0-9\-\.\-\-]' | wc -l) != 0 ] #checks if package version is alright
then
pver=$(pacman -Qpi $f | grep Version | awk '{print $3}')
fi
newpver=$(grep -e "^$spname " $TMPFILE | awk '{ print $2 }')
if [[ $newpver != $pver ]]
then
$ACTION $f
fi
done
rm -f $TMPFILE
echo "Outdated packages processed successfully!"
exit 0
Last edited by tuxitop (2011-09-13 09:24:26)tuxitop wrote:# Check for the arguments
if [ -z "$1" ]
then
echo -e 'What should I do?\nValid Argument are "list", "clean" or "help"'
exit 1
elif [ "$1" = "list" ]
then
ACTION="ls"
MESSAGE="Are you sure you want to continue?"
elif [ "$1" = "clean" ]
then
ACTION="rm -vf"
MESSAGE="Are you sure you want to remove outdated packages? This process can not be undone!"
elif [ "$1" = "help" -o "$1" = "-h" -o "$1" = "--help" ]
then
echo -e "This script checks the packages in your pacman cache directory and removes the packages that are outdated. It doesn't matter if the package is installed or not.\n\n3 arguments can be passed to the script:\n\nlist:\n\tchecks for package that are outdated and prints the names.\n\nclean:\n\tremoves outdated packages.\n\nhelp,-h,--help:\n\tprints this help text.\n\nThis script is written by \"Ali Mousavi\". Please report bugs to [email protected]"
exit 0
else
echo 'Valid Argument are "list", "clean" or "help"'
exit 1
fi
1. `echo -e 'foo\nbar\nbaz'` gets long and unreadable quickly. Instead, use here documents:
cat <<EOF
What should I do?
Valid Argument are "list", "clean" or "help"
EOF
2. Use a case command, looks cleaner:
case "$1" in
list) ... ;;
clean) ... ;;
help|-h|--hep) ... ;;
# Check if the user is sure!
echo "This might take a while based on the amount of cached packages."
echo -n "$MESSAGE(y/n) "
read ANS
if [ $ANS = "y" -o $ANS = "Y" -o $ANS = "yes" ]
then
echo "Processing packages..."
elif [ $ANS = "n" -o $ANS = "N" -o $ANS = "No" ]
then
echo "Exiting on user request"
exit 0
else
echo "Invalid answer"
exit 1
fi
Try:
read -p "hello: " -r
echo $REPLY
And again, `case` should be cleaner in this case.
# Process the packages
cd $DIR #change to cache directory.
pacman -Sl | awk '{ print $2" "$3; }' > $TMPFILE
While you quoted a lot, you left these two out. "$DIR" and "$TMPFILE" should be quoted, otherwise whitespaces will break the code.
for f in $(ls $DIR)
Apart from the same missing quotes, calling `ls` is a waste here. The following is sufficient and (maybe surprisingly) more accurate:
for f in *
How is it more accurate? Run this test script:
#!/bin/bash
DIR=/tmp/foo
mkdir -p "$DIR"
cd "$DIR"
touch a\ b c$'\n'd
for i in *; do
printf '+%s+\n' "$i"
done
printf '%s\n' ---
for i in $(ls $DIR); do
printf '+%s+\n' "$i"
done
Let's not go too far here. Just get the idea.
do
pname=$(file $f | cut -d: -f1) #Produces filename, like: fetchmail-6.3.19-1-i686.pkg.tar.xz"
Calling `file` here is, again, unnecessary. Also, filename of a package can contain ":", e.g., vi-1:050325-1-i686.pkg.tar.xz, which breaks your code.
Don't complicate things:
pname=$f
spname=$(echo $pname | sed 's/-[0-9][0-9]*.*//g') #removes package version: fetchmail
Broken for ntfs-3g-2011.4.12-1-i686.pkg.tar.xz, nvidia-173xx-utils-173.14.31-1-i686.pkg.tar.xz, etc... Something less lousy:
sed 's/\(-[^-]\+\)\{3\}$//' <<< "$pname"
pver=$(echo $pname | sed 's/.*-\([0-9\-\.][0-9\-\.]*-[0-9\-\.][0-9\-\.]*\).*/\1/g') #using pacman -Qi for all files takes a lot of time.
Although this might work for now, this would break if we had an architecture that starts with a digit, e.g. 686. Something less lousy:
sed 's/\(.*\)-\([^-]\+-[^-]\+\)-[^-]\+$/\2/' <<< "$pname"
if [ $(echo $pver | grep '[^0-9\-\.\-\-]' | wc -l) != 0 ] #checks if package version is alright
then
pver=$(pacman -Qpi $f | grep Version | awk '{print $3}')
fi
Again, calling `wc` here is a waste. Anyway, why is this check necessary at all?
newpver=$(grep -e "^$spname " $TMPFILE | awk '{ print $2 }')
if [[ $newpver != $pver ]]
then
$ACTION $f
fi
done
rm -f $TMPFILE
echo "Outdated packages processed successfully!"
exit 0
The post is getting too long, so so much from me. If there's anything you don't understand yet, read bash(1).
If I sound harsh or anything, don't be discouraged. Just keep reading, keep improving.
Last edited by lolilolicon (2011-09-13 12:53:04) -
Repcheck - A Simple Bash Script To Monitor Remote Repos Commits
Hello all,
I'm using a few git/svn packages from the AUR, and only recently realized that while to PKGBUILD itself is able to pull and build the latest version, the package version in the AUR will not update, unless a new PKGBUILD is pushed by the maintainer, and so my update monitor isn't aware of those remote updates.
I've looked for a convenient way to track such changes, but all I could find were "live" monitors that run constantly and check for updates in a given repo in a set interval.
It didn't fit my needs, so I wrote a script myself.
The script basically maintains a file containing repo address and current revision number (for SVN) or hash (for GIT).
Whenever an update operation is done, all remote hashes are compared to those stored in the file and if updates are found, a notification is sent.
In case of GIT repos, the script also tries to find corresponding AUR package (I couldn't find a standard for SVN addresses...).
It is up to the user to update currently installed version to latest remote version if he wants, script only displays notification.
Dependencies:
- bash
- git
- subversion
- libnotify
* EDIT *
Updated script in next post.
Last edited by adam777 (2013-06-14 11:55:29)#!/bin/bash
RepVersionsFile=~/repversions
TempRepVersionsFile=~/repversionsupd
TempRepUpdatesFile=~/repupdates
function add_to_list()
if [ -f $RepVersionsFile ]
then
tmp=$(cat $RepVersionsFile | grep $1)
if [ -n "$tmp" ]
then
exit
fi
fi
tmp=$(echo $2 | grep ".git")
if [ -z "$tmp" ]
then
current_hash=$(svn info $2 | grep Revision | awk '{ print $NF }')
else
current_hash=$(git ls-remote $2 | grep HEAD | awk '{ print $(NF-1) }')
fi
echo -e "$1 $2 $current_hash" >> $RepVersionsFile
function remove_from_list()
if [ ! -f $RepVersionsFile ]
then
exit
fi
tmp=$(cat $RepVersionsFile | grep -v $1)
if [ -z "$tmp" ]
then
rm $RepVersionsFile
exit
fi
echo -e "$tmp" > $RepVersionsFile
function check_all()
while read pkgname address hash
do
tmp=$(echo $address | grep ".git")
if [ -z "$tmp" ]
then
remote_hash=$(svn info $address | grep Revision | awk '{ print $NF }')
else
remote_hash=$(git ls-remote $address | grep HEAD | awk '{ print $(NF-1) }')
fi
if [ $remote_hash != $hash ]
then
echo -e "$pkgname" >> $TempRepUpdatesFile
fi
echo -e "$pkgname $address $remote_hash" >> $TempRepVersionsFile
done < $RepVersionsFile
if [ -f $TempRepUpdatesFile ]
then
notify-send "Updates Found On Remote Repos" "`cat $TempRepUpdatesFile`"
rm $TempRepUpdatesFile
fi
rm $RepVersionsFile
mv $TempRepVersionsFile $RepVersionsFile
case $1 in
add-address)
add_to_list $2 $3
remove-address)
remove_from_list $2
update)
check_all
echo "Enter Your Choice:";
echo "1 For Adding A Repository";
echo "2 For Removing A Repository";
read userchoice
if [ "$userchoice" == "1" ]
then
echo "Please Enter Package Name";
read pkgname
echo "Please Enter Repository Address";
read repaddress
repcheck add-address $pkgname $repaddress
fi
if [ "$userchoice" == "2" ]
then
echo "Please Enter Package Name";
read pkgname
repcheck remove-address $pkgname
fi
esac
Last edited by adam777 (2013-08-07 16:09:00) -
Simple bash script in SL to remove files
1. SL on MBP
2. launch Terminal
3. pico remove-files
4. in my script are two simple rm /path to file type statements
5. save file in user/bin directory
6. type name of command
7. get "command not found" error
no wonder 99.9999% of the world doesnt program - why doesnt this simple setup work right ?Chris Chamberlain1 wrote:
just guessing, if it type ./remove-files this script works.
That's the traditional way to invoke a program or command file if its location is not in your path. If that file is in /usr/bin and /usr/bin is in your path, I'm not sure why your situation doesn't work. On my Mac the directory bin in /usr is owned by root:wheel. If yours is the same, how did you manage to create your script there without permission manipulations? What exactly did you mean when you first mentioned "save file in user/bin directory"? Did you really mean /usr/bin or something else? If you meant some other location, you might want to add that location to your path with this command:
PATH=yourotherdirectory:$PATH -
[solved] Help with simple bash script
#!/bin/bash
current_state=cat /home/phil/.screen_state
if ["$current_state" = "laptop"];
then
disper -S
echo TV > .screen_state
else
disper -s
echo laptop > .screen_state
fi
[phil@pwned ~]$ ./screenswitch.sh
./screenswitch.sh: line 3: /home/phil/.screen_state: Permission denied
./screenswitch.sh: line 5: [: missing `]'
[phil@pwned ~]$ cat /home/phil/.screen_state
laptop
[phil@pwned ~]$
I'm not sure why I'm getting the permission denied, and also I can't see whats wrong with line 5.
Last edited by Dethredic (2011-08-21 19:46:57)IIRC you need spaces
if [ "foo" = "foo" ]; then
between '[' and another character.
Edit: Got it.
current_state=cat /home/phil/.screen_state
This is plain wrong. I get 'Permission denied' too.
Try
current_state=$(cat /home/phil/.screen_state)
Last edited by karol (2011-08-21 17:59:16) -
A bash script to backup system only with modified files
Hi,
I've made a simple bash script to exam which files are modified and needed to be backed up.
It will use:
1. the hash in Pacman's database (/var/lib/pacman/local/<pkg_ver>/files
2. if no hash in the database, calculate it by our self from cache (/var/cache/pacman/pkg/<pkg_ver>.pkg.tar.gz
3. if no cache found, compare build date and last modified date
4. otherwise, this file better be backed up.
Currently it will only print which files are needed to be backed up, but no backup actually happens. (dry run)
And it is only in early development stage, please be careful.
USAGE:
<the script name> <where to backup files, a directory> <the files, or directories, separated by space, that are going to be examined>...
Here is the code.
#!/bin/bash
# usage:
# $1: file to backup
function do_backup() {
echo
function smart_bak() {
pkg=$(pacman -Qo "$1" 2>/dev/null)
if [ 1 -eq $? ] ; then
# No package owns $1 (locally created)
if [ "$1" != "${1%.pacsave}" ] ; then
echo "skip $1 (left by removed package)"
else
echo "backup $1 (local file)"
fi
else
pkg=${pkg#$1 is owned by }
# evaluate
# by hash
cur=$(md5sum $1)
cur=${cur%% *}
pkg_ver=${pkg/ /-}
org=$(grep "^${1:1}" "/var/lib/pacman/local/$pkg_ver/files")
org_hash=${org##* }
if [ "$org" != "$org_hash" ] ; then
# the org hash is in Pacman's database
if [ "$org_hash" = "$cur" ] ; then
echo "skip $1 (original config)"
else
echo "backup $1 (modified config)"
fi
else
# no hash
# find out hash myself?
ARCH=$(uname -m)
if [ -r "/var/cache/pacman/pkg/$pkg_ver-$ARCH.pkg.tar.gz" ] ; then
org=$(tar -Oxzf "/var/cache/pacman/pkg/$pkg_ver-$ARCH.pkg.tar.gz" "${1:1}" | md5sum -)
org_hash=${org%% *}
if [ "$cur" = "$org_hash" ] ; then
echo "skip $1 (original)"
else
echo "backup $1 (modified)"
fi
else
# no cache, may be a AUR package
# fall back to built date?
date=$(pacman -Qi ${pkg% *} | grep "^Build Date")
date=${date#*: }
date=$(date -d "$date" +%s)
mod=$(ls -l $1)
mod=${mod% $1}
mod=${mod#* * * * * }
mod=$(date -d "$mod" +%s)
tmp1=$(expr $mod "+" 60)
tmp2=$(expr $mod "-" 60)
if [ "$date" -le "$tmp1" -a "$date" -ge "$tmp2" ] ; then
echo "skip $1 (the same date)"
else
echo "backup $1 (unknown)"
fi
fi
fi
fi
function smart_bak_dir() {
for i in $(ls -A "$1") ; do
tmp="${1%/}/$i"
if [ -f "$tmp" ] ; then
smart_bak "$tmp"
elif [ -d "$tmp" ] ; then
smart_bak_dir "$tmp"
else
echo "skip $tmp (not a regular file nor a directory)"
fi
done
# usage:
# $1: the directory to store this backup
# $2: directory to evalualte for backup
# function main()
# init
target="$1"
shift
# check
if [ ! -d "$target" -o ! -x "$target" -o ! -w "$target" ] ; then
exit 4
fi
for i in $* ; do
if [ -f "$i" ] ; then
smart_bak "$i"
elif [ -d "$i" ] ; then
smart_bak_dir "$i"
else
echo "skip $i (unknown argument)"
fi
done
Good luck,
bsdson
Last edited by bsdson.tw (2008-12-30 07:53:05)Thanks for this script. Nice work.
Can we traverse the pacman.log backwards up and rollback each operation (including "installed" in this). Something like:
history=$(tail -n +$(grep -m 1 -n "$1" "$LOG" | cut -d ":" -f 1) "$LOG" | tac | grep -E "(upgraded|installed)" | cut -d " " -f 3-)
Last edited by g33k (2008-11-04 15:08:07)
Maybe you are looking for
-
Acrobat 9.0 Standard Licensing Errors
I have 11 copies of Adobe Acrobat 9.0 Standard installed in our office. One of the installations keeps receiving a licensing error - usually just after a Microsoft update. The error is "Licensing for this product has stopped working 148:3". I have un
-
Using SSIS and SSRS with Essbase
In Essbase, is it possible to do your ETL function using Sql Server Integration Services? And generate reports from the cube using SQL Server Reporting Services? TIA
-
I'm having a bit of trouble with sizes in keynote. I need to print out my slides and the objects within them have to be the correct size. I resize them so that they say they are the correct dimensions in Keynote but when I print them they always seem
-
Forefront Password Registration
Hello, Is there any possibilities that user can make registration from internet for their forefront password registration without including domain name ? for e.g instead of domain\username I want only username or domain name include automatically so
-
Hello Guys! I'm having the following error in the RWB, > Component monitoring > Adapter Engine ..> Result of self-test Internal error: system status for cluster nodes 477459051 not available can you send me help about this Error? Thanks in advance. N