summaryrefslogtreecommitdiff
path: root/scripts/perl/exec.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/perl/exec.pl')
-rw-r--r--scripts/perl/exec.pl129
1 files changed, 129 insertions, 0 deletions
diff --git a/scripts/perl/exec.pl b/scripts/perl/exec.pl
new file mode 100644
index 000000000..1bb3cf3d8
--- /dev/null
+++ b/scripts/perl/exec.pl
@@ -0,0 +1,129 @@
+##############################################################################
+# #
+# Exec #
+# #
+# Perl script for WeeChat. #
+# #
+# Execute the command and print it to the actual buffer or server #
+# #
+# #
+# #
+# Copyright (C) 2006 Jiri Golembiovsky <golemj@gmail.com> #
+# #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License #
+# as published by the Free Software Foundation; either version 2 #
+# of the License, or (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the Free Software #
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, #
+# MA 02110-1301, USA. #
+# #
+##############################################################################
+
+use Config;
+
+$Config{usethreads} or die( "Recompile Perl with threads to run this script." );
+
+use Thread;
+
+my $registred = 0;
+weechat::register( "Exec", "0.2", "", "Execute the command and print it to some buffer" );
+
+weechat::add_command_handler(
+ "exec",
+ execute,
+ "Execute the command and print it to some buffer",
+ "[-o][ -win server:::channel] <cmd line>",
+ " -o print as msg\n".
+ " -win server:::channel print the output to the specific buffer",
+ ""
+);
+
+sub execute {
+ if( !$registred ) { return; }
+ my $i = 0;
+ my $cmd = "";
+ my $msg = 0;
+ my $win = "";
+ my @arr = split( ' ', $_[1] );
+ my $cmdStart = 0;
+ if( $#arr < 0 ) { return; }
+ for( $i = 0; $i <= $#arr; $i++ ) {
+ if( @arr[$i] eq "-win" ) {
+ $i++;
+ $win = @arr[$i];
+ $cmdStart = $i + 1;
+ }
+ if( @arr[$i] eq "-o" ) {
+ $msg = 1;
+ $cmdStart = $i + 1;
+ }
+ }
+ for( $i = $cmdStart; $i <= $#arr; $i++ ) {
+ if( length( $cmd ) ) { $cmd = $cmd . ' '; }
+ $cmd = $cmd . @arr[$i];
+ }
+
+ my $thr = new Thread \&func_execute, $cmd, $msg, $win;
+}
+
+sub func_execute {
+ my $command = shift;
+ my $msg = shift;
+ my $win = shift;
+ my $c = 1;
+ my $char = '';
+ my $date = `date +%Y%m%d%H%M%S%N`;
+ my $out = "";
+
+ if( !length( $command ) ) {
+ weechat::print( "No command to execute (try -? for help)" );
+ return;
+ }
+
+ if( substr( $date, length( $date ) - 1, 1 ) eq "\n" ) { $date = substr( $date, 0, length( $date ) - 1 ); }
+
+ if( length( $command ) ) { system( $command . " > /tmp/weechat_" . $date . " 2>&1" ); }
+
+ open( FD, '<', "/tmp/weechat_" . $date ) or weechat::print( "/tmp/weechat_" . $date . ": $!" );
+ do {
+ $c = read( FD, $char, 1 );
+ $out = $out . $char;
+ } while( $c );
+ close( FD );
+ system( "rm -f /tmp/weechat_" . $date );
+ my $j = index( $win, ':::' );
+ if( length( $win ) && ( $j >= 0 ) ) {
+ if( $msg ) {
+ my $win1 = substr( $win, $j + 3 );
+ my $win2 = substr( $win, 0, $j );
+ my @its = split( "\n", $out );
+ for( $j = 0; $j <= $#its; $j++ ) {
+ weechat::command( $its[$j], $win1, $win2 );
+ }
+ } else {
+ weechat::print( $out, substr( $win, $j + 3 ), substr( $win, 0, $j ) );
+ }
+ } else {
+ if( $msg ) {
+ my $win1 = substr( $win, $j + 3 );
+ my $win2 = substr( $win, 0, $j );
+ my @its = split( "\n", $out );
+ for( $j = 0; $j <= $#its; $j++ ) {
+ weechat::command( $its[$j], $win1, $win2 );
+ }
+ } else {
+ weechat::print( $out );
+ }
+ }
+}
+
+$registred = 1;
+