7dac5777b1291eacc5b77109fd57a1d2619ce2a0
[feisty_meow.git] / scripts / archival / general_updater.sh
1 #!/bin/bash
2
3 # a script that handles synchronization of important assets from the MAJOR_ARCHIVE_SOURCES
4 # and the SOURCECODE_HIERARCHY_LIST onto a backup drive of some sort.  it will only copy folders
5 # if there is a target folder of the appropriate name already on the backup medium.
6
7 source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
8
9 # given a location in the filesystem, we will go to that location and attempt to
10 # update any revision control repositories stored there to the latest versions.
11 function update_source_folders()
12 {
13   folder="$1"; shift
14   sep
15   if [ ! -d "$folder" ]; then
16     echo "The folder '$folder' does not exist, so skipping repository update there."
17     return;
18   fi
19   echo getting latest codes in $folder...
20   pushd "$folder"
21   if [ $? -ne 0 ]; then
22     echo Changing to the folder $folder failed.
23     return 1
24   fi
25   bash "$FEISTY_MEOW_SCRIPTS/rev_control/rcheckin.sh"
26   if [ $? -ne 0 ]; then
27     echo Checking out the latest codes has failed somehow for $folder.
28     return 1
29   fi
30   popd
31   sep
32 }
33
34 # this attempts to copy all the contents in a folder called "from" into a folder
35 # called "to".  it's a failure for the "from" folder to not exist, but the "to"
36 # is allowed to not exist (in which case we don't try to synch to it).
37 function synch_directory_to_target()
38 {
39   local from="$1"; shift
40   local to="$1"; shift
41
42   sep
43
44   if [ ! -d "$from" ]; then
45     echo "skipping synch on missing source directory: ${from}"
46     return 0
47   fi
48   if [ ! -d "$to" ]; then
49     echo "skipping synch into non-existent target directory $to"
50     return 0
51   fi
52
53   echo "synching from $from into $to"
54   netcp "$from"/* "$to"/
55   if [ $? -ne 0 ]; then
56     echo "The synchronization of $from into $to has failed."
57     return 1
58   fi
59 }
60
61 # the uber controller method that does the "hard" work of updating.
62 # any items from the MAJOR_ARCHIVE_SOURCES that are on the target will be
63 # updated.  any items found on the target matching the members of the
64 # SOURCECODE_HIERARCHY_LIST will be treated as code hierarchies and updated.
65 function update_archive_drive()
66 {
67   local target_folder="$1"; shift  # where we're backing up to.
68   local currdir  # loop variable.
69
70   sep
71
72   echo Target drive currently has...
73   ls "$target_folder"
74   if [ $? -ne 0 ]; then
75     echo "The target location '$target_folder' is not mounted currently, so cannot be updated."
76     return 1
77   fi
78
79   # synch all our targets.
80   for currdir in $MAJOR_ARCHIVE_SOURCES; do
81     synch_directory_to_target "$currdir" "$target_folder/$(basename $currdir)"/
82   done
83
84   sep
85
86   # update source code if present.
87   echo getting latest fred repositories...
88   pushd "$target_folder"
89   for currdir in $SOURCECODE_HIERARCHY_LIST; do
90     update_source_folders $currdir
91   done
92   
93   sep
94
95   echo successfully updated all expected portions of the target drive at:
96   echo "  $target_folder"
97   echo
98   popd
99 }
100
101 # compares one local well-known folder against the similar folder on a
102 # remote destination.
103 function do_a_folder_compare()
104 {
105   local archname="$1"; shift
106   local dest="$1"; shift
107   if [ -z "$archname" -o -z "$dest" ]; then
108     echo "do_a_folder_compare needs an archive name and a destination host."
109     return 1
110   fi
111
112   if [ -d "/z/$archname" ]; then
113     sep 14
114     echo "Comparing $archname folder..."
115     compare_dirs /z/${archname} ${dest}:/z/${archname}
116     sep 14
117   fi
118 }
119
120 # runs through all the local archives on this host to make sure nothing is
121 # different when compared with the mainline versions on the specified host.
122 function uber_archive_comparator()
123 {
124   local target="$1"; shift
125   if [ -z "$target" ]; then
126     echo uber_archive_comparator needs the target host to compare with.
127     return 1
128   fi
129
130   sep 14
131   echo "comparing against host '$target'"
132   sep 14
133
134 #hmmm: shouldn't this be a list in a variable someplace?
135   for archicle in \
136     basement \
137     imaginations \
138     musix \
139     toaster \
140     walrus \
141     ; do
142       do_a_folder_compare $archicle $target
143   done
144 }
145
146
147 #hmmm: abstractable piece?  the runtime plug at the end of a library script?
148 # this block should execute when the script is actually run, rather
149 # than when it's just being sourced.
150 if [[ $0 =~ .*general_updater\.sh.* ]]; then
151   source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
152   exit_on_error "sourcing the feisty meow environment"
153   update_archive_drive "${@}"
154   exit_on_error "updating archive drive at: $*"
155 fi
156