• 02-01-2010, 11:34:06
    #1
    Merhaba arkadaşlar,

    Size hayatımı çok kolaylaştıran bir script ten bahsetmek istiyorum. Sizde benim gibi System Administrator işleriyle uğraşmaktan hoşlanmıyorsanız. Eminim dedicated leriniz olduğu halde pekçok Reseller'ınızda vardır. (7/24 destek vermek benim için oldukça zor.)

    Resellerları idame ettirmek her zaman daha kolaydır. Fakat backup almak her zaman sorun olmuştur.

    Benim gibi bu konularda tembel birisi
    Önceleri sadece önemli domainlerin backuplarını almakla başlar,

    Domainlerin sayısı 100+ olunca Ufak bir script yazıp içerisine bütün kullanıcı adlarını + şifrelerini + skinleri yazıp değerleri post eder.

    Domainlerin sayısı 500+ olunca ne yapar?

    Bu durumda bunların hiçbirisi para etmez. Çünki siz kullanıcı şifrelerini post ettiğiniz script'te düzeltirken kullanıcılar değiştirir. Her seferinde uyarmak ve script te tekrar tanımlamak imkansız hale gelmiştir.

    Bu durumda Oturup kendi script ini yazmaya başlar. Bende nitekim öyle yaptım.

    Cpanelden /xml-api/listaccts ile hesapları domainleri skinleri otomatik çekip, whmaccesskey ve curl ile oturum açıyordumki. Bunu 2004 te zaten birinin yaptığını gördüm.


    http://www.josheli.com/vox/index.html adresinde harika Cpanel/WHM Hacks leri buldum. (Bu adreste hala güzel Hackler mevcut.)

    Fakat script hesapları text haline getirmek için regex kullanıyordu ve regex kuralları dedem zamanından kalmaydı.

    Daha iyi bir versiyonunu http://74.53.50.33/showthread.php?t=12042 adresinde buldum.

    Fakat bundada port ve remote directory değerleri yoktu. (iis7 root directory e dosya yüklemenize izin vermiyor) Bende bu kısımlara birkaç ekleme yaptım ve düzelttim,..

    Not şuan sadece whm user ve pass ile oturum açıyor ileride vaktim olursa whmaccess key de ekleyeceğim. O şekilde şifreleriniz bir nebze daha güvende olur.

    Daha önce verilmediğini verildi ise düzenleme yapılmadığını varsayarak beğenilerinize sunuyorum. Umarım beğenirsiniz.

    Kullaniminin oldukca kolay oldugu icin aciklama yazma ihtiyacinda bulunmadim. Cok talep olursa seve seve.

    <?php
    /*
    dv at josheli.com
    3/4/2004
    
    topic : http://74.53.50.33/showthread.php?t=12042
    August 21st, 2006 / Modified also
    
    http://www.netinial.com - Son duzenleme, 02.01.2010 Deniz Khan deniz@porsuk.net
    
    Belittiginiz adrese yedeklerinizi alır. Resellerlar icin bicilmis kaftandir.
    
    What it does:
    It will request cpanel make full backups of all accounts under a reseller.
    It uses cURL, optionally over SSL.
    
    How it works:
    Reads all accounts (domain, cpanel and username specifically) from the listaccts page in WHM
    Uses cUrl over SSL to call the dofullbackup script of cpanel for each account, using the
    account's username and the reseller's password
    
    This script doesn't require cron, but could use it.
    Cron for Windows:
    http://www.kalab.com/freeware/cron/cron.htm
    
    Instructions:
    1. Make sure you have the curl extension for PHP available
    2. Modify "config" variables below, to suit
    3. From the command prompt:
        >php bkup_full.php
    4. ([Or] Optionally) Set up a cron job to call this script
    5. If you're going to have it ftp somewhere, make sure that server is setup correctly
    6. Since it could take several minutes to generate the backup and ftp it,
       and you can't have this request script just waiting around trying to
       figure out if the backup/ftp cycle is complete, it might be beneficial
       to have another script check for completion, and delete the generated
       backup if there was success.
    
    */
    
    /*** BEGIN CONFIG ***/
    
    $reseller = 'www.XXX.com';//your reseller url
    $whmUser = 'XXXX';//your web host manager user name
    $whmPass = 'XXXX';//your web host manager password
    $bkUpReseller = false;//backup the reseller account also? (it's not in the listaccts page)
    $resellerCpTheme = 'bluelagoon';//if you want to back up reseller, we need the reseller cpanel theme
    
    /*
    Destination for the backup...
    
    $destType = '/';// Home Directory
    $destType = 'ftp';// Remote FTP Server
    $destType = 'passiveftp'; //Remove FTP Server (Passive mode transfer)
    */
    $destType = 'ftp';//^^^
    $destServer = 'XXXXX';//only if $destServer = 'ftp' or 'passiveftp'
    $destUser = 'XXXX';//only if $destServer = 'ftp' or 'passiveftp'
    $destPass = 'XXXXX';//only if $destServer = 'ftp' or 'passiveftp'
    $destEmail = 'XXXX@XXX.com';//optional; cpanel will send an email when generation is complete
    $destRdir = '/httpdocs/backup/';
    $destPort = 21;
    
    $logType = 'echo';//output a log to 'file' or 'echo' or 'none'(no log)
    $logFileName = 'bkup_full_log.txt';//can include a path too; only makes sense if $logType = 'file'
    $useSsl = false;//if true, requires SSL on your site, or modify this script to use the shared SSL; this hasn't really been tested
    
    /*
    A comma-separated list of domain names to backup;
    Leave blank to backup all domains found in reseller WHM
    If not blank, ONLY the domains listed will be backed up.
    If listed, the domains must be listed EXACTLY like they appear on the
    list accounts page in WHM, i.e. usually without 'www.'
    $domains = 'example1.com,example2.net';
    */
    $domains = '';
    
    /*** END CONFIG ***/
    
    /*** BEGIN MAIN ***/
    set_time_limit(0);
    $time_start = getMicroTime();
    
    if (!extension_loaded('curl')) {
      dl('php_curl.' .PHP_SHLIB_SUFFIX) or die("Could not load curl extension");
    }
    
    if($useSsl) {
      $protocol = 'https://';
      $cpPort = '2083';
      $whmPort = '2087';
      writeLog("Using SSL.\n");
    }
    else {
      $protocol = 'http://';
      $cpPort = '2082';
      $whmPort = '2086';
      writeLog("Not using SSL.\n");
    }
    
    $domains = trim($domains);
    if(!empty($domains)){
      $chkDoms = true;
      $domains = explode(',',$domains);
      foreach($domains as $d){
        $domains[] = trim($d);
      }
    }
    else {
      $chkDoms = false;
      $domains = array();
    }
    //$postFields = urlencode("dest=$destType&server=$destServer&user=$destPass&pass=$destPass&email=$destEmail");
    $postFields = '';
    $postArray = array();
    $postArray['dest'] = $destType;
    $postArray['server'] = $destServer;
    $postArray['user'] = $destUser;
    $postArray['pass'] = $destPass;
    $postArray['email'] = $destEmail;
    $postArray['rdir'] = $destRdir;
    $postArray['port'] = $destPort;
    
    $thingy = '';
    foreach ($postArray as $k=>$v)
    {
      $thingy.= "$k=".utf8_encode($v).'&';
    }
    $postFields = substr($thingy,0,-1);
    
    
    //get the WHM 'list accounts' page
    writeLog("Retrieving WHM accounts page...\n");
    $acctsPage = getByCurl("$protocol$reseller:$whmPort/scripts/fetchcsv",$whmUser,$whmPass);
    //var_dump($acctsPage);
    
    $accounts = array();
    
    $accounts = explode("\n", trim($acctsPage));
    
    //var_dump($accounts);
    
    $account_records = array();
    
    foreach ($accounts as $row) {
            $account_records[] = explode(',', $row);
    }
    
    writeLog("Parsing accounts...\n");
    
    //var_dump($account_records);
    
    //die('here');
    
    foreach($account_records as $match) {
    
        $accDom = '';
        $accUser = '';
        $accTheme = '';
        $r = '';
        $fullUrl = '';
    
        $accDom = strip_tags(trim($match[1]));//domain
        if($chkDoms)
          if(!in_array($accDom,$domains)) continue;
        $accUser = strip_tags(trim($match[3]));//username
        $accTheme = strip_tags(trim($match[14]));//cpanel theme
    
        $fullUrl = "$protocol$accDom:$cpPort/frontend/$accTheme/backup/dofullbackup.html";
        writeLog("Requesting backup of $accDom...\n");
        $r =& getByCurl($fullUrl,$accUser,$whmPass,array('CURLOPT_POST'=>$postFields));
        if($r === false){
          writeLog("Backup request of $accDom caused an unknown error.\n");
        }
        else {
          writeLog("Backup request of $accDom complete.\n");
        }
        //writeLog("\n\n--$accDom--\n\n$r\n\n------\n\n");
    
    }
    
    if($bkUpReseller){
      $fullUrl = "$protocol$reseller:$cpPort/frontend/$resellerCpTheme/backup/dofullbackup.html";
      writeLog("Requesting backup of $reseller...\n");
      $r =& getByCurl($fullUrl,$accUser,$whmPass,array('CURLOPT_POST'=>$postFields));
    }
    
    $time_end = getMicroTime();
    $time = $time_end - $time_start;
    writeLog("Elapsed time: ".round($time,2)." seconds.\n");
    
    /*** BEGIN FUNCTIONS ***/
    
    function getByCurl($url, $user = '', $pass = '',$extra = '') {
      global $useSsl;
    
      $ch = curl_init();
      //tells curl to save result in a variable instead of outputing to page
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
      curl_setopt ($ch, CURLOPT_COOKIEJAR, './cookie.txt');
      curl_setopt ($ch, CURLOPT_FOLLOWLOCATION,1);
      if(!empty($extra) && is_array($extra)){
        foreach($extra as $opt=>$val){
          switch($opt){
            case 'CURLOPT_REFERER':
              curl_setopt($ch,CURLOPT_REFERER,$val);
            break;
            case 'CURLOPT_POST':
            case 'CURLOPT_POSTFIELDS':
              curl_setopt($ch,CURLOPT_POST,1);
              curl_setopt($ch,CURLOPT_POSTFIELDS,$val);
            break;
          }
        }
      }
      if($useSsl){
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
      }
      $result = curl_exec($ch);
      curl_close($ch);
    
      return $result;
    }
    
    function writeLog($entry) {
      global $logType,$logFileName;
    
      $method = strtolower($logType);
    
      $entry = date('r').' - '.$entry;
    
      if($method == 'file') {
        $fp = fopen($logFileName,'ab');
            fwrite($fp, $entry);
            fclose($fp);
      } elseif($method == 'echo'){
          echo nl2br($entry);//browser
          flush();
      }
    
      return;
    }
    
    function getMicroTime(){
      list($usec, $sec) = explode(" ",microtime());
      return ((float)$usec + (float)$sec);
    }
    
    ?>
    Netinial Deniz - You can hack my heard but never my soul
  • 02-01-2010, 16:49:47
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Gercekten etkileyici fakat bazi konularda sakincali olarak dusunuyorum. Ben olsam bu scripti json a cevirip cgi tarzi kullanima sunardim. Bu sayede baglanti kisimlarina da gerek kalmazdi saniyorum...
  • 04-01-2016, 08:00:36
    #3
    Netinial adlı üyeden alıntı: mesajı görüntüle
    Merhaba arkadaşlar,

    Size hayatımı çok kolaylaştıran bir script ten bahsetmek istiyorum. Sizde benim gibi System Administrator işleriyle uğraşmaktan hoşlanmıyorsanız. Eminim dedicated leriniz olduğu halde pekçok Reseller'ınızda vardır. (7/24 destek vermek benim için oldukça zor.)

    Resellerları idame ettirmek her zaman daha kolaydır. Fakat backup almak her zaman sorun olmuştur.

    Benim gibi bu konularda tembel birisi
    Önceleri sadece önemli domainlerin backuplarını almakla başlar,

    Domainlerin sayısı 100+ olunca Ufak bir script yazıp içerisine bütün kullanıcı adlarını + şifrelerini + skinleri yazıp değerleri post eder.

    Domainlerin sayısı 500+ olunca ne yapar?

    Bu durumda bunların hiçbirisi para etmez. Çünki siz kullanıcı şifrelerini post ettiğiniz script'te düzeltirken kullanıcılar değiştirir. Her seferinde uyarmak ve script te tekrar tanımlamak imkansız hale gelmiştir.

    Bu durumda Oturup kendi script ini yazmaya başlar. Bende nitekim öyle yaptım.

    Cpanelden /xml-api/listaccts ile hesapları domainleri skinleri otomatik çekip, whmaccesskey ve curl ile oturum açıyordumki. Bunu 2004 te zaten birinin yaptığını gördüm.


    http://www.josheli.com/vox/index.html adresinde harika Cpanel/WHM Hacks leri buldum. (Bu adreste hala güzel Hackler mevcut.)

    Fakat script hesapları text haline getirmek için regex kullanıyordu ve regex kuralları dedem zamanından kalmaydı.

    Daha iyi bir versiyonunu http://74.53.50.33/showthread.php?t=12042 adresinde buldum.

    Fakat bundada port ve remote directory değerleri yoktu. (iis7 root directory e dosya yüklemenize izin vermiyor) Bende bu kısımlara birkaç ekleme yaptım ve düzelttim,..

    Not şuan sadece whm user ve pass ile oturum açıyor ileride vaktim olursa whmaccess key de ekleyeceğim. O şekilde şifreleriniz bir nebze daha güvende olur.

    Daha önce verilmediğini verildi ise düzenleme yapılmadığını varsayarak beğenilerinize sunuyorum. Umarım beğenirsiniz.

    Kullaniminin oldukca kolay oldugu icin aciklama yazma ihtiyacinda bulunmadim. Cok talep olursa seve seve.

    <?php
    /*
    dv at josheli.com
    3/4/2004
    
    topic : http://74.53.50.33/showthread.php?t=12042
    August 21st, 2006 / Modified also
    
    http://www.netinial.com - Son duzenleme, 02.01.2010 Deniz Khan deniz@porsuk.net
    
    Belittiginiz adrese yedeklerinizi alır. Resellerlar icin bicilmis kaftandir.
    
    What it does:
    It will request cpanel make full backups of all accounts under a reseller.
    It uses cURL, optionally over SSL.
    
    How it works:
    Reads all accounts (domain, cpanel and username specifically) from the listaccts page in WHM
    Uses cUrl over SSL to call the dofullbackup script of cpanel for each account, using the
    account's username and the reseller's password
    
    This script doesn't require cron, but could use it.
    Cron for Windows:
    http://www.kalab.com/freeware/cron/cron.htm
    
    Instructions:
    1. Make sure you have the curl extension for PHP available
    2. Modify "config" variables below, to suit
    3. From the command prompt:
        >php bkup_full.php
    4. ([Or] Optionally) Set up a cron job to call this script
    5. If you're going to have it ftp somewhere, make sure that server is setup correctly
    6. Since it could take several minutes to generate the backup and ftp it,
       and you can't have this request script just waiting around trying to
       figure out if the backup/ftp cycle is complete, it might be beneficial
       to have another script check for completion, and delete the generated
       backup if there was success.
    
    */
    
    /*** BEGIN CONFIG ***/
    
    $reseller = 'www.XXX.com';//your reseller url
    $whmUser = 'XXXX';//your web host manager user name
    $whmPass = 'XXXX';//your web host manager password
    $bkUpReseller = false;//backup the reseller account also? (it's not in the listaccts page)
    $resellerCpTheme = 'bluelagoon';//if you want to back up reseller, we need the reseller cpanel theme
    
    /*
    Destination for the backup...
    
    $destType = '/';// Home Directory
    $destType = 'ftp';// Remote FTP Server
    $destType = 'passiveftp'; //Remove FTP Server (Passive mode transfer)
    */
    $destType = 'ftp';//^^^
    $destServer = 'XXXXX';//only if $destServer = 'ftp' or 'passiveftp'
    $destUser = 'XXXX';//only if $destServer = 'ftp' or 'passiveftp'
    $destPass = 'XXXXX';//only if $destServer = 'ftp' or 'passiveftp'
    $destEmail = 'XXXX@XXX.com';//optional; cpanel will send an email when generation is complete
    $destRdir = '/httpdocs/backup/';
    $destPort = 21;
    
    $logType = 'echo';//output a log to 'file' or 'echo' or 'none'(no log)
    $logFileName = 'bkup_full_log.txt';//can include a path too; only makes sense if $logType = 'file'
    $useSsl = false;//if true, requires SSL on your site, or modify this script to use the shared SSL; this hasn't really been tested
    
    /*
    A comma-separated list of domain names to backup;
    Leave blank to backup all domains found in reseller WHM
    If not blank, ONLY the domains listed will be backed up.
    If listed, the domains must be listed EXACTLY like they appear on the
    list accounts page in WHM, i.e. usually without 'www.'
    $domains = 'example1.com,example2.net';
    */
    $domains = '';
    
    /*** END CONFIG ***/
    
    /*** BEGIN MAIN ***/
    set_time_limit(0);
    $time_start = getMicroTime();
    
    if (!extension_loaded('curl')) {
      dl('php_curl.' .PHP_SHLIB_SUFFIX) or die("Could not load curl extension");
    }
    
    if($useSsl) {
      $protocol = 'https://';
      $cpPort = '2083';
      $whmPort = '2087';
      writeLog("Using SSL.\n");
    }
    else {
      $protocol = 'http://';
      $cpPort = '2082';
      $whmPort = '2086';
      writeLog("Not using SSL.\n");
    }
    
    $domains = trim($domains);
    if(!empty($domains)){
      $chkDoms = true;
      $domains = explode(',',$domains);
      foreach($domains as $d){
        $domains[] = trim($d);
      }
    }
    else {
      $chkDoms = false;
      $domains = array();
    }
    //$postFields = urlencode("dest=$destType&server=$destServer&user=$destPass&pass=$destPass&email=$destEmail");
    $postFields = '';
    $postArray = array();
    $postArray['dest'] = $destType;
    $postArray['server'] = $destServer;
    $postArray['user'] = $destUser;
    $postArray['pass'] = $destPass;
    $postArray['email'] = $destEmail;
    $postArray['rdir'] = $destRdir;
    $postArray['port'] = $destPort;
    
    $thingy = '';
    foreach ($postArray as $k=>$v)
    {
      $thingy.= "$k=".utf8_encode($v).'&';
    }
    $postFields = substr($thingy,0,-1);
    
    
    //get the WHM 'list accounts' page
    writeLog("Retrieving WHM accounts page...\n");
    $acctsPage = getByCurl("$protocol$reseller:$whmPort/scripts/fetchcsv",$whmUser,$whmPass);
    //var_dump($acctsPage);
    
    $accounts = array();
    
    $accounts = explode("\n", trim($acctsPage));
    
    //var_dump($accounts);
    
    $account_records = array();
    
    foreach ($accounts as $row) {
            $account_records[] = explode(',', $row);
    }
    
    writeLog("Parsing accounts...\n");
    
    //var_dump($account_records);
    
    //die('here');
    
    foreach($account_records as $match) {
    
        $accDom = '';
        $accUser = '';
        $accTheme = '';
        $r = '';
        $fullUrl = '';
    
        $accDom = strip_tags(trim($match[1]));//domain
        if($chkDoms)
          if(!in_array($accDom,$domains)) continue;
        $accUser = strip_tags(trim($match[3]));//username
        $accTheme = strip_tags(trim($match[14]));//cpanel theme
    
        $fullUrl = "$protocol$accDom:$cpPort/frontend/$accTheme/backup/dofullbackup.html";
        writeLog("Requesting backup of $accDom...\n");
        $r =& getByCurl($fullUrl,$accUser,$whmPass,array('CURLOPT_POST'=>$postFields));
        if($r === false){
          writeLog("Backup request of $accDom caused an unknown error.\n");
        }
        else {
          writeLog("Backup request of $accDom complete.\n");
        }
        //writeLog("\n\n--$accDom--\n\n$r\n\n------\n\n");
    
    }
    
    if($bkUpReseller){
      $fullUrl = "$protocol$reseller:$cpPort/frontend/$resellerCpTheme/backup/dofullbackup.html";
      writeLog("Requesting backup of $reseller...\n");
      $r =& getByCurl($fullUrl,$accUser,$whmPass,array('CURLOPT_POST'=>$postFields));
    }
    
    $time_end = getMicroTime();
    $time = $time_end - $time_start;
    writeLog("Elapsed time: ".round($time,2)." seconds.\n");
    
    /*** BEGIN FUNCTIONS ***/
    
    function getByCurl($url, $user = '', $pass = '',$extra = '') {
      global $useSsl;
    
      $ch = curl_init();
      //tells curl to save result in a variable instead of outputing to page
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
      curl_setopt ($ch, CURLOPT_COOKIEJAR, './cookie.txt');
      curl_setopt ($ch, CURLOPT_FOLLOWLOCATION,1);
      if(!empty($extra) && is_array($extra)){
        foreach($extra as $opt=>$val){
          switch($opt){
            case 'CURLOPT_REFERER':
              curl_setopt($ch,CURLOPT_REFERER,$val);
            break;
            case 'CURLOPT_POST':
            case 'CURLOPT_POSTFIELDS':
              curl_setopt($ch,CURLOPT_POST,1);
              curl_setopt($ch,CURLOPT_POSTFIELDS,$val);
            break;
          }
        }
      }
      if($useSsl){
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
      }
      $result = curl_exec($ch);
      curl_close($ch);
    
      return $result;
    }
    
    function writeLog($entry) {
      global $logType,$logFileName;
    
      $method = strtolower($logType);
    
      $entry = date('r').' - '.$entry;
    
      if($method == 'file') {
        $fp = fopen($logFileName,'ab');
            fwrite($fp, $entry);
            fclose($fp);
      } elseif($method == 'echo'){
          echo nl2br($entry);//browser
          flush();
      }
    
      return;
    }
    
    function getMicroTime(){
      list($usec, $sec) = explode(" ",microtime());
      return ((float)$usec + (float)$sec);
    }
    
    ?>
    Netinial Deniz - You can hack my heard but never my soul
    Kullanımı konusunda bilgi verebilir misiniz ?