/**
  * accessor for singleton
  *
  * @return FluxdQmgr
  */
 function getInstance()
 {
     global $instanceFluxdQmgr;
     // initialize if needed
     if (!isset($instanceFluxdQmgr)) {
         FluxdQmgr::initialize();
     }
     return $instanceFluxdQmgr;
 }
/**
 * multi
 *
 * @param $action
 */
function dispatcher_multi($action)
{
    global $cfg;
    // is enabled ?
    if ($cfg["enable_multiops"] != 1) {
        AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use multi-op " . $action);
        @error("multiops are disabled", "", "");
    }
    // messages-ary
    $dispatcherMessages = array();
    // loop
    if (empty($_POST['transfer'])) {
        return;
    }
    foreach ($_POST['transfer'] as $key => $element) {
        // url-decode
        $transfer = urldecode($element);
        // is valid transfer ? + check permissions
        $invalid = true;
        if (tfb_isValidTransfer($transfer) === true) {
            if (substr($transfer, -8) == ".torrent") {
                // this is a torrent-client
                $invalid = false;
            } else {
                if (substr($transfer, -5) == ".wget") {
                    // this is wget.
                    $invalid = false;
                    // is enabled ?
                    if ($cfg["enable_wget"] == 0) {
                        $invalid = true;
                        AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use wget");
                        array_push($dispatcherMessages, "wget is disabled : " . $transfer);
                    } else {
                        if ($cfg["enable_wget"] == 1) {
                            if (!$cfg['isAdmin']) {
                                $invalid = true;
                                AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use wget");
                                array_push($dispatcherMessages, "wget is disabled for users : " . $transfer);
                            }
                        }
                    }
                } else {
                    if (substr($transfer, -4) == ".nzb") {
                        // This is nzbperl.
                        $invalid = false;
                        if ($cfg["enable_nzbperl"] == 0) {
                            $invalid = true;
                            AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use nzbperl");
                            array_push($dispatcherMessages, "nzbperl is disabled : " . $transfer);
                        } else {
                            if ($cfg["enable_nzbperl"] == 1) {
                                if (!$cfg['isAdmin']) {
                                    $invalid = true;
                                    AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use nzbperl");
                                    array_push($dispatcherMessages, "nzbperl is disabled for users : " . $transfer);
                                }
                            }
                        }
                    }
                }
            }
        }
        if ($invalid) {
            AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: " . $cfg["user"] . " tried to " . $action . " " . $transfer);
            array_push($dispatcherMessages, "Invalid Transfer : " . $transfer);
            continue;
        }
        // client
        $client = getTransferClient($transfer);
        // is transfer running ?
        $tRunningFlag = isTransferRunning($transfer);
        // action switch
        switch ($action) {
            case "transferStart":
                /* transferStart */
                if (!$tRunningFlag) {
                    $ch = ClientHandler::getInstance($client);
                    $ch->start($transfer, false, FluxdQmgr::isRunning());
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                }
                break;
            case "transferStop":
                /* transferStop */
                if ($tRunningFlag) {
                    $ch = ClientHandler::getInstance($client);
                    $ch->stop($transfer);
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                }
                break;
            case "transferEnQueue":
                /* transferEnQueue */
                if (!$tRunningFlag) {
                    // enqueue it
                    $ch = ClientHandler::getInstance($client);
                    $ch->start($transfer, false, true);
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                }
                break;
            case "transferDeQueue":
                /* transferDeQueue */
                if (!$tRunningFlag) {
                    // dequeue it
                    FluxdQmgr::dequeueTransfer($transfer, $cfg['user']);
                }
                break;
            case "transferResetTotals":
                /* transferResetTotals */
                $msgs = resetTransferTotals($transfer, false);
                if (count($msgs) > 0) {
                    $dispatcherMessages = array_merge($dispatcherMessages, $msgs);
                }
                break;
            default:
                if ($tRunningFlag) {
                    // stop first
                    $ch = ClientHandler::getInstance($client);
                    $ch->stop($transfer);
                    if (count($ch->messages) > 0) {
                        $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                    }
                    // is transfer running ?
                    $tRunningFlag = isTransferRunning($transfer);
                }
                // if it was running... hope the thing is down...
                // only continue if it is
                if (!$tRunningFlag) {
                    switch ($action) {
                        case "transferWipe":
                            /* transferWipe */
                            $msgsDelete = deleteTransferData($transfer);
                            if (count($msgsDelete) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete);
                            }
                            $msgsReset = resetTransferTotals($transfer, true);
                            if (count($msgsReset) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $msgsReset);
                            }
                            break;
                        case "transferData":
                            /* transferData */
                            $msgsDelete = deleteTransferData($transfer);
                            if (count($msgsDelete) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete);
                            }
                        case "transfer":
                            /* transfer */
                            $ch = ClientHandler::getInstance($client);
                            $ch->delete($transfer);
                            if (count($ch->messages) > 0) {
                                $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
                            }
                    }
                }
        }
        // end switch
    }
    // end loop
    // error if messages
    if (count($dispatcherMessages) > 0) {
        @error("There were Problems", "", "", $dispatcherMessages);
    }
}
Example #3
0
// set supported-var
$tmpl->setvar('fluxdSupported', $failed > 0 ? 0 : 1);
// fluxd core
if (Fluxd::isRunning()) {
    $tmpl->setvar('fluxdRunning', 1);
    $tmpl->setvar('fluxdPid', Fluxd::getPid());
} else {
    $tmpl->setvar('fluxdRunning', 0);
}
$tmpl->setvar('fluxd_dbmode', $cfg["fluxd_dbmode"]);
$tmpl->setvar('fluxd_loglevel', $cfg["fluxd_loglevel"]);
// Qmgr
FluxdServiceMod::initializeServiceMod('Qmgr');
// would not be needed as its done in main
$tmpl->setvar('fluxd_Qmgr_enabled', $cfg["fluxd_Qmgr_enabled"]);
$tmpl->setvar('fluxd_Qmgr_state', FluxdQmgr::getModState());
$tmpl->setvar('fluxd_Qmgr_interval', $cfg["fluxd_Qmgr_interval"]);
$tmpl->setvar('fluxd_Qmgr_maxTotalTransfers', $cfg["fluxd_Qmgr_maxTotalTransfers"]);
$tmpl->setvar('fluxd_Qmgr_maxUserTransfers', $cfg["fluxd_Qmgr_maxUserTransfers"]);
// Watch
FluxdServiceMod::initializeServiceMod('Watch');
$tmpl->setvar('fluxd_Watch_enabled', $cfg["fluxd_Watch_enabled"]);
$tmpl->setvar('fluxd_Watch_state', FluxdWatch::getModState());
$tmpl->setvar('fluxd_Watch_interval', $cfg["fluxd_Watch_interval"]);
// Rssad
FluxdServiceMod::initializeServiceMod('Rssad');
$tmpl->setvar('fluxd_Rssad_enabled', $cfg["fluxd_Rssad_enabled"]);
$tmpl->setvar('fluxd_Rssad_state', FluxdRssad::getModState());
$tmpl->setvar('fluxd_Rssad_interval', $cfg["fluxd_Rssad_interval"]);
// Fluxinet
FluxdServiceMod::initializeServiceMod('Fluxinet');
 /**
  * Dequeue Transfer
  *
  * @param $transfer
  * @return mixed
  */
 function _transferDequeue($transfer)
 {
     global $cfg;
     // initialize service-mod (why here ? see "fluxd-single-thread-problem")
     FluxdServiceMod::initializeServiceMod('Qmgr');
     // check queue
     if (!FluxdQmgr::isRunning()) {
         $this->_outputError("Qmgr is not running.\n");
         return false;
     }
     // check transfer
     if (!transferExists($transfer)) {
         $this->_outputError("transfer does not exist.\n");
         return false;
     }
     // set user
     $cfg["user"] = getOwner($transfer);
     // output
     $this->_outputMessage("Dequeue " . $transfer . " for user " . $cfg["user"] . "...\n");
     // dequeue
     FluxdQmgr::dequeueTransfer($transfer, $cfg["user"]);
     $this->_outputMessage("done.\n");
     return true;
 }
/**
 * get server stats
 * note : this can only be used after a call to update transfer-values in cfg-
 *        array (eg by getTransferListArray)
 *
 * @return array
 *
 * "speedDown"            0
 * "speedUp"              1
 * "speedTotal"           2
 * "cons"                 3
 * "freeSpace"            4
 * "loadavg"              5
 * "running"              6
 * "queued"               7
 * "speedDownPercent"     8
 * "speedUpPercent"       9
 * "driveSpacePercent"   10
 *
 */
function getServerStats()
{
    global $cfg;
    $serverStats = array();
    // speedDown
    $speedDown = "n/a";
    $speedDown = @number_format($cfg["total_download"], 2);
    array_push($serverStats, $speedDown);
    // speedUp
    $speedUp = "n/a";
    $speedUp = @number_format($cfg["total_upload"], 2);
    array_push($serverStats, $speedUp);
    // speedTotal
    $speedTotal = "n/a";
    $speedTotal = @number_format($cfg["total_download"] + $cfg["total_upload"], 2);
    array_push($serverStats, $speedTotal);
    // cons
    $cons = "n/a";
    $cons = @netstatConnectionsSum();
    array_push($serverStats, $cons);
    // freeSpace
    $freeSpace = "n/a";
    $freeSpace = @formatFreeSpace($cfg["free_space"]);
    array_push($serverStats, $freeSpace);
    // loadavg
    $loadavg = "n/a";
    $loadavg = @getLoadAverageString();
    array_push($serverStats, $loadavg);
    // running
    $running = "n/a";
    $running = @getRunningTransferCount();
    array_push($serverStats, $running);
    // queued
    $queued = FluxdQmgr::countQueuedTransfers();
    array_push($serverStats, $queued);
    // speedDownPercent
    $percentDownload = 0;
    $maxDownload = $cfg["bandwidth_down"] / 8;
    $percentDownload = $maxDownload > 0 ? @number_format($cfg["total_download"] / $maxDownload * 100, 0) : 0;
    array_push($serverStats, $percentDownload);
    // speedUpPercent
    $percentUpload = 0;
    $maxUpload = $cfg["bandwidth_up"] / 8;
    $percentUpload = $maxUpload > 0 ? @number_format($cfg["total_upload"] / $maxUpload * 100, 0) : 0;
    array_push($serverStats, $percentUpload);
    // driveSpacePercent
    $driveSpacePercent = 0;
    $driveSpacePercent = @getDriveSpace($cfg["path"]);
    array_push($serverStats, $driveSpacePercent);
    // return
    return $serverStats;
}
 /**
  * _maintenanceTransfers
  *
  * @param $trestart
  * @return boolean
  */
 function _maintenanceTransfers($trestart = false)
 {
     global $cfg, $db, $transfers;
     // set var
     $this->_restartTransfers = $trestart;
     // output
     $this->_outputMessage("transfers-maintenance...\n");
     // sanity-check for transfers-dir
     if (!is_dir($cfg["transfer_file_path"])) {
         $this->state = MAINTENANCEANDREPAIR_STATE_ERROR;
         $msg = "invalid dir-settings. no dir : " . $cfg["transfer_file_path"];
         array_push($this->messages, $msg);
         $this->_outputError($msg . "\n");
         return false;
     }
     // pid-files of transfer-clients
     $pidFiles = array();
     if ($dirHandle = @opendir($cfg["transfer_file_path"])) {
         while (false !== ($file = @readdir($dirHandle))) {
             if (strlen($file) > 3 && substr($file, -4, 4) == ".pid") {
                 array_push($pidFiles, $file);
             }
         }
         @closedir($dirHandle);
     }
     // return if no pid-files found
     if (count($pidFiles) < 1) {
         $this->_outputMessage("no pid-files found.\n");
         $this->_outputMessage("transfers-maintenance done.\n");
         return true;
     }
     // get process-list
     $psString = trim(shell_exec("ps x -o pid='' -o ppid='' -o command='' -ww"));
     // test if client for pid is still up
     $this->_bogusTransfers = array();
     foreach ($pidFiles as $pidFile) {
         $transfer = substr($pidFile, 0, -4);
         if (stristr($psString, $transfer) === false) {
             if (getTransferClient($transfer) != "azureus") {
                 array_push($this->_bogusTransfers, $transfer);
             }
         }
     }
     // return if no stale pid-files
     $this->_countProblems = count($this->_bogusTransfers);
     if ($this->_countProblems < 1) {
         $this->_outputMessage("no stale pid-files found.\n");
         $this->_outputMessage("transfers-maintenance done.\n");
         return true;
     }
     /* repair the bogus clients */
     $this->_countFixed = 0;
     $this->_outputMessage("repairing died clients...\n");
     foreach ($this->_bogusTransfers as $transfer) {
         // output
         $this->_outputMessage("repairing " . $transfer . " ...\n");
         // set stopped flag in db
         stopTransferSettings($transfer);
         // rewrite stat-file
         $sf = new StatFile($transfer, getOwner($transfer));
         $sf->running = 0;
         $sf->percent_done = -100.0;
         $sf->time_left = 'Transfer Died';
         $sf->down_speed = 0;
         $sf->up_speed = 0;
         $sf->seeds = 0;
         $sf->peers = 0;
         $sf->write();
         // delete pid-file
         @unlink($cfg["transfer_file_path"] . $transfer . ".pid");
         // DEBUG : log the repair of the bogus transfer
         if ($cfg['debuglevel'] > 0) {
             AuditAction($cfg["constants"]["debug"], "transfers-maintenance : transfer repaired : " . $transfer);
         }
         // output
         $this->_outputMessage("done.\n");
         // count
         $this->_countFixed++;
     }
     // output
     if ($this->_countProblems > 0) {
         $this->_outputMessage("repaired transfers : " . $this->_countFixed . "/" . $this->_countProblems . "\n");
     }
     /* restart transfers */
     if ($this->_restartTransfers) {
         $this->_fixedTransfers = array();
         $this->_outputMessage("restarting died clients...\n");
         // hold current user
         $whoami = $this->_mode == MAINTENANCEANDREPAIR_MODE_CLI ? GetSuperAdmin() : $cfg["user"];
         foreach ($this->_bogusTransfers as $transfer) {
             // output
             $this->_outputMessage("Starting " . $transfer . " ...\n");
             // set current user to transfer-owner
             $cfg["user"] = getOwner($transfer);
             // clientHandler + start
             $ch = ClientHandler::getInstance(getTransferClient($transfer));
             $ch->start($transfer, false, FluxdQmgr::isRunning());
             // DEBUG : log the restart of the died transfer
             if ($cfg['debuglevel'] > 0) {
                 $staret = $ch->state == CLIENTHANDLER_STATE_OK ? "OK" : "FAILED";
                 AuditAction($cfg["constants"]["debug"], "transfers-maintenance : restarted transfer " . $transfer . " by " . $whoami . " : " . $staret);
             }
             if ($ch->state == CLIENTHANDLER_STATE_OK) {
                 // output
                 $this->_outputMessage("done.\n");
                 // add to ary
                 array_push($this->_fixedTransfers, $transfer);
                 // count
                 $this->_countFixed++;
             } else {
                 $this->messages = array_merge($this->messages, $ch->messages);
                 $this->_outputError(implode("\n", $ch->messages) . "\n");
             }
         }
         // set user back
         $cfg["user"] = $whoami;
         // output
         $this->_countFixed = count($this->_fixedTransfers);
         if ($this->_countFixed > 0) {
             $this->_outputMessage("restarted transfers : " . $this->_countFixed . "/" . $this->_countProblems . "\n");
         }
     }
     /* done */
     $this->_outputMessage("transfers-maintenance done.\n");
     // return
     return true;
 }
Example #7
0
     $tmpl->setvar('_YOURXFERSTATS', $cfg['_YOURXFERSTATS']);
     $tmpl->setvar('totalxfer1', @formatFreeSpace($xfer_total['total']['total'] / 1048576));
     $tmpl->setvar('monthxfer1', @formatFreeSpace($xfer_total['month']['total'] / 1048576));
     $tmpl->setvar('weekxfer1', @formatFreeSpace($xfer_total['week']['total'] / 1048576));
     $tmpl->setvar('dayxfer1', @formatFreeSpace($xfer_total['day']['total'] / 1048576));
     $xfer = Xfer::getStats();
     $tmpl->setvar('total2', @formatFreeSpace($xfer[$cfg["user"]]['total']['total'] / 1048576));
     $tmpl->setvar('month2', @formatFreeSpace($xfer[$cfg["user"]]['month']['total'] / 1048576));
     $tmpl->setvar('week2', @formatFreeSpace($xfer[$cfg["user"]]['week']['total'] / 1048576));
     $tmpl->setvar('day2', @formatFreeSpace($xfer[$cfg["user"]]['day']['total'] / 1048576));
 }
 // queue
 if (FluxdQmgr::isRunning()) {
     $tmpl->setvar('_QUEUEMANAGER', $cfg['_QUEUEMANAGER']);
     $tmpl->setvar('runningTransferCount', getRunningTransferCount());
     $tmpl->setvar('countQueuedTransfers', FluxdQmgr::countQueuedTransfers());
     $tmpl->setvar('limitGlobal', $cfg["fluxd_Qmgr_maxTotalTransfers"]);
     $tmpl->setvar('limitUser', $cfg["fluxd_Qmgr_maxUserTransfers"]);
 }
 // other
 $tmpl->setvar('_OTHERSERVERSTATS', $cfg['_OTHERSERVERSTATS']);
 $tmpl->setvar('downloadspeed1', @number_format($cfg["total_download"], 2));
 $tmpl->setvar('downloadspeed11', @number_format($transfers['sum']['drate'], 2));
 $tmpl->setvar('uploadspeed1', @number_format($cfg["total_upload"], 2));
 $tmpl->setvar('uploadspeed11', @number_format($transfers['sum']['rate'], 2));
 $tmpl->setvar('totalspeed1', @number_format($cfg["total_download"] + $cfg["total_upload"], 2));
 $tmpl->setvar('totalspeed11', @number_format($transfers['sum']['rate'] + $transfers['sum']['drate'], 2));
 $tmpl->setvar('id_connections1', $netstatConnectionsSum);
 $tmpl->setvar('id_connections11', $netstatConnectionsMax);
 $tmpl->setvar('drivespace1', $cfg['freeSpaceFormatted']);
 $tmpl->setvar('serverload1', $loadavgString);
            if ($cfg["showdirtree"] == 1) {
                tmplSetDirTree($ch->savepath, $cfg["maxdepth"]);
            }
        } else {
            $tmpl->setvar('showdirtree', 0);
        }
        // hash-check
        $tmpl->setvar('skip_hash_check_enabled', $cfg["supportMap"][$ch->client]['skip_hash_check']);
        if ($cfg["supportMap"][$ch->client]['skip_hash_check'] == 1) {
            $dsize = getTorrentDataSize($transfer);
            $tmpl->setvar('is_skip', $dsize > 0 && $dsize != 4096 ? $cfg["skiphashcheck"] : 0);
        } else {
            $tmpl->setvar('is_skip', 0);
        }
        // queue
        $tmpl->setvar('is_queue', FluxdQmgr::isRunning() ? 1 : 0);
        // break
        break;
    default:
        /* default */
        @error("Invalid pageop", "", "", array($pageop));
}
// title + foot
tmplSetFoot(false);
tmplSetTitleBar($transferLabel . " - Control", false);
// lang vars
$tmpl->setvar('_RUNTRANSFER', $cfg['_RUNTRANSFER']);
$tmpl->setvar('_STOPTRANSFER', $cfg['_STOPTRANSFER']);
$tmpl->setvar('_DELQUEUE', $cfg['_DELQUEUE']);
// iid
tmplSetIidVars();
 /**
  * start a client.
  */
 function _start()
 {
     global $cfg;
     if ($this->state != CLIENTHANDLER_STATE_READY) {
         $this->state = CLIENTHANDLER_STATE_ERROR;
         array_push($this->messages, "Error. ClientHandler in wrong state on start-request.");
         // write error to stat
         $sf = new StatFile($this->transfer, $this->owner);
         $sf->time_left = 'Error';
         $sf->write();
         // return
         return;
     }
     // Save transfer settings
     $this->settingsSave();
     // flush session-cache (trigger transfers-cache-set on next page-load)
     cacheFlush($cfg['user']);
     // write the session to close so older version of PHP will not hang
     @session_write_close();
     // sf
     $sf = new StatFile($this->transfer, $this->owner);
     // queue or start ?
     if ($this->queue) {
         // queue
         if (FluxdQmgr::isRunning()) {
             // write stat-file
             $sf->queue();
             // send command
             FluxdQmgr::enqueueTransfer($this->transfer, $cfg['user']);
             // log
             AuditAction($cfg["constants"]["queued_transfer"], $this->transfer);
             $this->logMessage("transfer enqueued : " . $this->transfer . "\n", true);
         } else {
             $msg = "queue-request (" . $this->transfer . "/" . $cfg['user'] . ") but Qmgr not active";
             array_push($this->messages, $msg);
             AuditAction($cfg["constants"]["error"], $msg);
             $this->logMessage($msg . "\n", true);
         }
         // set flag
         $this->running = 0;
     } else {
         // start
         // write stat-file
         $sf->start();
         // log the command
         $this->logMessage("executing command : \n" . $this->command . "\n", true);
         // startup
         $this->callResult = exec($this->command);
         AuditAction($cfg["constants"]["start_torrent"], $this->transfer);
         // set flag
         $this->running = 1;
         // wait until transfer is up
         waitForTransfer($this->transfer, true, 20);
     }
     if (empty($this->messages)) {
         // set state
         $this->state = CLIENTHANDLER_STATE_OK;
     } else {
         // error
         $this->state = CLIENTHANDLER_STATE_ERROR;
         $msg = "error starting client. messages :\n";
         $msg .= implode("\n", $this->messages);
         $this->logMessage($msg . "\n", true);
         // write error to stat
         $sf->time_left = 'Error';
         $sf->write();
     }
 }
Example #10
0
}
/******************************************************************************/
// is enabled ?
if ($cfg["enable_multiupload"] != 1) {
    AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: " . $cfg["user"] . " tried to use multiupload");
    @error("multiupload is disabled", "index.php?iid=index", "");
}
// init template-instance
tmplInitializeInstance($cfg["theme"], "page.multiup.tmpl");
// form
$row_list = array();
for ($j = 0; $j < $cfg["hack_multiupload_rows"]; ++$j) {
    array_push($row_list, array());
}
$tmpl->setloop('row_list', $row_list);
// queue
$tmpl->setvar('queueActive', FluxdQmgr::isRunning() ? 1 : 0);
//
$tmpl->setvar('file_types_label', $cfg['file_types_label']);
//
$tmpl->setvar('_UPLOAD', $cfg['_UPLOAD']);
$tmpl->setvar('_SELECTFILE', $cfg['_SELECTFILE']);
$tmpl->setvar('_ID_IMAGES', $cfg['_ID_IMAGES']);
$tmpl->setvar('_MULTIPLE_UPLOAD', $cfg['_MULTIPLE_UPLOAD']);
//
$tmpl->setvar('enable_multiupload', $cfg["enable_multiupload"]);
tmplSetTitleBar($cfg["pagetitle"] . ' - ' . $cfg['_MULTIPLE_UPLOAD']);
tmplSetFoot();
tmplSetIidVars();
// parse template
$tmpl->pparse();