3rd Party Application Manager

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hallo zusammen

itari uns seine 3rdPartyAppl haben mich ermuntert mal was eigenes zu versuchen. Herausgekommen ist eine Application Manager, der es erlaubt bestehende 3rd Party Appl zu löschen oder neue zu erstellen. Beim Erstellen können zusätzlich Files via Upload für das Verzeichnis /phpsrc/{NAME} angegeben werden oder der Quellcode des Files kann über eine Textarea eingegeben werden
TODO:
- Möglichkeit auch gepackte Verzeichnisse hochzuladen und auf dem Server zu entpacken
- Editor um bestehende Appl und deren Files anzupassen

Das Script ist soweit fertisch und ich habe es bei mir zu Hause auch schon exzessiv ausprobiert (keine Fehler soweit)
Falls Interesse bestehen würde, würde ich die Source heute nach der Arbeit hier reinstellen mit der obligaten Bemerkung dass alles auf die eigene Kappe geht ;)

Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Tolle Idee tobi :)

ja stelle es bitte rein.

itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Mein erster Versuch

Also hier mal die erste Version meines 3rd Party Managers. Der Code funzt, soweit ich das bei mir (DS107+) getestet habe, einwandfrei. Wichtig ist noch, dass der Code, welcher via die Textarea eingefügt wird IMMER der "Hauptdatei" - jener die unter path in application.cfg definiert ist - zugeordnet wird. Die Uploads per File werden unter /phpsrc/{NAME}/file.ext abgelegt, nach dem Namen, den der Browser übermittelt. Vor dem Erstellen einer Applikation auf der DS werden die übermittelten Daten nochmals zur Kontrolle angezeigt, um eine Bestätigung seitens des Users zu fordern. Das Löschen einer Applikation funzt dann wieder NIX-like d.h. ohne Rückfrage wird gelöscht :D

WICHTIG: Diese Applikation sollte auf keinen Fall öffentloich zugänglich gemacht werden!! Es werden Usereingaben (Upload oder Textarea) in zugänglichen Files abgelegt. Also ladet nur Code rauf, den ihr vorher geprüft habt ;) Sonst lässt sich damit auch ein komplettes System einstampfen!!

Hier mal der Quellcode (damit ihr seht was gemacht wird) und das ganze noch als Attachment als txt File (einfach in .php umbenennen)
Eigentlich kann man diesen Code gleich Testen und ihn verwenden um diese Appl zu installieren:
1) File in .php umbenennen und nach /usr/syno/synoman/phpsrc/ kopieren
2) das Script aufrufen (z.B. https://IP_DER_DS:5001/phpsrc/manager.php)
3) die benötigten Felder ausfüllen. Anhand dieser Daten wird eine application.cfg und die benötigten Verzeichnisse erstellt
4) a)den Quelltext aus manager.php in die Textarea einfügen und das Form abschicken
b) die Datei manager.php via Upload auswählen und das Form abschicken
5) das Script zeigt alle benötigten Änderungen an und wenn alles okay ist dann den entsprechenden Link klicken, um die Änderungen auf die Platte zu schreiben

Wie üblich: Alles geht auf die eigene Kappe ;)

Gruss und viel Spass

tobi
PHP:
<?php
ini_set('session.use_cookies','0');
session_start();

$appl_names = array();
//diese beiden Pfad müsst ihr ggf anpassen KEINEN abschliessenden Slash (/)
$path_3rdparty = '/usr/syno/synoman/webman/3rdparty';
$path_phpsrc = '/usr/syno/synoman/phpsrc';

$dh = opendir($path_3rdparty);
while(($res=readdir($dh))!==false){
  if($res != '.' && $res != '..' && is_dir($path_3rdparty.'/'.$res)){
   $appl_names[] = $res;
  }
}

if(isset($_POST['delete']) && isset($_POST['del']) && count($_POST['del']) > 0){
 foreach ($_POST['del'] as $wert){
  (file_exists($path_3rdparty.'/'.$wert.'/application.cfg') ? $res=file_get_contents($path_3rdparty.'/'.$wert.'/application.cfg') :$res=0);
 if($res===0){
   continue;
  }
  preg_match('/path.*?=.*?\/phpsrc(\/.*?)\/.*?\.[^\s]*/i',$res,$ret);
  $tt = array();
  exec('rm -r '.$path_3rdparty.'/'.$wert,$tt);
  if(isset($ret[1]) && is_dir($path_phpsrc.$ret[1])){
   exec('rm -r '.$path_phpsrc.$ret[1],$tt);
  }
  if(count($tt) == 0){
   echo 'Erweiterung wurde entfernt';
  }else{
   echo '<pre>'.implode("\r\n",$tt).'</pre>';
  }
  exit;
 }
}elseif(isset($_POST['senden']) && !empty($_POST['Linktext']) && !empty($_POST['Description']) && !empty($_POST['Dir']) && !

empty($_POST['type']) && !empty($_POST['fname'])){
 $att = array();
 $strr = '<strong>Please check the data below carefully as after your confirmation application directories will be created with the parameters given<br />*** No operation will be executed <u>before</u> you confirm by clicking below ***</strong>';
 $strr .= '<br /><br />First the content of <strong>application.cfg</strong> that will be created in <strong>'.$path_3rdparty.'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'</strong><br />';
 $str = '';
 $str .= 'text = '.$_POST['Linktext']."\r\n";
 $str .= 'description = '.$_POST['Description']."\r\n";
 $str .= 'type = ';
 ($_POST['type'] == 'embedded') ? $str .= 'embedded' : $str .= 'standalone';
 $str .= "\r\n";
 $str .= 'path = /phpsrc/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['fname']))."\r\n";
 $_SESSION['appl.cfg'] = $str;
 $_SESSION['appl.dir'] = preg_replace('/\s+|\/+/','',strtolower($_POST['Dir']));

 for($i=0;$i<count($_FILES['file']['name']);$i++){
  if($_FILES['file']['name'][$i] == ''){
   continue;
  }
  $f = file_get_contents($_FILES['file']['tmp_name'][$i]);
  $att[] = array('path'=>$path_phpsrc.'/'.$_SESSION['appl.dir'].'/'.$_FILES['file']['name'][$i],'content'=>$f);
 }
 if(isset($_POST['file_content']) && trim($_POST['file_content']) != ''){
  $att[] = array('path'=>$path_phpsrc.'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['fname'])),'content'=>$_POST['file_content']);
 }
 $_SESSION['appl.att'] = $att;
 
 echo $strr;
 echo '<pre>'.$str.'</pre>';
 echo '<br />';
 echo 'The following files from your upload will be created:<br /><br />';
 foreach($_SESSION['appl.att'] as $wert){
  echo '<strong>'.$wert['path'].'</strong><br />';
 }
 echo '<br />By clicking <a href="'.$_SERVER['PHP_SELF'].'?'.strip_tags(SID).'">this link</a> all the necessary operation will be written to disk!!!<br />You can abort the operation by <a href="https://'.$_SERVER['SERVER_ADDR'].':5001/webman/index.cgi">clicking this link</a>';
}elseif(isset($_SESSION['appl.cfg']) && isset($_SESSION['appl.dir'])){
 exec('mkdir '.$path_3rdparty.'/'.$_SESSION['appl.dir']);
 exec('mkdir '.$path_phpsrc.'/'.$_SESSION['appl.dir']);
 $fp = fopen($path_3rdparty.'/'.$_SESSION['appl.dir'].'/application.cfg','w');
 fwrite($fp,$_SESSION['appl.cfg']);
 fclose($fp);
 
 foreach($_SESSION['appl.att'] as $wert){
  $fp = fopen($wert['path'],'w');
  fwrite($fp,$wert['content']);
  fclose($fp);
 }
 unset($_SESSION);
 session_destroy();
 echo '<a href="https://'.$_SERVER['SERVER_ADDR'].':5001/webman/index.cgi">Operations Successfulls done return</a>';
 exit;
}else{
?>
 <html>
 <head>
 <title>3rd Party Application Remover</title>
 </head>
 <body>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
 <?php
 echo '<table border="1">';
 foreach ($appl_names as $wert){
  echo '<tr><td><input type="checkbox" name="del[]" value="'.$wert.'" /></td><td><input disabled="disabled" type="text" value="'.$wert.'" /></td></tr>';
 }
 echo '<tr colspan="4" style="text-align:center;"><td><input type="submit" name="delete" value="Löschen" /></td>';
 echo '<td><input type="reset" value="Eingaben löschen" /></td></tr></table>';
 ?>
 </form>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data">
 <table border="1">
 <th bgcolor="Teal">
 <tr><td colspan="10">Create a 3rdParty-Application for Diskstation</td></tr>
 </th>
 <tr>
 <td>Text for the Link</td><td><input type="text" name="Linktext" /></td>
 <td>Description for Tooltip</td><td><input type="text" name="Description" /></td>
 </tr>
 <tr>
 <td>Application Directory</td><td><input type="text" name="Dir" /></td>
 </tr>
 <tr>
 <td>Application Type</td><td><select name="type">
 <option value="embedded" selected="selected">Embedded</option>
 <option value="popup">Popup</option>
 </select></td><td>Filename</td><td><input type="text" name="fname" /></td>
 </tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr>
 <td colspan="20"><textarea name="file_content" rows="40" cols="80"></textarea></td>
 </tr>
 <tr>
 <td><input type="submit" name="senden" value="Create" /></td><td><input type="reset" value="Reset Form" /></td>
 </tr>
 </table>
 </form>
 </body>
 </html>
<?php
}
?>
 

Anhänge

  • manager.txt
    9,3 KB · Aufrufe: 37
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Geee - super! :)

Aber du weißt, was nu noch auf dich zukommt?

Da ja die Firmware-Updates das Verzeichnis phpsrc platt machen, brauchen wir noch ein hübsche Sicherung und einen Restore aller 3rd-party-apps :D

Aber lass dir Zeit - es reicht, wenn es am Wochenende steht. :D:D

liebe Grüße

itari
 

Pompom

Benutzer
Mitglied seit
17. Jul 2008
Beiträge
70
Punkte für Reaktionen
0
Punkte
6
Super Arbeit!
Itari hat recht fehlt nur noch eine Datensicherung :D:D
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Datensicherung beta

Hier mal ne schnelle Möglichkeit des Backups und Restores (wirklich nur rudimentär)
PHP:
}elseif(isset($_GET['backup'])){
 //diese Verzeichnisse müsst ihr euren Gegebenheiten und Vorlieben anpassen
 // /tmp ist sicher suboptimal ;-)
 mkdir('/tmp/backupSynology');
 mkdir('/tmp/backupSynology/3rdparty');
 mkdir('/tmp/backupSynology/phpsrc');
 foreach($appl_names as $wert){
  (file_exists($path_3rdparty.'/'.$wert.'/application.cfg') ? $res=file_get_contents($path_3rdparty.'/'.$wert.'/application.cfg') :$res=0);
 if($res===0){
   continue;
  }
  preg_match('/path.*?=.*?\/phpsrc(\/.*?)\/.*?\.[^\s]*/i',$res,$ret);
  exec('cp -R '.$path_3rdparty.'/'.$wert.' /tmp/backupSynology/3rdparty');
  exec('cp -R '.$path_phpsrc.$ret[1].' /tmp/backupSynology/phpsrc');
 }
 die('Data seccesfully wrote to backup directory');
}elseif(isset($_GET['restore']) && isset($_GET['path']) && !empty($_GET['path'])){
 if(!is_dir($_GET['path']) || !is_dir($_GET['path'].'/phpsrc') || !is_dir($_GET['path'].'/3rdparty')){
  die('Data could not be restored because eighter Backup Path was not given OR the subdirectories (3rdparty phpsrc) do not exist in given path');
 }
 exec('cp -Rf '.$_GET['path'].'/phpsrc '.str_replace('phpsrc','',$path_phpsrc));
 exec('cp -Rf '.$_GET['path'].'/3rdparty '.str_replace('3rdparty','',$path_3rdparty));
 die('Data succesfully restored');
}
einbauen in den äussersten if-else Zweig (z.B nach dem schliessenden } des äussersten if)
TODO
* Backup Verzeichnisse x-beliebig vorgeben
* Backup downloaden als zip resp gz
* Abfangen und reagieren wenn Backup Verzeichnisse schon existieren <erledigt siehe nächsten Post>
* und noch allerlei weiteren Dinge ;)

WICHTIG
der Code geht davon aus, dass die Backup Verzeichnisse noch nicht existieren und will sie immer neu anlegen. Könnte also in die Hose gehen wenn die Verzeichnisse schon da sind (siehe TODO 3). Am besten also nach jedem Backup die Verzeichnisse weg-'mv'

Verwendung

Backup --> https://IP_DER_DS:5001/phpsrc/3rdparty_manager/manager.php?backup

Restore --> https://IP_DER_DS:5001/phpsrc/3rdparty_manager/manager.php?restore&path=/tmp/backupSynology

Gruss

tobi
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Ich habe die Backup/Restore Funktion jetzt noch in einem eigenen Form untergebracht. Bei den Backups ist es jetzt egal wenn die Dateien/Verzeichnisse schon da sind. Jedes Backup legt die beiden Verzeichnisse phpsrc und 3rdparty mit einem Timestamp im Namen ab. Beim "restoren" kann man in einem Drop Down Menu auswählen welche Version man wieder hergestellt haben will

Also hier mal die aktuellste Version
PHP:
<?php
ini_set('session.use_cookies','0');
session_start();
/**
 * Setting some "global" Vars
 */
$appl_names = array();
$path_3rdparty = '/usr/syno/synoman/webman/3rdparty';
$path_phpsrc = '/usr/syno/synoman/phpsrc';
$backup_dir = '/volume1/tmp';
$backup_name = 'backupSynology';

$dh = opendir($path_3rdparty);
while(($res=readdir($dh))!==false){
  if($res != '.' && $res != '..' && is_dir($path_3rdparty.'/'.$res)){
   $appl_names[] = $res;
  }
}
if(isset($_POST['delete']) && isset($_POST['del']) && count($_POST['del']) > 0){
 foreach ($_POST['del'] as $wert){
  (file_exists($path_3rdparty.'/'.$wert.'/application.cfg') ? $res=file_get_contents($path_3rdparty.'/'.$wert.'/application.cfg') :$res=0);
 if($res===0){
   continue;
  }
  preg_match('/path.*?=.*?\/phpsrc(\/.*?)\/.*?\.[^\s]*/i',$res,$ret);
  $tt = array();
  exec('rm -r '.$path_3rdparty.'/'.$wert,$tt);
  if(isset($ret[1]) && is_dir($path_phpsrc.$ret[1])){
   exec('rm -r '.$path_phpsrc.$ret[1],$tt);
  }
  if(count($tt) == 0){
   echo 'Erweiterung wurde entfernt';
  }else{
   echo '<pre>'.implode("\r\n",$tt).'</pre>';
  }
  exit;
 }
}elseif(isset($_POST['senden']) && !empty($_POST['Linktext']) && !empty($_POST['Description']) && !empty($_POST['Dir']) && !empty($_POST['type']) && !empty($_POST['fname'])){
 $att = array();
 $strr = '<strong>Please check the data below carefully as after your confirmation application directories will be created with the parameters given<br />*** No operation will be executed <u>before</u> you confirm by clicking below ***</strong>';
 $strr .= '<br /><br />First the content of <strong>application.cfg</strong> that will be created in <strong>'.$path_3rdparty.'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'</strong><br />';
 $str = '';
 $str .= 'text = '.$_POST['Linktext']."\r\n";
 $str .= 'description = '.$_POST['Description']."\r\n";
 $str .= 'type = ';
 ($_POST['type'] == 'embedded') ? $str .= 'embedded' : $str .= 'standalone';
 $str .= "\r\n";
 $str .= 'path = /phpsrc/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['fname']))."\r\n";
 $_SESSION['appl.cfg'] = $str;
 $_SESSION['appl.dir'] = preg_replace('/\s+|\/+/','',strtolower($_POST['Dir']));
 
 for($i=0;$i<count($_FILES['file']['name']);$i++){
  if($_FILES['file']['name'][$i] == '' || $_FILES['file']['size'][$i] == 0){
   continue;
  }
  $f = file_get_contents($_FILES['file']['tmp_name'][$i]);
  $att[] = array('path'=>$path_phpsrc.'/'.$_SESSION['appl.dir'].'/'.$_FILES['file']['name'][$i],'content'=>$f);
 }
 if(isset($_POST['file_content']) && trim($_POST['file_content']) != ''){
  $att[] = array('path'=>$path_phpsrc.'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['fname'])),'content'=>$_POST['file_content']);
 }
 $_SESSION['appl.att'] = $att;
 echo $strr;
 echo '<pre>'.$str.'</pre>';
 echo '<br />';
 echo 'The following files from your upload will be created:<br /><br />';
 foreach($_SESSION['appl.att'] as $wert){
  echo '<strong>'.$wert['path'].'</strong><br />';
 }
 echo '<br />By clicking <a href="'.$_SERVER['PHP_SELF'].'?'.strip_tags(SID).'">this link</a> all the necessary operation will be written to disk!!!<br />You can abort the operation by <a href="https://'.$_SERVER['SERVER_ADDR'].':5001/webman/index.cgi">clicking this link</a>';
}elseif(isset($_POST['backup'])){
 if(!is_dir($backup_dir.'/'.$backup_name)){
  mkdir($backup_dir.'/'.$backup_name);
 }
 $t = time();
 mkdir($backup_dir.'/'.$backup_name.'/3rdparty_'.$t);
 mkdir($backup_dir.'/'.$backup_name.'/phpsrc_'.$t);
 foreach($appl_names as $wert){
  (file_exists($path_3rdparty.'/'.$wert.'/application.cfg') ? $res=file_get_contents($path_3rdparty.'/'.$wert.'/application.cfg') :$res=0);
 if($res===0){
   continue;
  }
  preg_match('/path.*?=.*?\/phpsrc(\/.*?)\/.*?\.[^\s]*/i',$res,$ret);
  exec('cp -R '.$path_3rdparty.'/'.$wert.' '.$backup_dir.'/'.$backup_name.'/3rdparty_'.$t);
  exec('cp -R '.$path_phpsrc.$ret[1].' '.$backup_dir.'/'.$backup_name.'/phpsrc_'.$t);
 }
 die('Data seccesfully wrote to backup directory');
}elseif(isset($_POST['restore']) && isset($_POST['path']) && !empty($_POST['path'])){
 if(!is_dir($_POST['path']) || !is_dir($_POST['path'].'/phpsrc_'.$_POST['time']) || !is_dir($_POST['path'].'/3rdparty_'.$_POST['time'])){
  die('Data could not be restored because eighter Backup Path was not given OR the subdirectories (3rdparty phpsrc) do not exist in given path');
 }
 exec('cp -Rf '.$_POST['path'].'/phpsrc_'.$_POST['time'].'/* '.$path_phpsrc);
 exec('cp -Rf '.$_POST['path'].'/3rdparty_'.$_POST['time'].'/* '.$path_3rdparty);
 die('Data succesfully restored');

}elseif(isset($_SESSION['appl.cfg']) && isset($_SESSION['appl.dir'])){
 exec('mkdir '.$path_3rdparty.'/'.$_SESSION['appl.dir']);
 exec('mkdir '.$path_phpsrc.'/'.$_SESSION['appl.dir']);
 $fp = fopen($path_3rdparty.'/'.$_SESSION['appl.dir'].'/application.cfg','w');
 fwrite($fp,$_SESSION['appl.cfg']);
 fclose($fp);
 foreach($_SESSION['appl.att'] as $wert){
  $fp = fopen($wert['path'],'w');
  fwrite($fp,$wert['content']);
  fclose($fp);
 }
 unset($_SESSION);
 session_destroy();
 echo '<a href="https://'.$_SERVER['SERVER_ADDR'].':5001/webman/index.cgi">Operations Successfulls done return</a>';
 exit;

}else{
?>
 <html>
 <head>
 <title>3rd Party Application Remover</title>
 </head>
 <body>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
 <?php
 /**
  * Build up a table with checkboxes and names of the installed application
  */
 echo '<table border="1">';
 foreach ($appl_names as $wert){
  echo '<tr><td><input type="checkbox" name="del[]" value="'.$wert.'" /></td><td><input disabled="disabled" type="text" value="'.$wert.'" /></td></tr>';
 }
 echo '<tr colspan="4" style="text-align:center;"><td><input type="submit" name="delete" value="Löschen" /></td>';
 echo '<td><input type="reset" value="Eingaben löschen" /></td></tr></table>';
 ?>
 </form>
 <?php
 /**
  * Form for adding a new application by user
  */
 ?>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data">
 <table border="1">
 <th bgcolor="Teal">
 <tr><td colspan="10">Create a 3rdParty-Application for Diskstation</td></tr>
 </th>
 <tr>
 <td>Text for the Link</td><td><input type="text" name="Linktext" /></td>
 <td>Description for Tooltip</td><td><input type="text" name="Description" /></td>
 </tr>
 <tr>
 <td>Application Directory</td><td><input type="text" name="Dir" /></td>
 </tr>
 <tr>
 <td>Application Type</td><td><select name="type">
 <option value="embedded" selected="selected">Embedded</option>
 <option value="standalone">Standalone</option>
 </select></td><td>Filename</td><td><input type="text" name="fname" /></td>
 </tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr><td><input type="file" name="file[]" /></td></tr>
 <tr>
 <td colspan="20"><textarea name="file_content" rows="40" cols="80"></textarea></td>
 </tr>
 <tr>
 <td><input type="submit" name="senden" value="Create" /></td><td><input type="reset" value="Reset Form" /></td>
 </tr>
 </table>
 </form>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
 <select name="time">
 <?php
 $path = $backup_dir.'/'.$backup_name;
 $dh = opendir($path);
 while(($res=readdir($dh))!==false){
  if($res != '.' && $res != '..' && is_dir($path.'/'.$res)){
   $t = substr($res,strpos($res,'_')+1);
   $arr[] = $t;
  }
}
$arr = array_unique($arr);
sort($arr);
foreach($arr as $wert){
 if(!empty($wert)){
   echo '<option value="'.$wert.'">'.date('d.m.y H:i:s',$wert).'</option>';
 }
}
?>
</select>
<input type="text" name="path" />
<input type="submit" name="backup" value="Backup" />  <input type="submit" name="restore" value="Restore" />
 </form>
 </body>
 </html>
<?php
}
?>
Gruss

tobi
 

Anhänge

  • manager.txt
    8 KB · Aufrufe: 20
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
sorry tobi,

das /tmp-Verzeichnis ist ein RAM-Filesystem. Besser ist es, auf das /volume1/tmp zu sichern.

itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Danke für deinen Tipp itari. Habe es bei meinem obigen Post angepasst und auch die neue Datei mit dem Quelltext angeängt.

Gruss und gut Nacht

tobi
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
itari hat mir das Formular mal ein bisschen schöner gestaltet (danke). Seine Anpassungen habe ich mit meiner aktuellen Version des 3rd Party Managers zusammengefügt.
Letzte Änderungen:
Backup Pfad über zwei Config Vars einstellbar
Pfadangabe wird beim Restore nicht mehr vom User abgefragt

@itari
Du hast mir noch einen ziemlich gemeinen Fehler eingebaut, der nicht zum Tragen kam weil du dabei einen Fehler gemacht hast ;)
PHP:
while(($res=readdir($dh))!==false){
  if($res != '.' && $res != '..' && is_dir($path_3rdparty.'/'.$res)){
   $appl_names[] = $res; $appl_name=natcasesort($appl_names);
  }
}
Zum Glück hast du deine Var (absichtlich oder nicht) anders genannt als meine die das Script benötigt (meine heisst $appl_names). Hättest du den Namen gleich geschrieben, hätte mir der Rückgabewert von natcasesort (welches ein Boolean ist) den Array überschrieben. Ausserdem macht die Sortierfunktion ausserhalb der Schleife mehr Sinn :D

Die restlichen TODOs bleiben noch bestehen, aber das Wochenende kommt ja bald :D
PHP:
<?php
ini_set('session.use_cookies','0');
session_start();

$appl_names = array();
// KEINE abschliessenden / bei den Verzeichnissen!!!
$path_3rdparty = '/usr/syno/synoman/webman/3rdparty';
$path_phpsrc = '/usr/syno/synoman/phpsrc';
$backup_dir = '/volume1/tmp';
$backup_name = 'backupSynology';

$dh = opendir($path_3rdparty);
while(($res=readdir($dh))!==false){
  if($res != '.' && $res != '..' && is_dir($path_3rdparty.'/'.$res)){
   $appl_names[] = $res;
  }
}
natcasesort($appl_names);

if(isset($_POST['delete']) && isset($_POST['del']) && count($_POST['del']) > 0){
 foreach ($_POST['del'] as $wert){
  (file_exists($path_3rdparty.'/'.$wert.'/application.cfg') ? $res=file_get_contents($path_3rdparty.'/'.$wert.'/application.cfg') :$res=0);
 if($res===0){
   continue;
  }
  preg_match('/path.*?=.*?\/phpsrc(\/.*?)\/.*?\.[^\s]*/i',$res,$ret);
  $tt = array();
  exec('rm -r '.$path_3rdparty.'/'.$wert,$tt);
  if(isset($ret[1]) && is_dir($path_phpsrc.$ret[1])){
   exec('rm -r '.$path_phpsrc.$ret[1],$tt);
  }
  if(count($tt) == 0){
   echo 'Erweiterung wurde entfernt';
  }else{
   echo '<pre>'.implode("\r\n",$tt).'</pre>';
  }
  exit;
 }
}elseif(isset($_POST['senden']) && !empty($_POST['Linktext']) && !empty($_POST['Description']) && !empty($_POST['Dir']) && !

empty($_POST['type']) && !empty($_POST['fname'])){
 $att = array();
 $strr = '<strong>Please check the data below carefully as after your confirmation application directories will be created with the parameters given<br />*** No operation will be executed <u>before</u> you confirm by clicking below ***</strong>';
 $strr .= '<br /><br />First the content of <strong>application.cfg</strong> that will be created in <strong>'.$path_3rdparty.'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'</strong><br />';
 $str = '';
 $str .= 'text = '.$_POST['Linktext']."\r\n";
 $str .= 'description = '.$_POST['Description']."\r\n";
 $str .= 'type = ';
 ($_POST['type'] == 'embedded') ? $str .= 'embedded' : $str .= 'standalone';
 $str .= "\r\n";
 $str .= 'path = /phpsrc/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['fname']))."\r\n";
 $_SESSION['appl.cfg'] = $str;
 $_SESSION['appl.dir'] = preg_replace('/\s+|\/+/','',strtolower($_POST['Dir']));

 for($i=0;$i<count($_FILES['file']['name']);$i++){
  if($_FILES['file']['name'][$i] == ''){
   continue;
  }
  $f = file_get_contents($_FILES['file']['tmp_name'][$i]);
  $att[] = array('path'=>$path_phpsrc.'/'.$_SESSION['appl.dir'].'/'.$_FILES['file']['name'][$i],'content'=>$f);
 }
 if(isset($_POST['file_content']) && trim($_POST['file_content']) != ''){
  $att[] = array('path'=>$path_phpsrc.'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['Dir'])).'/'.preg_replace('/\s+|\/+/','',strtolower($_POST['fname'])),'content'=>$_POST['file_content']);
 }
 $_SESSION['appl.att'] = $att;

 echo $strr;
 echo '<pre>'.$str.'</pre>';
 echo '<br />';
 echo 'The following files from your upload will be created:<br /><br />';
 foreach($_SESSION['appl.att'] as $wert){
  echo '<strong>'.$wert['path'].'</strong><br />';
 }
 echo '<br />By clicking <a href="'.$_SERVER['PHP_SELF'].'?'.strip_tags(SID).'">this link</a> all the necessary operation will be written to disk!!!<br />You can abort the operation by <a href="https://'.$_SERVER['SERVER_ADDR'].':5001/webman/index.cgi">clicking this link</a>';
}elseif(isset($_SESSION['appl.cfg']) && isset($_SESSION['appl.dir'])){
 exec('mkdir '.$path_3rdparty.'/'.$_SESSION['appl.dir']);
 exec('mkdir '.$path_phpsrc.'/'.$_SESSION['appl.dir']);
 $fp = fopen($path_3rdparty.'/'.$_SESSION['appl.dir'].'/application.cfg','w');
 fwrite($fp,$_SESSION['appl.cfg']);
 fclose($fp);

 foreach($_SESSION['appl.att'] as $wert){
  $fp = fopen($wert['path'],'w');
  fwrite($fp,$wert['content']);
  fclose($fp);
 }
 unset($_SESSION);
 session_destroy();
 echo '<a href="https://'.$_SERVER['SERVER_ADDR'].':5001/webman/index.cgi">Operations Successfulls done return</a>';
 exit;
}elseif(isset($_POST['backup'])){
 if(!is_dir($backup_dir.'/'.$backup_name)){
  mkdir($backup_dir.'/'.$backup_name);
 }
 $t = time();
 mkdir($backup_dir.'/'.$backup_name.'/3rdparty_'.$t);
 mkdir($backup_dir.'/'.$backup_name.'/phpsrc_'.$t);
 foreach($appl_names as $wert){
  (file_exists($path_3rdparty.'/'.$wert.'/application.cfg') ? $res=file_get_contents($path_3rdparty.'/'.$wert.'/application.cfg') :$res=0);
 if($res===0){
   continue;
  }
  preg_match('/path.*?=.*?\/phpsrc(\/.*?)\/.*?\.[^\s]*/i',$res,$ret);
  exec('cp -R '.$path_3rdparty.'/'.$wert.' '.$backup_dir.'/'.$backup_name.'/3rdparty_'.$t);
  exec('cp -R '.$path_phpsrc.$ret[1].' '.$backup_dir.'/'.$backup_name.'/phpsrc_'.$t);
 }
 die('Data seccesfully wrote to backup directory');
}elseif(isset($_POST['restore']) && isset($_POST['time']) && !empty($_POST['time'])){
 if(!is_dir($backup_dir.'/'.$backup_name.'/3rdparty_'.$_POST['time']) || !is_dir($backup_dir.'/'.$backup_name.'/phpsrc_'.$_POST['time'])){
  die('Data could not be restored because eighter Backup Path was not given OR the subdirectories (3rdparty phpsrc) do not exist in given path');
 }
 exec('cp -Rf '.$backup_dir.'/'.$backup_name.'/phpsrc_'.$_POST['time'].'/* '.$path_phpsrc);
 exec('cp -Rf '.$backup_dir.'/'.$backup_name.'/3rdparty_'.$_POST['time'].'/* '.$path_3rdparty);
 die('Data succesfully restored');
}else{
?>
 <html>
 <head>
 <title>3rd Party Application Remover</title>
 <style>body,input,textarea,td,option,select{font:11px Verdana}fieldset{border:1px solid #bbb}</style>
 </head>
 <body>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
 <fieldset><legend>installed 3rd-party-applications / remover</legend><table border="0"><tr>
 <?php
 $ii=0;
 foreach ($appl_names as $wert){
  echo '<td width="120px"><input type="checkbox" name="del[]" value="'.$wert.'" />'.$wert.'</td><td>';
  if (++$ii % 7 == 0) echo '</td></tr><tr>';
 }
 ?>
 </tr></table>
 <input style="margin-left:150px;margin-top:5px;" type="reset" value="reset form" />
 <input style="margin-left:320px" type="submit" name="delete" value="remove 3rd-party-apps" />
 </fieldset></form>
 <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data">
 <fieldset><legend>create 3rd-party-application</legend>
 <span style="padding-right:53px">text for the link:</span> <input size="90" type="text" name="Linktext" /><br/>
 <span style="padding-right:20px">description for tooltip:</span> <input size="90" type="text" name="Description" /><br/>
 <span style="padding-right:25px">application directory:</span> <input size="90" type="text" name="Dir" /><br/>
 <span style="padding-right:51px">application type:</span> <select name="type">
 <option value="embedded" selected="selected">embedded</option>
 <option value="popup">popup</option></select><br/>
 <span style="padding-right:96px">filename:</span><input input size="90" type="text" name="fname" /><br/>
 <span style="padding-right:86px">upload file:</span><input size=89 type="file" name="file[]" /><br/>
 <span style="padding-right:86px">upload file:</span><input size=89 type="file" name="file[]" /><br/>
 <span style="padding-right:86px">upload file:</span><input size=89 type="file" name="file[]" /><br/>
 <span style="padding-right:86px">upload file:</span><input size=89 type="file" name="file[]" /><br/>
 <span style="padding-right:86px">upload file:</span><input size=89 type="file" name="file[]" /><br/>
 <span style="padding-right:83px">file content:</span><textarea name="file_content" rows="10" cols="87"></textarea><br/>
 <input style="margin-left:150px" type="reset" value="reset form" /><input style="margin-left:330px" type="submit" name="senden" value="create 3rd-party-apps" />
 </fieldset>
 <fieldset><legend>Backup and Restore 3rd Party Applications</legend>
 <fieldset><legend>Backup 3rd Party Applications</legend>
 <input type="submit" name="backup" value="Create Backup" />
 </fieldset>
 <fieldset><legend>Restore 3rd Party Applications</legend>
 <span style="padding-right:20px">Select Date for restore</span><select name="time">
 <?php
 $path = $backup_dir.'/'.$backup_name;
 $dh = opendir($path);
 $arr = array();
 while(($res=readdir($dh))!==false){
  if($res != '.' && $res != '..' && is_dir($path.'/'.$res)){
   $t = substr($res,strpos($res,'_')+1);
   $arr[] =intval($t);
  }
}
$arr = array_unique($arr);
sort($arr);
foreach($arr as $wert){
 if(!empty($wert) && $wert != 0){
   echo '<option value="'.$wert.'">'.date('d.m.y H:i:s',$wert).'</option>';
 }
}
?>
</select>
<input type="submit" name="restore" value="Restore" />
</fieldset>
</fieldset>
 </form>
</body>
 </html>
<?php
}
?>

Gruss

tobi
 

Anhänge

  • manager.php.txt
    8,4 KB · Aufrufe: 50

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Zum Glück hast du deine Var (absichtlich oder nicht) anders genannt als meine die das Script benötigt (meine heisst $appl_names). Hättest du den Namen gleich geschrieben, hätte mir der Rückgabewert von natcasesort (welches ein Boolean ist) den Array überschrieben. Ausserdem macht die Sortierfunktion ausserhalb der Schleife mehr Sinn

Ist mir verrutscht; sollte 2 Zeilen tiefer sein. Aber da es ja gefunzt hatte, ist es mir nicht weiter aufgefallen.

Sorry ... ich geb mir das nächste Mal mehr Mühe, meine Fehler zu verstecken :D

Liebe Grüße
itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Aber da es ja gefunzt hatte, ist es mir nicht weiter aufgefallen.
Es hätte eigentlich uns beiden auffallen müssen, weil die Appls nicht alphabetisch sortiert waren ;)

Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Es hätte eigentlich uns beiden auffallen müssen, weil die Appls nicht alphabetisch sortiert waren ;)

Gruss

tobi

Bei mir waren sie sortiert und sind es noch - ich hab die Zeile noch nicht ersetzt. Der natcasesort() sortiert schon und das sogar ganz häufig :D. Ist halt nicht suboptimal, aber gehen tut es.

itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Der natcasesort() sortiert schon und das sogar ganz häufig
Das glaube ich dir auch, nur das wirkliche Problem ist der Rückgabewert von natcasesort(). Wie bei allen Array Sortierfunktionen in PHP wird eben nicht das sortierte Array sondern ein Boolean zurückgegeben
Bei mir waren sie sortiert und sind es noch - ich hab die Zeile noch nicht ersetzt.
Heisst das du hast die Zeile mit natcasesort() genau so drin? Weil dann ist die Reihenfolge so wie sie von readir() aus dem Verzeichnis gelesen wird. Da unten im Script auf $appl_names zugegriffen wird hast du garantiert ein unsortiertes Array verwendet. Und wenn du deine Var ebenfalls $appl_names genannt hättest, dann hätte sich PHP mit einer Fehlermeldung beschwert, weil ein foreach() auf einen Boolean kommt nicht gut an... :D

Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Das glaube ich dir auch, nur das wirkliche Problem ist der Rückgabewert von natcasesort(). Wie bei allen Array Sortierfunktionen in PHP wird eben nicht das sortierte Array sondern ein Boolean zurückgegeben

Ja - aber den benutze ich ja nicht weiter. Der natcasesort() sortiert inherent, d.h. er sortiert die Tabelle sowieso.

Heisst das du hast die Zeile mit natcasesort() genau so drin? Weil dann ist die Reihenfolge so wie sie von readir() aus dem Verzeichnis gelesen wird.

Nein, es wird ja bei jedem Schleifendurchgang der Array neu sortiert - halt ein wenig oft, aber eben trotzdem sortiert.

Da unten im Script auf $appl_names zugegriffen wird hast du garantiert ein unsortiertes Array verwendet. Und wenn du deine Var ebenfalls $appl_names genannt hättest, dann hätte sich PHP mit einer Fehlermeldung beschwert, weil ein foreach() auf einen Boolean kommt nicht gut an... :D

Hab ich aber nicht :D

Gruss

tobi

auch gruss zurück
itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Kleine Ergänzung

Wenn ihr gegen Ende des Codes bei diesen Zeilen
PHP:
$arr = array_unique($arr);
sort($arr);
foreach($arr as $wert){
folgendes anpasst, dann werden die vorhandenen Backups absteigend nach der Zeit sortiert (dann ist im Drop Down immer die aktuellste Version vorausgewählt)
PHP:
$arr = array_unique($arr);
rsort($arr);
foreach($arr as $wert){
Aufsteigend hat irgendwie keinen Sinn gemacht ;)

@itari
Jetzt habe ich es auch gerafft: Bei mir mussten die Appls ja auch korrekt sortiert sein. Ich habe ja dein sortiertes Array genommen bei der Ausgabe. Ich habe es nur nicht wirklich bemerkt, weil ich deine Änderung erst gar nicht bemerkt habe :D

Gruss

tobi
 

Trolli

Benutzer
Mitglied seit
12. Jul 2007
Beiträge
9.848
Punkte für Reaktionen
1
Punkte
0
Wenn ich ein abweichendes phpsrc-Verzeichnis angeben möchte - was muss ich dann alles ändern? Es scheint nicht damit getan zu sein, die erste Variable abzuändern.

Ausserdem fügt der Application Manager in der application.cfg bei jedem Zeilenende ein ^M ein.

Die neu erstellte .php Datei hat bei mir die Rechte 644 statt 755. Das kann natürlich auch eine Auswirkung des geänderten Verzeichnisses sein...
 

Selfcontrol

Benutzer
Mitglied seit
06. Aug 2008
Beiträge
53
Punkte für Reaktionen
0
Punkte
0
hallo ....
erstmal danke für die schönen spielzeuge :)

als 3rd-party einsteiger hab ich mich mal dran versucht ... meine erste erweiterung...
und eigentlich hat erstmal nichts geklappt , wildes rumprobieren und ein wenig gesunder menschenverstand hat dann doch zum erfolg geführt
--------------------------------------------------------------------------------------------------
> 1) File in .php umbenennen und nach /usr/syno/synoman/phpsrc/ kopieren
> 2) das Script aufrufen (z.B. https://IP_DER_DS:5001/phpsrc/manager.php)

es wird nur der Source angezeigt ....... aha , da war doch noch was

> vorbereitung auf 3rd-party nach itari`s anleitung

OK , da kommt dann schon mal die Eingabemaske
15604,1809orgjpgS0EAR.jpg


und da verließen sie mich dann , da half dann nur noch ausprobieren
wenn ihr das programmiert ist das meiste für euch selbsterklärend , aber andere können da nicht so viel mit anfangen

hier noch einmal ein Bild mit meinen Anmerkungen um das in meinen Augen ein wenig selbsterklärend zu machen



wenn ich dann auf "create" klicke und sehe das eine eingabe falsch ist und ich wieder zurückgehe sind alle bisherigen eingaben gelöscht (stell ich mich da zu doof an ?)

wenn ich auf "backup" klicke erscheint im neuen fenster "array(1) { [0]=> string(15) "3rdpartymanager" } " ???
das backup schein aber ausgeführt worden zu sein , es taucht unten jedenfalls ein Datum bei "restore" mit auf
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
@Selfcontrol,

Kurze Anmerkungen:
ich wieder zurückgehe sind alle bisherigen eingaben gelöscht

Zurückgehen ist was bei dir? Meinst das oben im Browser?

Das mit den 5 Upload-Files kommt daher, dass man hier im Forum nur maximal 5 Dateien als Dateianhang verschicken kann :)

Ansonsten finde ich die Anregungen interessant. Kannst das nicht versuchen einzubauen und dann zu veröffentlichen?

So schön und bequem der 3rd party manager auch ist, man sollte trotzdem mal eine 3rd-party-apps zu Fuss installieren, um dahinter zu kommen, was man wo alles machen muss.

Der Sinn zumindest meiner 3rs-party-apps ist es nicht nur, sich das Leben auf der DS leichter zu machen :D, sondern sich mit dem Skripten auseinander zu setzen und sich vielleicht dazu zu motivieren, selbst auch was zu skripten bzw. das Skripten zu erlernen. In meinen Augen wäre die DS auch ihr Geld wert, wenn es keinen Disk Station Manager gäbe. Die Skripte zeigen ja, dass man sich sowas locker selbst schreiben könnte und mit dem riesen Fundus durch das ipkg bzw. durch das Toolchain sind auch ausgefallenste Wünsche realisierbar. Das zeigen ja auch die vielen Beispiele und die Kreativität vieler Nutzer.

Selbstverständlich sind Kritik und Hinweise an den bestehenden Progs erlaubt; insofern finde ich es auch gut, dass du dazu was geschrieben hast.

itari
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
wenn ich dann auf "create" klicke und sehe das eine eingabe falsch ist und ich wieder zurückgehe sind alle bisherigen eingaben gelöscht (stell ich mich da zu doof an ?)
Die Sache mit den Eingaben bei Fehlern werde ich mal noch mittels einer Session speichern, damit man nicht wieder alles eingeben muss.
File in .php umbenennen und nach /usr/syno/synoman/phpsrc/ kopieren
Das habe ich ungeschrieben vorausgesetzt... ;)
wenn ich auf "backup" klicke erscheint im neuen fenster "array(1) { [0]=> string(15) "3rdpartymanager" } " ???
Bist du sicher, dass du die letzte Version des Codes verwendet hast (aus meinem letzten Post mit Quellcode hier)? Weil entweder kommt beim Backup eine Vollzugs-oder Fehlermeldung, aber imho kein var_dump().
Ausserdem fügt der Application Manager in der application.cfg bei jedem Zeilenende ein ^M ein.

Die neu erstellte .php Datei hat bei mir die Rechte 644 statt 755. Das kann natürlich auch eine Auswirkung des geänderten Verzeichnisses sein...
Da mit dem Zeilenende werde ich mal noch prüfen. Hatte bis jetzt keine Probleme damit. Die Sache mit den Rechten werde ich ebenfalls noch anpassen (werde einfach nach Erstellung der Appl ein chmod() drüber laufen lassen)

@Selfcontrol
Den Pfad des Backups werde ich im Formular auch mal noch anzeigen lassen, damit man sehen kann wo die Backups hingehen.

Gruss

tobi
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat