lilalo

view l3bashrc @ 150:822b36252d7f

Вывод больших фрагментов текста не теряется.

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