php и файловая система

Обсуждение технических вопросов по продуктам Novell

php и файловая система

Сообщение stas » 04 сен 2006, 07:45

Стоит задача импортировать пользователей из базы данных в дерево.
Сам импорт я сделал используя функции php для работы с ldap.
Но также необходимо создавать домашние каталоги и раздавать права на файловую систему. Функция mkdir не создает каталоги вне папки htdocs (либо я чего то не понимаю). Ситуация осложнена тем, что создавать домашники надо на другом сервере.
Посмотрел на novell.com примеры. Там используется класс UCS. Но нормального описания (для php) найти не смог ((.

Просьба подкинуть документацию для решения данной задачи на php.
Либо, если можно, два примера:
-Создать каталог (на другом сервер/томе);
-Раздать права на каталог.

Используется:
Netware 6.5 (все сервера)
Apache 2.0
Php 5.0

Заранее спасибо за ответы.
Аватара пользователя
stas
 
Сообщения: 133
Зарегистрирован: 23 июл 2003, 08:25
Откуда: Новосибирск

Сообщение Андрей Тр. aka RH » 04 сен 2006, 11:54

А нужно обязательно на РНР ? Утилиты типа Homes не помогут - если есть список пользователей ( в том же ldif или csv ), то домашники создаются вполне тривиально ( с раздачей прав и т.п. ).
Даешь отдельный раздел по ZENworks ... :bad-words: .. и печати !
Аватара пользователя
Андрей Тр. aka RH
 
Сообщения: 3937
Зарегистрирован: 18 июн 2002, 11:27

Сообщение stas » 04 сен 2006, 15:28

База пользователей (она не моя - мне оттуда данные по хттп отдают) у нас постоянно меняется (пользователи студенты - пришел/ушел/отчислили/перевелся и т.п.) - и хотелось, чтобы все изменения автоматически отражались в дереве.

сейчас сделано в полуавтаматическом режиме. забираю данные по хттп - генерю файлы для утилиты uimport. а далее с ее помощью создаю в дереве пользователей и домашние каталоги.

начитавшись немного научился писать в дерево пользователей напрямую. все бы хорошо, но файловую систему пока осилить не могу.

с помощью утилиты homes мне придтся (как я понял) также ручками подставлять список пользователей - а хотелось бы получить в иделае полный автоматизм.
Аватара пользователя
stas
 
Сообщения: 133
Зарегистрирован: 23 июл 2003, 08:25
Откуда: Новосибирск

Re: php и файловая система

Сообщение Михаил Григорьев » 07 сен 2006, 13:14

stas писал(а):Там используется класс UCS. Но нормального описания (для php) найти не смог


Все просто, на CGI c UCS я делал так:

Код: Выделить всё
require "secret.pl";

$fullname = '\\CHERTS_TREE\CHERTS';
$VOL = "USERS";
$NDS_VOLUME_OBJECT_NAME = "CHERTS_USERS";
$organization = "CHERTS";
$RIGHTS = "RWCEM";


use UCSExt;
print "Content-type: text/html\n\n";

%in=();
&parseform();
&updateNDS();
&printhtml();

sub updateNDS(){

   $NWDir   = UCSExt->new("UCX:NWDir")     or die "Can't get ucx:NWDir object";
   $FileMgr = UCSExt->new("UCX:NWFileMgr") or die "Can't get ucx:NWFileMgr object";
   $VolMgr  = UCSExt->new("UCX:VolumeMgr") or die "Can't get ucx:VolumeMgr object";

$nds1 = UCSExt->new("UCX:NWDIR") or die "Unable to the NWDir object";
$nds1->login($admin,$password) or die "Unable to login $admin\n";
$fullname = $nds1->{"fullname"};
$entries = $nds1->{"entries"};

$name = $fullname."\".$in{'Username'};
$entry = $nds1->findEntry($name);
if($entry->{'fullName'} eq $name){
   &ErrorUserExists();
}

$NewEntry = $entries->addElement($in{'Username'},"User") || die "Couldn't add new entry!\n";
$NewEntry->SetFieldValue("Surname",$in{'Surname'}) || die "Couldn't SetFieldValue Surname!\n";

$NewEntry->SetFieldValue("Given Name",$in{'Given Name'}) || die "Couldn't SetFieldValue Given Name!\n";
$NewEntry->SetFieldValue("Full Name",$in{'Given Name'}." ".$in{'Surname'}) || die "Couldn't SetFieldValue Full Name!\n";
$NewEntry->SetFieldValue("Title",$in{'Title'}) || die "Couldn't SetFieldValue Title!\n";
$NewEntry->SetFieldValue("Telephone Number",$in{'Telephone Number'}) || die "Couldn't SetFieldValue Telephone Number!\n";
$NewEntry->SetFieldValue("Facsimile Telephone Number",$in{'Facsimile Telephone Number'}) || die "Couldn't SetFieldValue Facsimile Telephone Number!\n";
$NewEntry->SetFieldValue("Internet EMail Address",$in{'Internet EMail Address'}) || die "Couldn't SetFieldValue Internet EMail Address!\n";
$NewEntry->SetFieldValue("Postal Code",$in{'Postal Code'}) || die "Couldn't SetFieldValue Postal Code!\n";
$NewEntry->SetFieldValue("Physical Delivery Office Name",$in{'Physical Delivery Office Name'}) || die "Couldn't SetFieldValue Physical Delivery Office Name!\n";
$NewEntry->SetFieldValue("SA",$in{'SA'}) || die "Couldn't SetFieldValue Street Address!\n";
$NewEntry->SetFieldValue("Login Disabled",false);

    #Creates the users directory path
    $in{'Username'} =~ /\w/;
    if(!$FileMgr->changeDir("$VOL:\\$&")){
       $FileMgr->changeDir("$VOL:\");
      $dirName=$FileMgr->{'CurrentDir'};
      $usrDir=$dirName->getChildren();
      $usrDir->AddElement("$&");
      $FileMgr->changeDir("$VOL:\\$&");
    }
   $dirName=$FileMgr->{'CurrentDir'};
   $usrDir=$dirName->getChildren();
   $usrDir->AddElement($in{'Username'});


   #Set the users path
   $path = UCSExt->new("UCX:NWDir.NWPath") or die "Can't get ucx:NWDir:NWPath object";
        $path->{"Volume"} = "$NDS_VOLUME_OBJECT_NAME";

        $path->{"Path"} = $&."/".$in{'Username'};
        $path->{"Type"} = 1;
   $NewEntry->setFieldValue("Home Directory",$path);

   #Add group membership
   $NewEntry->setFieldValue("Group Membership","Everyone");


   #Set the users password
   if($in{'Password'} eq $in{'PasswordAgain'}){
      $NewEntry->setPassword($in{'Password'});
   }else{
      die "Your passwords did not match<br>";
   }

   #Make the user a trustee over his directory
   #$fullPath = $VOL.":\".$&."\".$in{'Username'};
   #$user = ".".$in{'Username'}.$organization;
   #$pathObj = $FileMgr->findEntry("$fullPath") or die "Can not find entry";
   #$pathObj->{'trustees'}->Add($fullPath, $user, $RIGHTS) or die "Can not add Trustee $!";

   #Add user to group

   #$entry = $nds1->findEntry($name\\Everyone);
   #$NewEntry->SetFieldValue("Member", $in{'Username'}.".CHERTS");

   #Adjust the amount of space a user can have on the volume
   #$vols = $VolMgr->{'Volumes'};
   #$volume = $vols->Element($VOL);
   #$restns = $volume->GetSpaceRestriction();
   #$restr = $restns->Element($in{'Username'}.".CHERTS");
   #$restr->SetSpaceRestriction(4096) or warn "Could not set Volume Restriction!\n";


   if ($NewEntry->Update()) {
      &printhtml();
   } else {
     print "Error\n";
     $NewEntry->Abort();
   }

}

sub printhtml(){
   print "<br><font>User was successfully set up</font><br>";
   foreach (keys(%in)){
      print "$_ : $in{$_}<br>\n";
   }
   print qq[
   <form>
   <input>
   <input>
   <p><input>
   </form>
   ];

}

sub ErrorUserExists(){
        print "User Name already exists.  Click <a>here</a> to try again.";
        exit;
}

sub parseform(){

    if ($ENV{'REQUEST_METHOD'} eq 'GET') {
        @pairs = split(/&/, $ENV{'QUERY_STRING'});
    }
    elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
        @pairs = split(/&/, $buffer);
    }
    else {
        &error('request_method');
    }

    foreach $pair (@pairs) {

        local($name, $value) = split(/=/, $pair);
        $name =~ tr/+/ /;
        $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/<n>//g;
   @key=(@key,$name);

            if ($in{$name} && $value) {
                $in{$name} = "$in{$name}, $value";
            }
            elsif ($value) {
                push(@Field_Order,$name);
                $in{$name} = $value;
            }
    }
}


secret.pl

Код: Выделить всё
$admin    = "Admin";
$password = "PASSWORD";
Аватара пользователя
Михаил Григорьев
 
Сообщения: 1462
Зарегистрирован: 04 июн 2002, 12:22
Откуда: Челябинск

Сообщение Михаил Григорьев » 07 сен 2006, 13:21

Пример на Perl:

Код: Выделить всё
require "nds_auth.dat";

use UCSExt;

$nds1 = UCSExt->new("UCX:NWDIR") or die "Unable to the NWDir object";
$nds1->login($username,$password) or die "Unable to login $username\n";
$fullname = $nds1->{"fullname"};
print "\nFull Name : $fullname\n";

$entries = $nds1->{"entries"};

$newuser  = 'Neo';

$NewEntry = $entries->addElement($newuser,"User") || die "Couldn't add new entry!\n";
$NewEntry->SetFieldValue("Surname","Григорьев") || die "Couldn't SetFieldValue Surname!\n";

# Optinal fields
$NewEntry->SetFieldValue("Given Name","Михаил") || die "Couldn't SetFieldValue Given Name!\n";
$NewEntry->SetFieldValue("Full Name","Григорьев Михаил Магометович") || die "Couldn't SetFieldValue Full Name!\n";
#$NewEntry->SetFieldValue("Initials","RMS") || die "Couldn't SetFieldValue Initials!\n";
$NewEntry->SetFieldValue("Title","Администратор") || die "Couldn't SetFieldValue Title!\n";
#$NewEntry->SetFieldValue("Description","The very hard man!") || die "Couldn't SetFieldValue Description\n";
#$NewEntry->SetFieldValue("Telephone Number","+01 800 90441133") || die "Couldn't SetFieldValue Telephone Number!\n";
#$NewEntry->SetFieldValue("Facsimile Telephone Number","+01 800 90441199") || die "Couldn't SetFieldValue Facsimile Telephone Number!\n";
#$NewEntry->SetFieldValue("L","Salt Lake City") || die "Couldn't SetFieldValue Location!\n";
#$NewEntry->SetFieldValue("OU","Department Anywhere") || die "Couldn't SetFieldValue Department!\n";
#$NewEntry->SetFieldValue("SA","324 Maple Street") || die "Couldn't SetFieldValue Street Address!\n";
#$NewEntry->SetFieldValue("Postal Office Box","NH 04567") || die "Couldn't SetFieldValue Postal Office Box!\n";
#$NewEntry->SetFieldValue("Postal Code","58978") || die "Couldn't SetFieldValue Postal Code!\n";
#$NewEntry->SetFieldValue("Physical Delivery Office Name","Downtown City") || die "Couldn't SetFieldValue Physical Delivery Office Name!\n";
#$NewEntry->SetFieldValue("S","Alabahma") || die "Couldn't SetFieldValue State!\n";
#$NewEntry->SetFieldValue("Generational Qualifier","CHIEF1") || die "Couldn't SetFieldValue Generational Qualifier!\n";
#$NewEntry->SetFieldValue("Physical Delivery Office Name","Maryland") || die "Couldn't SetFieldValue Physical Delivery Office Name!\n";
#$NewEntry->SetFieldValue("Login Maximum Simultaneous",2) || die "Couldn't SetFieldValue Login Maximum Simultaneous!\n";
#$NewEntry->SetFieldValue("Login Grace Limit",3) || die "Couldn't SetFieldValue Login Grace Limit!\n";
$NewEntry->SetFieldValue("Password Minimum Length",5) || die "Couldn't SetFieldValue Password Minimum Length!\n";

#if ($hvolume && $hsubdir) {
#  $hpath = UCSExt->new('UCX:NWDIR.NWPATH') or die "Unable to create NWPath object!\n";
#  $hpath->{'Volume'} = $hvolume;
#  $hpath->{'Path'} = $hsubdir.$newuser;
#  $hpath->{'Type'} = 0;
#  $NewEntry->SetFieldValue('Home Directory',$hpath) || die "Couldn't SetFieldValue Home Directory!\n";;
#}

print "now try to create new object: ";
if ($NewEntry->Update()) {
  print "Object successfully created!\n";
} else {
  print "Error creating object!\n";
  $NewEntry->Abort();
}
print "\n";

$entries->reset();
print "Entry List:\n";
while($entries->hasMoreElements()) {
      $Entry = $entries->next();
      $EntryName = $Entry->{"fullName"};
      print $EntryName . "\n";
}
print "\n";

$nds1->logout();


nds_auth.dat

Код: Выделить всё
$fullname = '\\CHERTS_TREE\CHERTS';
$username = 'Admin';
$password = '';
$hvolume  = 'USERS.CHERTS';
$hsubdir  = 'USERS\\';
Аватара пользователя
Михаил Григорьев
 
Сообщения: 1462
Зарегистрирован: 04 июн 2002, 12:22
Откуда: Челябинск

Сообщение Андрей Тр. aka RH » 07 сен 2006, 16:06

stas писал(а):с помощью утилиты homes мне придтся (как я понял) также ручками подставлять список пользователей - а хотелось бы получить в иделае полный автоматизм.
Я ж говорю - эта утилита может создавать каталоги и назначать права на основе ldif-файла ( и, кажется, csv ), заданной группы пользователей .. чего-то еще, по-моему. Опять же мне кажется, что ее можно запускать в виде утилиты командной строки. Вообще, если речь про атрибуты типа домашних каталогов и пр., то все реально делается по LDAP. С правами на ФС чуть сложнее, но тоже решаемо с помощью утилит.
Даешь отдельный раздел по ZENworks ... :bad-words: .. и печати !
Аватара пользователя
Андрей Тр. aka RH
 
Сообщения: 3937
Зарегистрирован: 18 июн 2002, 11:27


Вернуться в Novell

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron