lilalo
annotate l3bashrc @ 150:822b36252d7f
Вывод больших фрагментов текста не теряется.
Большие фрагменты текста теперь не вырезаются бесследно.
Там, откуда они вырезаются, вставляются ссылки,
по которым можно посмотреть полную версию вывода.
Испытано на больших фрагментах текста,
содержащих до 5000 строк (фрагменты более 5000 строк по умолчанию
обрезаются административно; допустимые размеры задаются в l3config.pm).
Исправлены ошибки, из-за которых большие фрагменты
обрабатывались некорректно.
Большие фрагменты текста теперь не вырезаются бесследно.
Там, откуда они вырезаются, вставляются ссылки,
по которым можно посмотреть полную версию вывода.
Испытано на больших фрагментах текста,
содержащих до 5000 строк (фрагменты более 5000 строк по умолчанию
обрезаются административно; допустимые размеры задаются в l3config.pm).
Исправлены ошибки, из-за которых большие фрагменты
обрабатывались некорректно.
author | igor@chub.in |
---|---|
date | Tue Jun 23 01:15:02 2009 +0300 (2009-06-23) |
parents | 1cbdfdde1274 |
children | 8ee5e59f1bd3 137cf5a580be |
rev | line source |
---|---|
devi@70 | 1 #!/bin/sh |
devi@70 | 2 |
devi@105 | 3 # (c) Igor Chubin, igor@chub.in, 2004-2006 |
devi@70 | 4 |
devi@76 | 5 # Environment variables set by the script: |
devi@76 | 6 # |
devi@76 | 7 # L3_SESSION_ID - uniq id of the LiLaLo-session |
devi@76 | 8 # L3_PARENT_TTY - name of tty on which script is running |
devi@76 | 9 # PS1 - intercative shell prompt in which LiLaLo hides |
devi@76 | 10 # various information about the command |
devi@76 | 11 # L3_TAMPERED_EDITORS - list of editors which are tampered with functions |
devi@76 | 12 |
devi@76 | 13 |
devi@76 | 14 # Functions with the names starting _l3_ are internal. |
devi@76 | 15 # Such functions are unset before this rc script exits |
devi@76 | 16 |
devi@76 | 17 _l3_editors_to_tamper='/bin/vi /usr/bin/vi /usr/bin/vim /bin/ee /usr/bin/ee /usr/bin/pico /usr/bin/nano /usr/local/bin/vim' |
devi@76 | 18 |
devi@70 | 19 _l3_start() |
devi@70 | 20 { |
devi@80 | 21 echo $- | grep -q i || return 0 |
devi@79 | 22 if _l3_is_running_here |
devi@76 | 23 then |
devi@76 | 24 _l3_env |
devi@76 | 25 _l3_init_prompt |
devi@76 | 26 l3_fix_prompt |
devi@76 | 27 _l3_tamper_editors |
devi@76 | 28 _l3_tamper_commands |
devi@76 | 29 _l3_unset_internal |
devi@79 | 30 else |
devi@79 | 31 _l3_start_session |
devi@79 | 32 _l3_run_script |
devi@76 | 33 fi |
devi@76 | 34 } |
devi@76 | 35 |
devi@76 | 36 # ===================== STAGE 1 ============================ |
devi@76 | 37 |
devi@79 | 38 _l3_is_running_here() |
devi@76 | 39 { |
devi@79 | 40 ps waux | awk '{print $2" "$11 }' | grep -q ^$PPID" "script |
devi@79 | 41 return $? |
devi@79 | 42 |
devi@79 | 43 # Check if ^^^^ run on Linux |
devi@79 | 44 # and del vvvv this if it does |
devi@79 | 45 |
devi@76 | 46 export L3_TTY=`/usr/bin/tty` |
devi@79 | 47 uname -a | grep -qi bsd && bsd=yes |
devi@70 | 48 proc_on_the_term=`w | grep "${L3_TTY##/dev/}" | awk '{print $8;}'` |
devi@70 | 49 # freeBSD: |
devi@70 | 50 [ -n "$bsd" ] && \ |
devi@70 | 51 proc_on_the_term=`w | grep "${L3_TTY##/dev/tty}" | awk '{print $6;}'` |
devi@70 | 52 |
devi@79 | 53 [ -n "$proc_on_the_term" ] && echo $proc_on_the_term | grep -q script |
devi@70 | 54 } |
devi@70 | 55 |
devi@70 | 56 _l3_start_session() |
devi@70 | 57 { |
devi@79 | 58 export L3_SESSION_ID=${RANDOM}${RANDOM}${RANDOM}${RANDOM}-`date +%s` |
devi@71 | 59 export L3_HOME=~/.lilalo/ |
devi@70 | 60 mkdir -p $L3_HOME |
devi@70 | 61 |
devi@79 | 62 tty=`/usr/bin/tty` |
devi@70 | 63 uname -a | grep -qi bsd && bsd=yes |
devi@70 | 64 parent=`cat /proc/$PPID/cmdline 2> /dev/null` |
devi@79 | 65 [ -z "$parent" ] && parent="`ps waux | awk '{if ($2 == '$PPID') print $11; }'`" |
devi@70 | 66 system=`uname -rs` |
devi@79 | 67 login_from=`who | grep "${tty##/dev/}" | awk '{print $6;}' | tr -d '()'` |
devi@70 | 68 #[ -n "$bsd" ] && login_from="" #FIXME! |
devi@70 | 69 start_time=`date +%s` |
devi@70 | 70 hostname=`hostname -f 2> /dev/null` |
devi@70 | 71 [ -n "$bsd" ] && hostname=`hostname` |
devi@70 | 72 |
devi@70 | 73 cat <<INFO > $L3_HOME/$L3_SESSION_ID.info |
devi@70 | 74 <session> |
devi@70 | 75 <local_session_id>$L3_SESSION_ID</local_session_id> |
devi@70 | 76 <hostname>$hostname</hostname> |
devi@70 | 77 <user>$USER</user> |
devi@70 | 78 <uid>$UID</uid> |
devi@70 | 79 <login_from>$login_from</login_from> |
devi@79 | 80 <tty>$tty</tty> |
devi@70 | 81 <system>$system</system> |
devi@70 | 82 <parent>$parent</parent> |
devi@70 | 83 <ppid>$PPID</ppid> |
devi@70 | 84 <pid>$$</pid> |
devi@70 | 85 <start_time>$start_time</start_time> |
devi@76 | 86 <lang>$LANG</lang> |
devi@70 | 87 </session> |
devi@70 | 88 INFO |
devi@70 | 89 |
devi@79 | 90 unset parent system login_from start_time hostname tty |
devi@70 | 91 } |
devi@70 | 92 |
devi@70 | 93 _l3_run_script() |
devi@70 | 94 { |
devi@70 | 95 uname -a | grep -qi bsd && bsd=yes |
devi@70 | 96 flush="-f" #linux |
devi@70 | 97 [ -n "$bsd" ] && flush="-t 0" #freebsd |
devi@76 | 98 export L3_PARENT_TTY=`/usr/bin/tty` |
igor@149 | 99 exec script $flush -c ${0#-} -q $L3_HOME/${L3_SESSION_ID}.script |
devi@70 | 100 } |
devi@70 | 101 |
devi@76 | 102 # ===================== STAGE 2 ============================ |
devi@76 | 103 |
devi@76 | 104 _l3_env() |
devi@76 | 105 { |
devi@76 | 106 trap l3_close_session 2 |
devi@76 | 107 trap l3_close_session EXIT |
devi@76 | 108 true |
devi@76 | 109 } |
devi@76 | 110 |
devi@76 | 111 l3_close_session() |
devi@70 | 112 { |
devi@71 | 113 ( |
devi@71 | 114 echo '<history>' |
devi@71 | 115 history | sed 's/&/\&/; s/</\</g; s/>/\>/g' |
devi@71 | 116 echo '</history>' |
devi@71 | 117 ) >> $L3_HOME/$L3_SESSION_ID.info |
devi@70 | 118 } |
devi@70 | 119 |
devi@76 | 120 _l3_init_prompt() |
devi@76 | 121 { |
devi@76 | 122 PS1='[\u@\h:\W]\$ ' |
devi@77 | 123 [ $UID = 0 ] \ |
devi@77 | 124 && PS1='\[\033[0;31m\]'$PS1'\[\033[0m\]' \ |
devi@77 | 125 || PS1='\[\033[0;32m\]'$PS1'\[\033[0m\]' \ |
devi@76 | 126 export PS1 |
devi@76 | 127 } |
devi@76 | 128 |
devi@76 | 129 l3_fix_prompt() |
devi@76 | 130 { |
igor@119 | 131 export PS1='\[$($L3_HOME/l3prompt "v3#\!#$?#$UID#$$#$(/bin/date +%s)#$PWD#$RANDOM#")$(l3_save_last_line >& /dev/null)\]'$PS1 |
devi@76 | 132 } |
devi@76 | 133 |
devi@76 | 134 _l3_tamper_editors() |
devi@76 | 135 { |
devi@76 | 136 for editor_file in $_l3_editors_to_tamper |
devi@76 | 137 do |
devi@76 | 138 [ -x $editor_file ] || continue |
devi@76 | 139 editor_name=${editor_file##*/} |
devi@76 | 140 eval " |
devi@76 | 141 $editor_name() { |
devi@76 | 142 if [ -d \"\$1\" ] |
devi@76 | 143 then |
devi@76 | 144 $editor_file \"\$1\" |
devi@76 | 145 return \$? |
devi@76 | 146 else |
devi@76 | 147 TIME=\"\`date +%s\`\" |
devi@76 | 148 DIR=\"\" |
devi@76 | 149 [ \"\${1#/}\" = \"\$1\" ] && DIR=\"\$PWD/\" |
devi@80 | 150 DIFFNAME=\"\${L3_SESSION_ID}_\${TIME}\`echo \$DIR\$1| sed s@_@__@ | sed 's@/@_@g'\`.diff\" |
devi@76 | 151 old_file=\"/tmp/l3-saved-\$\$.\$RANDOM.\$RANDOM\" |
devi@76 | 152 /bin/cp -- \"\$1\" \"\$old_file\" 2> /dev/null |
devi@76 | 153 $editor_file \"\$@\" || ERR=\$? |
igor@112 | 154 if [ -e \"\$old_file\" ] |
igor@112 | 155 then |
igor@112 | 156 diff -u \"\$old_file\" \"\$1\" > \"\$L3_HOME/\$DIFFNAME\" 2> /dev/null |
igor@112 | 157 else |
igor@112 | 158 diff -u /dev/null \"\$1\" > \"\$L3_HOME/\$DIFFNAME\" 2> /dev/null |
igor@112 | 159 fi |
devi@76 | 160 /bin/rm \"\$old_file\" 2> /dev/null |
devi@76 | 161 return \$ERR |
devi@76 | 162 fi |
devi@76 | 163 } |
devi@76 | 164 " |
devi@76 | 165 L3_TAMPERED_EDITORS="$L3_TAMPERED_EDITORS $editor_name" |
devi@76 | 166 done |
devi@76 | 167 [ -n "$L3_TAMPERED_EDITORS" ] && export L3_TAMPERED_EDITORS |
devi@76 | 168 } |
devi@76 | 169 |
devi@76 | 170 _l3_tamper_commands() |
devi@76 | 171 { |
devi@76 | 172 tty() |
devi@76 | 173 { |
devi@76 | 174 [ -n "$L3_PARENT_TTY" ] && echo $L3_PARENT_TTY || /usr/bin/tty |
devi@76 | 175 } |
devi@76 | 176 } |
devi@76 | 177 |
devi@76 | 178 _l3_unset_internal() |
devi@76 | 179 { |
devi@76 | 180 unset `set | grep '^_l3_.*()' | sed 's/()//'` |
devi@76 | 181 unset `set | grep '^_l3_.*=' | sed 's/=.*//'` |
devi@76 | 182 } |
devi@78 | 183 |
devi@78 | 184 l3shot() |
devi@78 | 185 { |
devi@78 | 186 if [ -x "`which xwd`" ] |
devi@78 | 187 then |
devi@78 | 188 _l3_home=${L3_HOME:-~/.lilalo} |
devi@78 | 189 shot_name="${L3_SESSION_ID}_`date +%s`".xwd |
devi@78 | 190 echo -n Choose window to be shoot ... >&2 |
devi@78 | 191 [ -d ${_l3_home} ] || mkdir -p ${_l3_home} |
devi@78 | 192 xwd -out "$_l3_home/$shot_name" \ |
devi@78 | 193 && echo Screenshot is written to ${_l3_home}/${shot_name} \ |
igor@115 | 194 && curl -s -F photo=@$_l3_home/$shot_name http://`l3-config backend_address`/l3-upload |
devi@78 | 195 else |
devi@78 | 196 { |
devi@78 | 197 echo |
devi@78 | 198 echo "Can't make screenshot :(" |
devi@78 | 199 echo |
devi@78 | 200 echo I must use program xwd to make screenshot, |
devi@78 | 201 echo but it seems not to be installed |
devi@78 | 202 echo Try to find the program in the \"xbase-clients\" package |
devi@78 | 203 echo |
devi@78 | 204 } >&2 |
devi@78 | 205 fi |
devi@78 | 206 } |
devi@97 | 207 |
igor@111 | 208 l3upload() |
igor@111 | 209 { |
igor@111 | 210 if [ $# -lt 1 ] |
igor@111 | 211 then |
igor@111 | 212 echo Usage: |
igor@111 | 213 echo |
igor@144 | 214 echo l3upload "<filename> [<time>]" |
igor@111 | 215 echo |
igor@111 | 216 echo "<filename>" - name of the file to upload |
igor@111 | 217 return 1 |
igor@111 | 218 else |
igor@111 | 219 source=$1 |
igor@144 | 220 time=`date +%s` |
igor@144 | 221 [ -n "$2" ] && time="$2" |
igor@144 | 222 target="${L3_SESSION_ID}_$time"_"$(echo $source|sed s@.*/@@)" |
igor@111 | 223 if echo $source | grep -q http:// |
igor@111 | 224 then |
igor@111 | 225 curl -s "$source" > /tmp/$target |
igor@111 | 226 else |
igor@111 | 227 [ -r "$source" ] || { echo "l3upload: Can't open $source for reading" > /dev/stderr; return 1; } |
igor@111 | 228 cp $source /tmp/$target |
igor@111 | 229 fi |
igor@111 | 230 echo Uploaded file name is ${target} |
igor@115 | 231 curl -s -F photo=@/tmp/$target http://`l3-config backend_address`/l3-upload && rm -f /tmp/$target |
igor@111 | 232 fi |
igor@111 | 233 } |
igor@111 | 234 |
igor@144 | 235 l3mass_upload() |
igor@144 | 236 { |
igor@144 | 237 for i in "$@" |
igor@144 | 238 do |
igor@144 | 239 l3upload $i `perl -e 'print (((stat("$i"))[9])."\n")'` |
igor@144 | 240 done |
igor@144 | 241 } |
igor@144 | 242 |
devi@97 | 243 # Append lines from "$@" files to the end of the shell history |
igor@111 | 244 hist_append () |
igor@111 | 245 { |
igor@111 | 246 eval $(cat "$@" | sed 's/"/\\\\"/g' | while read line; do echo history -s \"$line\"\;; done); |
devi@97 | 247 } |
devi@97 | 248 |
devi@97 | 249 l3_save_last_line () |
devi@97 | 250 { |
devi@97 | 251 ( |
devi@97 | 252 echo '<cline>' |
devi@97 | 253 history 1 | sed 's/&/&/; s/</\</g; s/>/\>/g' |
devi@97 | 254 echo '</cline>' |
devi@97 | 255 ) >> $L3_HOME/$L3_SESSION_ID.info |
devi@97 | 256 } |
devi@97 | 257 |
devi@107 | 258 l3 () |
devi@107 | 259 { |
devi@107 | 260 case "$1" in |
devi@107 | 261 on) |
devi@107 | 262 echo switching on |
devi@107 | 263 ;; |
devi@107 | 264 off) |
devi@107 | 265 echo switcing off |
devi@107 | 266 ;; |
devi@107 | 267 cd) |
devi@107 | 268 echo l3cd="$2" > ~/.l3rc |
devi@107 | 269 ;; |
devi@107 | 270 pwd) |
devi@107 | 271 grep ^l3cd= ~/.l3rc | sed s/[^=]*=// |
devi@107 | 272 ;; |
devi@107 | 273 *) |
igor@109 | 274 cat <<EOF |
igor@109 | 275 l3 [command]: |
igor@109 | 276 |
igor@109 | 277 cd new_context - change current lilalo context |
igor@109 | 278 pwd - show current lilalo context |
igor@109 | 279 on - switch writing on (NOT IMPLEMENTED YET) |
igor@109 | 280 off - switch writing off (NOT IMPLEMENTED YET) |
igor@109 | 281 |
igor@109 | 282 EOF |
devi@107 | 283 ;; |
devi@107 | 284 esac |
devi@107 | 285 } |
devi@97 | 286 |
igor@109 | 287 l3cd() |
igor@109 | 288 { |
igor@109 | 289 l3 cd "$@" |
igor@109 | 290 } |
igor@109 | 291 |
igor@109 | 292 l3pwd() |
igor@109 | 293 { |
igor@109 | 294 l3 pwd |
igor@109 | 295 } |
igor@109 | 296 |