HostProcControl - это CORBA сервис, предоставляющий API для удаленного управления операционной системой. Реализованные нами CORBA-объекты обеспечивают две группы вещей:
AdministrationGuide_rus.pdf из комплекта поставки).
Пакет написан на С++ и поставляется в исходных кодах.
Существует 4 типа объектов:
Вся функциональность HostProcControl доступна через объект HostControl (работа выполняется либо собственными методами объекта HostControl, либо методами его дочерних объектов). Авторизация доступа осуществляется на этапе создания данного объекта. Для этого вызов метода HostControlHome::getHostControl осуществляется с двумя параметрами, один из которых рассматривается как "имя" пользователя, другой - как его "пароль". В настоящий момент мы ограничиваемся тем, что считаем переданые значения единой записью ("ID клиента"), аналог которой должен быть найден в списке пользователей сервиса.
John : Johnson A.E.Belyaev:265-60-43 <another_name>:<another_password>
По умолчанию, создаваемые клиентом экземпляры HostControl, FileReader и FileWriter уничтожаются самим клиентом с помощью методов HostControl::destroy(), FileReader::close() и FileWriter::close() соответсвенно. Однако Вы можете потребовать, чтобы сервер автоматически уничтожал созданные Вами объекты в том случае, если они не использовались в течение заданного Вами интервала времени. Для этого, каждый объект имеет метод set_timeout(), который вызывается с параметром, определяющим число секунд, в течение которого объект может существовать и не использоваться. При этом следует помнить, что:
/FileWriter всегда производится родительским объектом HostControl и также считается актом его "использования".
Объект HostControlHome автоматически создается при запуске сервера HostControlServer[.exe] и служит "корневым" объектом нашего сервиса. В зависимости от опций, с которыми был запущен сервер, доступ к нему можно получить тремя способами (подробно смотри в Руководстве Администратора пакета):
HostControlService=corbaloc::<host>:<port>/HostControlService
interface HostControlHome
{
HostControl getHostControl(in string name, in string password)
raises(LoginIncorrect,AccessControlFailure);
};
-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 является основным объектом нашего сервиса и осуществляет следующие вещи:
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. Средства управления процессами
struct ProcInfo
{
unsigned long pid; // the process id
string name; // the filename of the executable
unsigned long ppid; // the PID of the parent
};
typedef sequence<ProcInfo> ProcInfoSeq;
typedef sequence<string> StringSeq;
Связь между значениями mode и содержанием предположений определяется по следующей таблице:
Для всех платформ:
| Значение mode | Предположение |
| 'e' | файл существует |
| 's' | файл существует и его размер не равен нулю |
| 'c' | файл существует и является устройством |
| 'd' | файл существует и является директорией |
| 'f' | файл существует и не является директорией |
| 'r' | файл существует и доступен для чтения |
| 'w' | файл существует и доступен для записи |
| 'x' | файл существует и доступен для запуска |
Дополнительно для UNIX:
| Значение mode | Предположение |
| 'h' | файл существует и является символической связью |
| 'b' | файл существует и является специальным блоком |
| 'p' | файл существует и является именованым каналом |
| 'u' | файл существует и может использовать функцию setuid |
| 'g' | файл существует и может использовать функцию setgid |
Прочие значения mode недопустимы: генерируется исключение InvalidModeArgument 4.3
enum WriteMode { enRewrite, enAppend };
Следующий фрагмент кода осуществляет вывод списка существующих в системе процессов на стандартное устройство вывода:
/* создаем объект 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();
Создается объектом HostControl. Предоставляет доступ к неинтерпретируемой последовательности байт из файла, открытого на этапе создания объекта при помощи HostControl::createFileReader 3.2.2.
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();
Создается объектом HostControl. Записывает неинтерпретируемую последовательность байт в удаленный файл, открытый на этапе создания объекта при помощи HostControl::createFileWriter 3.2.2.
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();
exception InvalidLogin {};
exception AccessControlFailure {};
exception InvalidModeArgument {};
exception HostError
{
long os_errno;
string errstr;
string add_info;
};
где отдельные поля имеют следующий смысл:
os_errno: номер системной ошибки в соответствии с POSIX
errstr: стандартное описание системной ошибки
add_info: зарезервировано для дополнительного сообщения,
которое может быть предоставленно разработчиками HostProcControl
Ниже приведен пример клиентского приложения, демонстрирующий доступ к функциональности сервера посредством 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