Наша помощь самим себе....

akick

letter to god
Незнаю как правильно сказать, но может ктото из пользователей среды Юникса решает какието прикладные задачи для себя програмным способом дабы обгечить ети самые задачи.... вот начну с себя....

- Мне никогда не нравилось писать полный путь для перезапуска сервисов тоесть /etc/init.d/ /etc/rc.d/ и т.д. потому я для себя написал простенький скриптик на пхп, но т.к. в чистой консоли пхп отказывается пускаццо пришлось оформить на баше:
Код:
#!/bin/bash

status=1             # correct program status#
spath="/etc/init.d/" #path to system services#

function helpr () 
{ 
echo 'This function exec when not correct uses of program !!!'
echo 'Uses: '
echo '      '$0' <service> <code>'
echo 'Codes: '
echo '       0 - stop;'
echo '       1 - start;'
echo '       2 - status;'
echo '       3 - restart;'
echo '       4 - reload (default);'
exit; 
}


if [ "$1" = "" ]; then
  status=0;
fi

case "$2" in
0) cmd='stop';;
1) cmd='start';;
2) cmd='status';;
3) cmd='restart';;
4) cmd='reload';;
*) cmd='reload';
esac

if [ $status -eq 0 ]; then
helpr;
fi

$spath$1 $cmd
также... когдато мне очень нужно было перекодировать огромное количество файлов из одной кодировки в другую при етом заменить символ конца строки в юникс формат \r\n на \n я не думаю, что я выбрал самый рациональный способ, но моё пристрастие к пхп привело меня к написанию данной программы:

Код:
#!/usr/bin/php -q
<?

  Class RecodeMaker
  {
    /** Декларация глобальных переменных класса */
    var $lFrom;
    var $lTo;
    var $lDir;
    var $fArr;
    var $SysLNG='this is your locale';
    var $MyLNG='CP1251';
    var $msg; //Массив сообщений
    var $LineLength=80; // длинна рамок

    /** Установка локальных параметров системы перекодирования файлов.... */
    
    function __construct($lFromIn=NULL,$lToIn=NULL,$lDirIn=NULL)
    {
      $this->getSysLANG();
      if($lFromIn==NULL)
            {
            $this->Help();
            $this->errorRecode("__construct()",$this->msg[0][0]);
            }
            else
            $this->lFrom=$lFromIn;
      if($lToIn==NULL)
            {
            $this->Help();
            $this->errorRecode("__construct()",$this->msg[0][1]);
            }
            else
            $this->lTo=$lToIn;
      if($lDirIn==NULL)
            $this->lDir=getcwd().'/';
            else
            $this->lDir=$lDirIn.'/';
      $this->infoRecode("__construct()",$this->msg[1][8]);
      $this->getFiles();
      $this->recodeFiles();
    }
    
    /** Создание сообщений системы */
    
    function createMSG()
    {
      /** msg[0][X] - массив ошибок, msg[1][X] - массив сообщений (информационных) msg[2][X] - массив частей помощи ;)
      	  Хелп(msg[2][X] можно расширять без каких либо внесений изменений в код...... */
      $this->msg[0][0]	=	'Исходная кодировка файлов не задана !!!';
      $this->msg[0][1]	=	'Выходная кодировка файлов не задана !!!';
      $this->msg[0][2]	=	'файл не может быть загружен в массив !!!'."\n".'die(\'Read Error\');';
      $this->msg[0][3]	=	'файл не может быть записан данными !!!'."\n".'die(\'Write Error\')';
      //-------------------------------------------------------------------------
      $this->msg[1][0]	=	'Файл успешно перекодирован, переходим к следующему !            )';
      $this->msg[1][1]	=	'Последний файл успешно перекодирован !                          )';
      $this->msg[1][2]	=	'Locale successfully received '.$this->SysLNG;
      $this->msg[1][3]	=	'всё файлы перекодированы ;-)';
      $this->msg[1][4]	=	'Директория прочитана, файлы внесены, распознаны. Приступаем к работе...'."\n\n";
      $this->msg[1][5]	=	'Все сообщения перекодированы из '.$this->MyLNG.' в '.$this->SysLNG."\n";
      $this->msg[1][6]	=	'System messages successfully generated';
      $this->msg[1][7]	=	'Кодировка моих сообщений идентична с вайшей локалью ('.$this->MyLNG.')';
      $this->msg[1][8]	=	'агрументы удачно получены';
      $this->msg[1][9]	=	'спасибо, что воспользовались мной.';
      //-----------------------------------------------------------------------
      $this->msg[2][0]	=	"\t ****************************************\n";
      $this->msg[2][1]	=	"\t(**              Программа             **)\n";
      $this->msg[2][2]	= 	"\t(** массового перекодирования файлов,  **)\n";
      $this->msg[2][3]	=  	"\t(** а также замена кода \\r\\n на \\n     **)\n";
      $this->msg[2][4]	=  	"\t(** тоесть символа конца строки в Unix **)\n";
      $this->msg[2][5]	=  	"\t(**    разработал akick ©2006-2007     **)\n";
      $this->msg[2][6]	=  	"\t ****************************************\n\n";
      $this->msg[2][7]	=  	"Использовать:\n";
      $this->msg[2][8]	=  	"\tmrecode [вх_код] [вых_код] [путь]\n";
      $this->msg[2][9]	=  	"\tвх_код - начальная кодировка файлов(в которой они);\n";
      $this->msg[2][10]	=  	"\tвых_код - кодировка в какой они должны быть в результате;\n";
      $this->msg[2][11]	=  	"\tпуть - путь к файлам (по умолчанию getcwd(); определяет текущий);\n";
      $this->msg[2][12]	=  	"Пример использования:\n";
      $this->msg[2][13]	=  	"\tmrecode cp1251 utf8 /home/akick/files/\n\n";
      //-----------------------------------------------------------------------
      $this->infoRecode("createMSG()",$this->msg[1][6]);
    }
    
    /** Вывод на екран помощи по использованию программы */
    
    function Help()
    {
	$help_count=count($this->msg[2])-1;
	for($i=0;$i<=$help_count;$i++)
	{
		echo $this->msg[2][$i];
	}      
    }
    
    /** Получение списка файлов в дирректории */
    
    function getFiles()
    {
       $d = dir($this->lDir);
        $c=0;
                  echo $d->handle;
        while (false !== ($entry = $d->read())) 
        {
          if($dirin>1 && (filetype($this->lDir.$entry) == file))
	  {
          	$this->fArr[$c]=$entry;
          	$c++;
	  }
          $dirin++;
        }
        $d->close();
      $this->infoRecode("getFiles()",$this->msg[1][4]);
    }
    
    /** Непосредственно функция перекодирования файлов. */
    
    function recodeFiles()
    {
      $arr_size=count($this->fArr)-1;
      for($i=0;$i<=$arr_size;$i++)
      {
        $of=$i+1;
        $all=$arr_size+1;
        echo $this->headGen('{'.$of.'/'.$all.'}={'.$this->fArr[$i].'}');
        if(!(@$recodeFile=file($this->lDir.$this->fArr[$i])))
                          $this->errorRecode("recodeFiles()",$this->msg[0][2]);
        $recodeFileLineCount=count($recodeFile)-1;
        for($j=0;$j<=$recodeFileLineCount;$j++)
        {
          $recodeFile[$j]=iconv($this->lFrom,$this->lTo,$recodeFile[$j]);
          $recodeFile[$j]=ereg_replace("\r\n","\n",$recodeFile[$j]);
        }
        if(!(@$recodeWrite=fopen($this->lDir.$this->fArr[$i],"wb")))
                          $this->errorRecode("recodeFiles()",$this->msg[0][3]);
        foreach($recodeFile as $LineNum => $LineStr)
        {
          fwrite($recodeWrite,$LineStr);
        }
        fclose($recodeWrite);
        if($i<$arr_size)
              $this->infoRecode('recodeFiles()',$this->msg[1][0]);
              else
              $this->infoRecode('recodeFiles()',$this->msg[1][1]);
        echo $this->EndOfLineGen();
      }
      $this->infoRecode("recodeFiles()",$this->msg[1][3]);
    }
    
    /** Генерация рамки вывода статистики перекодирования {{{
    	Генерирует строчку заголовка над каждым файлом */
    
    function headGen($str)
    {
      $headMin=1;
      $realGen=$this->LineLength-strlen($str);
      $line='='.$str;
      for($i=1;$i<=$realGen-1;$i++)
      {
        $line.='=';
      }
      return $line."\n";
    }
    
    /** Генерирует строчку завершения действий
        под каждым перекодированным файлом */
    
    function EndOfLineGen()
    {
      $line='';
      for($i=1;$i<=$this->LineLength;$i++)
      {
        $line.='=';
      }
      return $line."\n\n\n";
    }
    
    /** рамка перекодирования }}}
    
    	Получение текущей локали системы, в которую нужно перекодировать сообщения на русском...... */
    	
    function getSysLANG()
    {
      ob_start();
      system('echo $LANG');
      $lang=trim(ob_get_contents());
      ob_end_clean();
      $lang=explode(".",$lang);
      $this->SysLNG=$lang[1];
      $this->createMSG();
      $this->infoRecode("getSysLNG()",$this->msg[1][2]);
      $this->msgRecode();
    }


    /** Перекодировка сообщений в кодировку системной локали */
    
    function msgRecode()
    {
      if($this->MyLNG != $this->SysLNG)
      {
        $ctype=count($this->msg)-1; // колво типов (номера 1 - сообщения 0 - ошибки)
        for($i=0;$i<=$ctype;$i++)
        {
          $subType=count($this->msg["$i"])-1;
          for($j=0;$j<=$subType;$j++)
          {
            $this->msg["$i"]["$j"]=iconv($this->MyLNG,$this->SysLNG,$this->msg["$i"]["$j"]);
          }
        }
        $this->infoRecode("msgRecode()",$this->msg[1][5]);
      }
      else
      $this->infoRecode("msgRecode()",$this->msg[1][7]);
    }

    /** Вывод информационных сообщений */
    
    function infoRecode($modName,$infoStr)
    {
      print("\033[1;32;1m\ \r$modName : $infoStr\n");
    }

    /** Вывод на еркан некой ошибки.. */
    
    function errorRecode($modName,$errStr)
    {
      print("\033[1;31;1m\ \r$modName : $errStr\n");
      exit(0);
    }
    
    /** Деструктор */
    
    function __destruct()
    {
	$this->infoRecode("__destruct()",$this->msg[1][9]);
    }
  }
  
  /** Вызов обработки методом екземпляризации класса */
  
  $DoRecode = new RecodeMaker($argv[1],$argv[2],$argv[3]);
?>
кто следующий ? ;) думаю что будет интересно увидеть труды других людей ;)
 

GrAndSE

Тёмный
Модератор
Как-то мне нужн было сделать дамп для человека ubuntu.club со всем. Но вот проблемма то какая возникла - куча файлов index.php которые валялись по всей глубине. Ну я догадываюсь что проще все это можно было сделать при мопощи file в сочетании с rm, но не вьезжаю я в файл :(. Почему выкрутился вот так:
Код:
#! /bin/sh
# This litlle script removes files in directory tree by mask recyrsively. Remove only files.
# Using rrm mask path_name
deleting_from_path () # function for deleting files by mask in one path
{
        rm $1/$file_mask_for_delete && echo "$1";
        for filename in $1/*
        do
                if [ -d "$filename" ]
                then
                        deleting_from_path $filename;
                fi;
        done
}
file_mask_for_delete="$1";
deleting_from_path $2;
Авось кому-то пригодиться, тко не особо дружит с некоторыми командами консольки.
 

Michael

Well-Known Member
Команда форуму
Администратор
Ответ: Наша помощь самим себе....

PHP:
#!/usr/bin/perl 
use Net::FTP; 
use strict; 
package main; 
my $host="ftp.host.where.my.files"; 
my $PATH_TO_FILES="path/to/files/on/ftp/host"; 
my $LOCAL_PATH_TO_FILES="path/to/local/files"; 
my (@r, @list, @files, @_FTP, @_PATH, @LOCAL, $ftp, %list); 

$ftp=Net::FTP->new($host, Passive=>1); 
$ftp->login("anonymous","blah\@blah") || die "Login failed", $ftp->message; 
$ftp->binary; 
$ftp->cwd($PATH_TO_FILES) || die "Chdir failed", $ftp->message; 
@files=$ftp->dir; 
foreach(@files){@r=split(" ","$_"); push (@_FTP, "@r[8]");} 
opendir DIR,"$LOCAL_PATH_TO_FILES"; 
@_LOCAL=grep !/^.+$/,readdir DIR; 
closedir DIR; 
@list{@_FTP}=(); 
foreach(@_LOCAL){delete $list{$_};} 
@_FTP = sort keys %list; 
chdir $LOCAL_PATH_TO_FILES; 
foreach(@_FTP){ $ftp->get("$_") || die "Failed to fetch $_", $ftp->message;} 
$ftp->quit;
Есть фтп сервер с файлами. Периодически туда что то добавляется. А мы хотим иметь все, включая самое свежее. Этот скрипт писался для синхронизации файлов:
Сначала он смотрит список файлов в папке "path/to/local/files"
Соединяется на фтп "ftp.host.where.my.files"
Заходит в папку "path/to/files/on/ftp/host"
Сравнивает что есть на сервере, и что есть у нас. Недостающее скачивает.
Мне не нужна была рекурсивная проверка папок/подпапок (по причине их отсутствия), кому надо может и сам дописать :)
 

Silent_Lexx

Blender Designer
Ответ: Наша помощь самим себе....

service {имя_сервиса} {start|stop|status|try-restart|restart|force-reload|reload|probe}
нерулит ?
 

Michael

Well-Known Member
Команда форуму
Администратор
Монтирование образов по двойному клику:
PHP:
#!/usr/bin/perl

use strict;
use Gtk2 '-init';

my $window = Gtk2::Window->new;
   $window -> set_title ( 'ISO mount' );
   $window -> signal_connect ( destroy => sub { Gtk2->main_quit; } );
   $window -> set_border_width ( 3 );
   $window -> set_position ( 'center' );

my $vbox = Gtk2::VBox -> new ( 0, 6 );
   $window -> add ( $vbox );

my $frame = Gtk2::Frame -> new ( 'Mount image?' );
   $vbox -> pack_start ( $frame, 1, 1, 0 );
   $frame -> set_border_width ( 3 );

my $hbox = Gtk2::HBox->new ( 0, 6 );
   $frame -> add ( $hbox );
   $hbox->set_border_width ( 3 );

my $mount_button = Gtk2::Button -> new ( '_Mount' );
   $hbox -> pack_start ( $mount_button, 0, 0, 0 );

my $quit_button = Gtk2::Button -> new ( '_Quit' );
   $hbox -> pack_start ( $quit_button, 0, 0, 0 );
   $quit_button -> signal_connect ( clicked => sub { Gtk2->main_quit; });


$mount_button -> signal_connect ( clicked => sub {
        `/bin/umount /mnt/iso`;
        `/bin/mount -o loop $ARGV[0] /mnt/iso`;
         Gtk2->main_quit;
        });

$window -> show_all;
Gtk2 -> main;
Если диалог ненужен, можно упростить и обойтись без перла:
Код:
#!/bin/bash
/bin/umount /mnt/iso
/bin/mount -o loop $1 /mnt/iso
просто ассоциировать файлы iso/mdf с этими скриптами, и готово..
 
Зверху