next_inactive up previous


HostProcControl: Руководство программиста

DocumentId:GradSoft-PR-r-22.08.2000-v1.0b


Contents

Назначение продукта

HostProcControl - это CORBA сервис, предоставляющий API для удаленного управления операционной системой. Реализованные нами CORBA-объекты обеспечивают две группы вещей:

  1. доступ к файловой системе удаленной машины в следующем объеме:
    1. чтение и запись файлов;
    2. удаление файлов;
    3. проверка статуса файлов;
  2. доступ к процессам, выполняющимся на удаленной машине в следующем объеме:
    1. получение списка процессов;
    2. получение параметров выделенных процессов;
    3. запуск процессов;
    4. посылка сигналов.
Представленный нами пакет работает с разными моделями ORB и может быть использован на разных платформах (см. Руководство Администратора в файле AdministrationGuide_rus.pdf из комплекта поставки). Пакет написан на С++ и поставляется в исходных кодах.

Общий порядок использования

Главный принцип

Существует 4 типа объектов:

  1. HostControlHome;
  2. HostControl;
  3. FileReader;
  4. FileWriter.
Первый из них автоматически создается при запуске сервера, все остальные объекты создаются через него:
  1. HostControl: создается объектом HostControlHome;
  2. FileWriter и FileReader: создаются объектом HostControl.
В итоге, общий порядок доступа к функциональности HostProcControl выглядит так:
  1. Инициализация ORB и получение инициальной ссылки сервиса;
  2. Организация доступа к HostControlHome;
  3. Создание объекта HostControl;
  4. Использование объекта HostControl; создание, использование и уничтожение объектов FileWriter и FileReader;
  5. Уничтожение объекта HostControl.
Порядок получения инициальной ссылки сервиса зависит от способа ее публикации, порядок публикации описан в Руководстве Администратора пакета.

Краткое описание объектов

  1. Объект HostControlHome:

  2. Объект HostControl:

  3. Объект FileReader:

  4. Объект FileWriter:


Авторизация доступа

Вся функциональность HostProcControl доступна через объект HostControl (работа выполняется либо собственными методами объекта HostControl, либо методами его дочерних объектов). Авторизация доступа осуществляется на этапе создания данного объекта. Для этого вызов метода HostControlHome::getHostControl осуществляется с двумя параметрами, один из которых рассматривается как "имя" пользователя, другой - как его "пароль". В настоящий момент мы ограничиваемся тем, что считаем переданые значения единой записью ("ID клиента"), аналог которой должен быть найден в списке пользователей сервиса.

Если поиск оказывается удачным (ID клиента внесен в список пользователей) доступ считается разрешенным и объект HostControl создается, если нет - то нет.


Время жизни объектов

По умолчанию, создаваемые клиентом экземпляры HostControl, FileReader и FileWriter уничтожаются самим клиентом с помощью методов HostControl::destroy(), FileReader::close() и FileWriter::close() соответсвенно. Однако Вы можете потребовать, чтобы сервер автоматически уничтожал созданные Вами объекты в том случае, если они не использовались в течение заданного Вами интервала времени. Для этого, каждый объект имеет метод set_timeout(), который вызывается с параметром, определяющим число секунд, в течение которого объект может существовать и не использоваться. При этом следует помнить, что:

  1. вызов set_timeout(0) означет "бесконечное время ожидания", т.е. контроль использования объекта отключается;
  2. актом использования объекта считается
    1. создание объекта;
    2. вызов любого из методов объекта, за исключением методов close() и destroy();
  3. объект HostControl не может быть автоматически уничтожен пока существует хотя бы один порожденный им объект FileReader или FileWriter;
  4. фактическое уничтожение дочернего объекта FileReader/FileWriter всегда производится родительским объектом HostControl и также считается актом его "использования".

Описание объектов

Объект HostControlHome

Общие сведения

Объект HostControlHome автоматически создается при запуске сервера HostControlServer[.exe] и служит "корневым" объектом нашего сервиса. В зависимости от опций, с которыми был запущен сервер, доступ к нему можно получить тремя способами (подробно смотри в Руководстве Администратора пакета):

Назначение данного объекта состоит в том, чтобы проверять права доступа клиента, после чего создавать либо не создавать объект HostControl (см. раздел Авторизация доступа 2.3).

IDL-интерфейс

     interface HostControlHome
     {
         HostControl getHostControl(in string name, in string password)
                                raises(LoginIncorrect,AccessControlFailure);
     };


Описание метода HostControlHome::getHostControl

  1. Назначение: Метод getHostControl сравнивает фактические значения параметров name и password, рассматриваемых как комплексный "ID клиента", с полями записей, хранящихся в списке пользователей сервиса (см. раздел Авторизация доступа 2.3) Если переданная запись соответствует одной из существующих, создается объект HostControl. В противном случае генерируется исключение LoginIncorrect 4.1. В случае "проверка невозможна" (список пользователей не найден либо не может быть открыт для чтения), генерируется исключение AccessControlFailure 4.2.

  2. Параметры:
    1. name = имя клиента
    2. password = пароль клиента

  3. Возвращаемое значение: объект HostControl

Пример

Пусть для у нас имеется инициальная ссылка в стиле corbalolc, переданная при помощи опции командной строки
   -ORBInitRef HostControlService=corbaloc::<host>:<port>/HostControlService
Следующий участок кода получает доступ к объекту HostControlHome и осуществляет попытку создать объект HostControl:
   /* необходимые переменные */
   Object_var          obj;
   HostControl_var     hostControl;
   HostControlHome_var hostControlHome;

   /* инициализация ORB при помощи опций командной строки */
   myORB = ORB_init(argc,argv); 

      /* получение доступа к корневому объекту сервиса */
      obj = myORB->resolve_initial_references( "HostControlService" );
      hostControlHome = HostControlHome::_narrow(obj);

   /* выбор имени-пароля */
   char name[]="name";
   char password[]="password";

   try {
      /* попытка создать объект HostControl */
      hostControl = hostControlHome->getHostControl(name,password);

   } catch ( const LoginIncorrect& ex ) {
     /* здесь должен быть вывод предупреждения */
     goto quit;
   } 
   /* здесь мы можем использовать созданный объект */

   /* уничтожение объекта HostControl */
   hostControl->destroy();

quit: 
   myORB->destroy();

Объект HostControl

Объект HostControl является основным объектом нашего сервиса и осуществляет следующие вещи:

  1. управление процессами;
  2. удаление файлов, проверку статуса файлов;
  3. создание воспомогательных объектов FileReader и FileWriter, обеспечивающих доступ к содержанию файлов.

IDL-интерфейс

  interface HostControl
  {
    ProcInfoSeq getProcsInfo() raises(HostError);
    ProcInfo getProcInfoByPid(in unsigned long pid) raises(HostError);

    unsigned long bornProcByName(in string name,in StringSeq args) raises(HostError);
    void killProcByName(in short signal, in string name) raises(HostError);
    void killProcByPid(in short signal, in unsigned long pid) raises(HostError);
 
    FileReader createFileReader(in string path) raises(HostError);
    FileWriter createFileWriter(in string path,in WriteMode mode) raises(HostError);

    boolean statFile(in string path, in char mode) raises(HostError);
    void rmFile(in string path) raises(HostError);

    void set_timeout(in unsigned long timeout);
    void destroy();
  };

Описание методов

A. Средства управления процессами

Б. Средства доступа к файлам: В. Служебные средства:

Примеры

Следующий фрагмент кода осуществляет вывод списка существующих в системе процессов на стандартное устройство вывода:

   /* создаем объект HostControl */
   try {
      hostControl = hostControlHome->getHostControl("user","test");
   } catch ( const LoginIncorrect& ex ) {
      /* вывод предупреждения */
      goto quit;
   }

   ProcInfoSeq_var procseq;

     /* получение списка процессов */
     procseq = hostControl->getProcsInfo();

   /* вывод списка процессов на экран */
   for(int i = 0; i< procseq->length() ;  i++)
   {
       cout << procseq[i].pid << " "
            << procseq[i].name << " "
            << procseq[i].ppid << endl;
   }

   hostControl->destroy();

quit:
   .....
Следующий фрагмент кода удаляет лишний файл garbage.txt:
  char name[20]="user", password[20]="test";
  HostControl_var hostControl = hostControlHome->getHostControl(name,password);
  if ( hostControl->statFile("garbage.txt",'f') ) {
     hostControl->rmFile("garbage.txt")
  }
  hostControl->destroy();

Объект FileReader

Создается объектом HostControl. Предоставляет доступ к неинтерпретируемой последовательности байт из файла, открытого на этапе создания объекта при помощи HostControl::createFileReader 3.2.2.

IDL-интерфейс

  interface FileReader
  {
    OctSeq  read(in unsigned long nbytes, out unsigned long actual_nbytes) raises(HostError);

    boolean eof() raises(HostError);

    void    set_timeout(in unsigned long timeout );

    void    close() raises(HostError);
  };

Описание методов

Пример

Следующий фрагмент кода осуществляет вывод на экран удаленного текстового файла:

     /* создать объект FileRedader */
     FileReader_var freader = hostControl->createFileRedader("demo.txt");

     OctSeq_var data = new OctSeq;
     const int buffer_size = 10000;
     data -> length( buffer_size );

     char buff[buffer_size+1];
     int readed;
     do {
       /* считать порцию данных из файла */
            data = filereader->read( buffer_size, readed );

       /* вывести данные на экран */
       memcpy(buff,data->get_buffer(),readed);
       buff[readed+1]='\0';
       cout << buff;
      } while ( readed==buffer_size );

     /* закрыть файл и уничтожить объект */
     freader->close();

Объект FileWriter

Создается объектом HostControl. Записывает неинтерпретируемую последовательность байт в удаленный файл, открытый на этапе создания объекта при помощи HostControl::createFileWriter 3.2.2.

IDL-интерфейс

  interface FileWriter
  {
    void     write(in unsigned long nbytes, in OctSeq bytes) raises(HostError);

    void     set_timeout(in unsigned long timeout);

    void     close() raises(HostError);  \
  };

Описание методов

Пример

Следующий фрагмент кода копирует локальный файл на удаленный компьютер:

        /* создать объект FileWriter */
        FileWriter_var filewriter =
              hostControl->createFileWriter( "demo.txt", UAKG_enRewrite ); 

        const int buffer_size = 10000;
        OctSeq_var buf = new OctSeq; 
        buf -> length( buffer_size );

        int  readed;
        while ( !feof( file ) ) {
            /* прочитать данные из локального файла */
            readed = fread(buf->data(),1,buffer_size,file);

            /* записать данные в удаленый файл */
            filewriter->write(readed,buf);

            if ( ferror( file )) {
                break;
            }
        }
        /* закрыть файлы и уничтожить объект FileWriter */
        fclose( file );
        filewriter->close();

Описание исключений


InvalidLogin

Исключение InvalidLogin генерируется при попытке создать объект HostControl без права на его создание (смотри раздел Авторизация доступа 2.3, а также описание метода HostControlHome::getHostControl 3.1.3).


AccessControlFailure

Исключение AccessControlFailure генерируется при попытке создания объекта HostControl в том случае, если контроль прав доступа к объекту технически невозможен (cписок пользователей сервиса не найден либо не может быть открыт для чтения; смотри описание метода HostControlHome::getHostControl 3.1.3).


InvalidModeArgument

Исключение InvalidModeArgument генерируется при вызове метода HostControl::statFile в том случае, если второй параметр метода (смотри описание HostControl::statFile 3.2.2) имеет запрещенное значение.

HostError

Исключение "общего назначения", генерируется в случае системной ошибки на удаленной машине.

Пример клиентского приложения

Ниже приведен пример клиентского приложения, демонстрирующий доступ к функциональности сервера посредством corbaloc url. Конкретный способ соответствующей настройки сервера описан в документации к ORB.

using namespace CORBA;
static ORB_var myORB ;

#define NAME_LEN 20
#define PASSWD_LEN 20

int main(int argc,char** argv)
{
   char name[20],password[20];
   myORB = ORB_init(argc,argv); 
   Object_var  obj;
   int retval=1;
   try {
     obj=myORB->string_to_object(
         "corbaloc::x.internal.company.com:1000/HostControlService");
   } catch ( const SystemException& ex ) {
     cerr << argv[0] << ": Can\'t resolve HostControlService reference" << endl;
     goto quit;
   }
   if ( is_nil(obj)  ) {
     cerr << "Object is NULL" << endl;
     goto quit;
   }
   HostControlHome_var   hstCntrHome = HostControlHome::_narrow(obj);
   if ( is_nil(HstCntrHome) ) {
     cout << "Can\'t  narrow object " << endl;
     goto quit;
   }
   cout << "Enter name :" << flush ;
   cin.get_line(name,NAME_LEN);
   cout << "Enter password :" << flush;
   cin.get_line(password,PASSWD_LEN);
   HostControl_var hostControl ;
   try {
      hostControl = HstCntrHome->getHostControl(name,password);
   } catch (const SystemException&  ex ) {
      cerr << "System Exception" << endl;
      goto quit;
   } catch (const IncorrectLogin&  ex ) {
      cerr << "Login incorrect" << endl;
      goto quit;
   } 
   cout << "login succesfull" << endl;
   retval=0;
   //
   // do you work here.
   //
   hostControl->destroy();
quit:
   myORB->destroy();
   return retval;
}

Поддержка

Пакет HostProcControl разработан и поддерживается компанией GradSoft, домашняя страница GradSoft http://www.gradsoft.com.ua/ ; Представленная версия продукта - HostProcControl-1.0

История документа

05.04.2001
- отражены изменения в в интерфейсных спецификациях пакета: в предыдущей версии продукта HostProcControl 1.0.b2 исключение AccessControlFailure отсутствовало, исключение InvalidLogin генерировалось при неудачной попытке создания объекта HostControl независимо от причины этой неудачи
23.02.2001
- выпуск версии HostProcControl 1.0.b2
22.08.2000
- первая редакция


next_inactive up previous
GradSoft