vital fixes to sudo function
[feisty_meow.git] / scripts / core / launch_feisty_meow.sh
1 #!/bin/bash
2
3 ##############
4
5 # Fred Hamster's Feisty Meow Concerns Ltd. Startup Profile.
6 #
7 # This file is useful within .profile or other initialization scripts.
8 #
9 # Author: Chris Koeritz
10
11 ##############
12
13 # DEBUG_FEISTY_MEOW: if this variable is non-empty, then it causes the feisty meow
14 # scripts to print more diagnostic information when they run.  not all
15 # scripts support this, but the core ones do.
16
17 #export DEBUG_FEISTY_MEOW=true
18
19 ##############
20
21 # this script cannot handle figuring out where it lives, so approaches that
22 # get the THISDIR will fail.  this is a consequence of this always being used
23 # in bash's 'source' directive, which does not pass the script name as
24 # argument 0.  instead, we just check for the bad condition of a malconfigured
25 # script system and try to repair it.
26
27 # we start out thinking things are good.
28 NO_REPAIRS_NEEDED=true
29
30 # check if any crucial folder is hosed.  we will torch the existing config
31 # to the extent we can.
32 if [ ! -d "$FEISTY_MEOW_APEX" ]; then
33   # flag some problems.
34   unset NO_REPAIRS_NEEDED
35   # wipe out the offending variable(s).
36   unset FEISTY_MEOW_SCRIPTS FEISTY_MEOW_APEX
37   # clean out any unfortunate wrongness that may exist in our generated areas.
38   if [ -d "$FEISTY_MEOW_LOADING_DOCK" ]; then \rm -rf "$FEISTY_MEOW_LOADING_DOCK"; fi
39   if [ -d "$FEISTY_MEOW_GENERATED_STORE" ]; then \rm -rf "$FEISTY_MEOW_GENERATED_STORE"; fi
40   # also wipe any values from the variables pointing at generated stuff.
41   unset FEISTY_MEOW_LOADING_DOCK FEISTY_MEOW_GENERATED_STORE
42   echo "
43
44 The feisty meow configuration is damaged somehow.  Please change to the
45 directory where it is stored, e.g.:
46
47   cd /opt/feistymeow.org/feisty_meow
48
49 and run this command (the whole unwieldy multiple line chunk inside the bars):
50
51
52 ##############
53   exec bash -i 3<<EOF 4<&0 <&3
54     echo -e '\n\n^^^ errors above here indicate potential problems in .bashrc ^^^';
55     export FEISTY_MEOW_APEX=\"\$(pwd)\"; export FEISTY_MEOW_SCRIPTS=\$FEISTY_MEOW_APEX/scripts;
56     export FEISTY_MEOW_SHOW_LAUNCH_GREETING=yes;
57     /bin/bash \$(pwd)/scripts/core/reconfigure_feisty_meow.sh;
58     source \$(pwd)/scripts/core/launch_feisty_meow.sh; exec 3>&- <&4
59 EOF
60 ##############
61
62
63 This code snippet assumes that the .bashrc file could still need editing to
64 fix an erroneous FEISTY_MEOW_APEX variable, so we skip it above when bash
65 runs.  Check \$HOME/.bashrc to see if a change there will fix the problem.
66
67 "
68 else
69   # apex is good, so let's make the scripts good too.
70   if [ -z "$FEISTY_MEOW_SCRIPTS" -o ! -d "$FEISTY_MEOW_SCRIPTS" ]; then
71     export FEISTY_MEOW_SCRIPTS="$FEISTY_MEOW_APEX/scripts"
72   fi
73   # check again to test our belief system...
74   if [ ! -d "$FEISTY_MEOW_SCRIPTS" ]; then
75     unset NO_REPAIRS_NEEDED
76     echo -e "The feisty meow scripts cannot be found under the current top:\n  FEISTY_MEOW_APEX=$FEISTY_MEOW_APEX"
77   fi
78 fi
79
80 if [ "$NO_REPAIRS_NEEDED" == "true" ]; then
81
82   # we believe it's safe to run through the rest of this script.
83
84   ##############
85   
86   # some preconditions we want to establish before loading anything...
87   
88   # make sure that aliases can be used in non-interactive shells.
89   # this causes all aliases that are currently defined for this shell to
90   # be inherited by subshells that this shell starts.  this is unusual,
91   # but is preferred for my workflow in feisty meow scripts; it saves me
92   # time re-adding aliases if i can count on them already being there.
93   # this is a problem if you *don't* want the aliases there though.  we can
94   # solve that problem by running bash with the "-O expand_aliases" flags to
95   # stop the expansion for the next subshell.
96   shopt -s expand_aliases
97   
98   # patch the user variable if we were launched by one of our cron jobs.
99   if [ -z "$USER" -a ! -z "$CRONUSER" ]; then
100     export USER="$CRONUSER"
101   fi
102
103   # use the xauth info if we were given one in the environment.
104   # this allows root or other su'd identities to create windows with same
105   # display variable.
106   if [ ! -z "$DISPLAY" -a ! -z "$IMPORTED_XAUTH" ]; then
107     xauth add $DISPLAY . $IMPORTED_XAUTH
108   fi
109   
110   ##############
111   
112   export ERROR_OCCURRED=
113     # there have been no errors to start with, at least.  we will set this
114     # to non-empty if something bad happens.
115   
116   if [ -z "$FEISTY_MEOW_LOADING_DOCK" ]; then
117     # FEISTY_MEOW_LOADING_DOCK is where the generated files are located.
118     # this is our single entry point we can use without knowing any variables
119     # yet in the initialization process.
120     export FEISTY_MEOW_LOADING_DOCK="$HOME/.zz_feisty_loading"
121   #hmmm: the above is kind of a constant.  that's not so great.
122   
123     # make sure our main variables are established.
124     FEISTY_MEOW_VARIABLES_LOADING_FILE="$FEISTY_MEOW_LOADING_DOCK/fmc_variables.sh"
125     if [ ! -f "$FEISTY_MEOW_VARIABLES_LOADING_FILE" ]; then
126       echo -e "\
127   
128   The feisty meow scripts need initialization via the bootstrap process.  For\n\
129   example, if the feisty meow folder lives in '$DEFAULT_FEISTYMEOW_ORG_DIR', then this\n\
130   command bootstraps feisty meow:\n\
131   \n\
132     bash $example_dir/feisty_meow/scripts/core/reconfigure_feisty_meow.sh\n\
133   \n\
134   \n"
135       ERROR_OCCURRED=true
136     fi
137   
138     ##############
139
140     if [ -z "$ERROR_OCCURRED" ]; then
141       # pull in our generated variables that are the minimal set we need to find
142       # the rest of our resources.
143       source "$FEISTY_MEOW_VARIABLES_LOADING_FILE"
144   
145       # Set up the temporary directory.
146       source "$FEISTY_MEOW_SCRIPTS/core/create_tempdir.sh"
147     fi
148   
149   fi
150
151   ##############
152
153   if [ -z "$ERROR_OCCURRED" ]; then
154     # no error occurred in our tests above, so load the larger body of standard feisty
155     # meow variables into the environment.  we actually want this to always run also;
156     # it will decide what variables need to be set again.
157     source "$FEISTY_MEOW_SCRIPTS/core/variables.sh"
158
159     ##############
160
161     # include helpful functions.  we do this every time rather than making it part
162     # of variable initialization, because functions cannot be exported to
163     # sub-shells in bash.
164     source "$FEISTY_MEOW_SCRIPTS/core/functions.sh"
165
166     # load some helper methods for the terminal which we'll use below.
167     source "$FEISTY_MEOW_SCRIPTS/tty/terminal_titler.sh"
168
169     ##############
170
171 #hmmm: abstract this to a twiddle shell options method.
172     # check hash table before searching path.
173     shopt -s checkhash
174     # don't check path for sourced files.
175     shopt -u sourcepath
176     # ignore duplicate lines.
177     HISTCONTROL=ignoredups
178     # append to the history file.
179     shopt -s histappend
180     # automatically update window size if needed.
181     shopt -s checkwinsize
182
183     ##############
184
185     # make history writes immediate to avoid losing history if bash is zapped.
186     echo $PROMPT_COMMAND | grep -q history
187     if [ $? -ne 0 ]; then
188       # we only change the prompt command if we think it hasn't already been done.
189       export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
190     fi
191
192     ##############
193
194     # perform the bulkier parts of the initialization process.
195
196     if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then echo "heavyweight init begins..."; fi
197
198     # set up the aliases for the shell, but only if they are not already set.
199     type CORE_ALIASES_LOADED &>/dev/null
200     if [ $? -ne 0 ]; then
201       if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
202         echo "the aliases were missing, now they are being added..."
203       fi
204       source "$FEISTY_MEOW_LOADING_DOCK/fmc_core_and_custom_aliases.sh"
205     fi
206
207     #echo before the new labelling, terminal titles have:
208     #show_terminal_titles
209
210     # a minor tickle of the title of the terminal, unless we already have some history.
211     label_terminal_with_info
212
213     if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then echo "heavyweight init is done."; fi
214
215     if [ -z "$ERROR_OCCURRED" ]; then
216       # set a sentinel variable to say we loaded the feisty meow environment.
217       export FEISTY_MEOW_SCRIPTS_LOADED=true
218     fi
219
220   fi  # no error occurred.
221
222   if [ ! -z "$FEISTY_MEOW_SHOW_LAUNCH_GREETING" ]; then
223     echo
224     echo
225     echo "welcome to the feisty meow zone of peace, one of many refuges in the uncountably"
226     echo "infinite multiverses that are hypothetically possible."
227     echo
228     echo
229     unset FEISTY_MEOW_SHOW_LAUNCH_GREETING
230   fi
231
232   # only run this hello file if the core feisty meow support haven't been loaded already.  this
233   # hopefully guarantees we show the info at most once in one shell continuum.
234   # this can also be disabled if the NO_HELLO variable has a non-empty value.
235   type CORE_VARIABLES_LOADED &>/dev/null
236   if [ $? -ne 0 -a -z "$NO_HELLO" ]; then
237     # print out a personalized hello file if we find one.
238     if [ -f ~/hello.txt ]; then
239       echo
240       sep 28
241       perl $FEISTY_MEOW_SCRIPTS/*/filedump.pl ~/hello.txt
242       sep 28
243       echo
244     fi
245     # from now on there should be no extra helloing.
246     export NO_HELLO=true
247   fi
248
249   # load the last bits we do here.
250   source "$FEISTY_MEOW_LOADING_DOCK/fmc_ending_sentinel.sh"
251
252 fi # "$NO_REPAIRS_NEEDED" was == "true" 
253