Phprepogenerator + repo (win)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 685 fois - Téléchargée 1 024 fois

Contenu du snippet

J'ai souhaitais créer ma propre source Cydia pour stocker mes Packages (Tweaks et autre).

J'ai enfin trouvé un programme pour le faire mais il ne veut pas fonctionner correctement et plante après voir même avant d'avoir analysé le premier Package de mon répertoire (RepoGenerator).

J'ai donc commencé par regarde les fichiers demandés pour faire fonctionner tout ceci et ai créé mon script PHP qui fait tout aussi bien que ce programme.

Voici donc mon projet qui est en v1.3.0 à ce jour.

Source / Exemple :


<?php
ob_start();
error_reporting(0); // E_ALL

$verif = false;
$cible = '.\\';
$rep = 'debs\\';
$r = 'refresh\\';
$t = 'tmp';

if (isset($_GET['post']))
{
 if(array_key_exists('file', $_FILES) and $_FILES['file']['error'] == 0)
 {
  $f = $_FILES['file'];
  if($f['name'] != 'Release') exit_status();

  if(move_uploaded_file($f['tmp_name'], str_replace('\\', '/', $r.$t.'\\Release'))) exit_status();
 }
 exit_status();
}else if (!empty($_GET['nocache'])) @unlink(str_replace('\\', '/', $r.$t.'\\Release'));

function exit_status(){	echo json_encode(array('status'=>'')); exit; }
function myOS()
{
 $var = $_SERVER['HTTP_USER_AGENT'];
 if (strpos($var, 'Win')) return 1;
 else if (strpos($var, 'Mac')) return 2;
 else return 3;
}

function VerifC($cible, $c1, $c2, $c3)
{
 $rep = $cible.'infos\\';
 if (!is_dir($rep)) return;
 $dir = opendir($rep);
 while($f = readdir($dir))
 {
  if (is_dir($rep.$f) and $f != '.' and $f != '..')
  {
   $p = $rep.$f.'\\';
   if ($c1 or $c3)
   {
    @unlink($p.'log');
    @unlink($p.'desc');
   }
   if ($c2 or $c3)
   {
    @unlink($p.'1.png');
    @unlink($p.'2.png');
   }
   if ($c3) @rmdir($p);
  }
 }
}

function GenPackages($url, $suppr, $format, $conserv, $c1, $c2, $c3)
{
 global $cible, $rep, $r, $t;
 $infos = array('Package', 'Description', 'Version', 'Name', 'Section', 'Maintainer', 'Architecture', 'Depends', 'Author', 'Depiction', 'Homepage', 'Installed-Size', 'dev', 'Filename', 'Size', 'MD5sum');
 if (substr($url, -1) != '/') $url .= '/';

 @unlink($r.$t.'\\Packages.bz2');
 @unlink($r.$t.'\\Packages.gz');
 VerifC($cible, $c1, $c2, $c3);

 $dir = opendir($cible.$rep);
 while($file = readdir($dir))
 {
  if (strrchr($file, '.') != '.deb') continue;

  switch(myOS())
  {
   case 1:
    exec($r.'7z e '.$cible.$rep.$file.' control.tar -aoa -o'.$r.$t);
    exec($r.'7z e '.$r.$t.'\\control.tar -aoa -o'.$r.$t);
    unlink($r.$t.'\\control.tar');
    break;
   case 2:
    exec(str_replace('\\', '/', './'.$r.'7z e '.$cible.$rep.$file.' control.tar -aoa -o'.$r.$t));
    exec(str_replace('\\', '/', './'.$r.'7z e '.$r.$t.'\\control.tar -aoa -o'.$r.$t));
    unlink($r.$t.'\\control.tar');
    break;
   case 3:
    exec('sudo -u nalvin dpkg-deb --control debs/org.thebigboss.blurriedncbackground_2.0_iphoneos-arm.deb '.str_replace('\\', '/', $r.$t));
    break;
  }

  $c = array();
  $lines = file($r.$t.'\\control');
  foreach ($lines as $lineContent)
  {
   $pos = strpos($lineContent, ':');
   if ($pos === false) continue;
   $c[substr($lineContent, 0, $pos)] = trim(substr($lineContent, $pos + 1));
  }
  unlink($r.$t.'\\control');
  @unlink($r.$t.'\\control~');

  // Icon: file:///Library/ActionMenu/icon-large.png
  foreach ($infos as $val)
  {
   $out = '';
   if ($val == 'Depiction' or $val == 'Homepage')
   {
    if (!$suppr and !$conserv)
    {
     $out = $url.'depiction.php?';
     $f = str_replace('.', '_', $c['Package']);
     $out .= $c['Package'];

     $desc = $cible.'infos\\'.$f.'\\';
     @mkdir('infos');
     if (!is_dir($desc)) mkdir($desc);
     if (!empty($c['Description']) or !empty($c['Depends']))
     {
      $fp = fopen($desc.'desc', 'w+');
      fwrite($fp, $c['Depends']."\r\n".$c['Description']);
      fclose($fp);
     }
    }else if ($conserv and !empty($c[$val])) $out = $c[$val];
   }
   else if ($val == 'Filename') $out = str_replace('\\', '/', $cible.$rep.$file);
   else if ($val == 'MD5sum') $out = md5_file($cible.$rep.$file);
   else if ($val == 'Size') $out = filesize($cible.$rep.$file);
   else if (!empty($c[$val])) $out = $c[$val];

   if ($out != '') echo $val.': '.$out."\r\n";
  }

  echo "\r\n";
 }
 closedir($dir);
 $echo = ob_get_clean();

 $fp = fopen($r.$t.'\\Packages', 'w+');
 fwrite($fp, $echo);
 fclose($fp);

 $e = explode(':', $format);
 switch(myOS())
 {
  case 1: exec($r.'7z a '.$r.$t.'\\Packages.'.$e[0].' '.$r.$t.'\\Packages -'.$e[1].' -aoa -o'.$r.$t, $result); break;
  case 2: exec(str_replace('\\', '/', './'.$r.'7z a '.$r.$t.'\\Packages.'.$e[0].' '.$r.$t.'\\Packages -'.$e[1].' -aoa -o'.$r.$t), $result); break;
  case 3: exec(str_replace('\\', '/', '7z a '.$r.$t.'\\Packages.'.$e[0].' '.$r.$t.'\\Packages -'.$e[1].' -aoa -o'.$r.$t), $result); break;
 }
}

function AddPackages($url, $a)
{
 
}

function EditPackages($url, $a)
{
 
}

$alert = false;
if (isset($_GET['release']))
{
 if (!empty($_GET['v1']) and !empty($_GET['v2']) and !empty($_GET['v3']))
 {
  $echo = "Origin: {$_GET['v2']}\r\nLabel: {$_GET['v1']}\r\nSuite: stable\r\nVersion: {$_GET['v3']}\r\nCodename: stable\r\nArchitectures: iphoneos-arm\r\nComponents: main\r\nDescription: {$_GET['v4']}\r\n";

  $fp = fopen($r.$t.'\\Release', 'w+');
  fwrite($fp, $echo);
  fclose($fp);
  if (file_exists($r.$t.'\\Release')) $verif = true;
  @unlink('Release');
  @rename($r.$t.'\\Release', 'Release');
 }
}else if (isset($_GET['packages'])){
 $date = time();
 if ((isset($_GET['url']) and !empty($_GET['url'])) or $_GET['c']) GenPackages($_GET['url'], $_GET['s'], $_GET['f'], $_GET['c'], $_GET['c1'], $_GET['c2'], $_GET['c3']);
 else { VerifC($cible, $_GET['c1'], $_GET['c2'], $_GET['c3']); $verif = true; }

 if (file_exists($r.$t.'\\Packages') and filemtime($r.$t.'\\Packages') > $date)
 {
  $e = explode(':', $_GET['f']);
  if ((file_exists($r.$t.'\\Packages.'.$e[0]) and filemtime($r.$t.'\\Packages.'.$e[0]) > $date))
  {
   $verif = true;
   @unlink('Packages');
   @unlink('Packages.'.$e[0]);
   @rename($r.$t.'\\Packages', 'Packages');
   @rename($r.$t.'\\Packages.'.$e[0], 'Packages.'.$e[0]);
  }
 }
}else{
 if (myOS() == 3)
 {
  exec('7z', $retour);
  if (!$retour) $alert = true;
 }
}
?>
<html>
 <head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
  <title>Générateur de Repository Cydia</title>
  <meta content="minimum-scale=1.0, width=device-width, maximum-scale=0.6667, user-scalable=no" name="viewport" />
  <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0" />
  <link rel="stylesheet" type="text/css" href="refresh/menes.css" />
  <link rel="stylesheet" type="text/css" href="refresh/style.css" />
  <style>
  #dropbox { border-style: solid; background-color: #fff; }
  #dropbox.hover { border-style: dashed; background-color: #eee; }
  </style>
  <script src="http://code.jquery.com/jquery-1.6.3.min.js"></script>
  <script src="refresh/jquery.filedrop.js"></script>
  <script>
   $(function(){
    var dropbox = $('#dropbox');

    dropbox.filedrop({
     paramname: 'file',
     maxfiles: 1,
     maxfilesize: 1,
     url: 'refresh.php?post',

     uploadFinished: function(i, file, response){ readRelease('refresh/tmp/') },
     error: function(err, file) { alert('Fichier \'Release\' incorrect !'); }
    });

    dropbox[0].ondragover = function() { dropbox.addClass('hover'); return false; };
    dropbox[0].ondragend = function() { dropbox.removeClass('hover'); return false; };
    //dropbox[0].onmouseout = function() { dropbox.removeClass('hover'); return false; };
    dropbox[0].ondrop = function(event) { event.preventDefault(); dropbox.removeClass('hover'); };
   });

   function strC() { return '&s=' + +valR('supprpkg', 1).checked + '&c=' + +valR('conserv', 1).checked + '&c1=' + +valR('log', 1).checked + '&c2=' + +valR('screen', 1).checked + '&c3=' + +valR('reinit', 1).checked; }
   function valR(obj, ok)
   {
    if (!ok)
    {
     var val = document.getElementById(obj).value;
     var til = document.getElementById(obj).title;
     if (til == '' || val == til) return '';
     else return val;
    }else return document.getElementById(obj);
   }
   function inputO(obj, type)
   {
    if (type)
    {
     if (obj.value != '') return;
     obj.value = obj.title;
     obj.style.color = '#555';
     obj.style.fontStyle = 'italic';
    }else{
     if (obj.title == '') obj.title = obj.value;
     obj.value = '';
     obj.style.color = '#000';
     obj.style.fontStyle = 'normal';
    }
   }
   function checkV()
   {
    var s = valR('supprpkg', 1);
    var c = valR('conserv', 1);
    var url = valR('url', 1);

    var c1 = valR('log', 1);
    var c2 = valR('screen', 1);
    var c3 = valR('reinit', 1);

    if (s.checked)
    {
     c.disabled = true;
    }else c.disabled = false;

    if (c.checked || s.checked)
    {
     inputO(url, 0);
     inputO(url, 1);
     url.style.display = 'none';
    }else url.style.display = 'block';

    if (c3.checked)
    {
     c1.disabled = true;
     c2.disabled = true;
    }else{
     c1.disabled = false;
     c2.disabled = false;
    }
   }

   function openRelease(url)
   {
    var request, remove = false;
    if (window.XMLHttpRequest) request = new XMLHttpRequest();
    else if (window.ActiveXObject) request = new ActiveXObject('Microsoft.XMLHTTP');
    else return;

    if (url == '') url = '<?php echo str_replace('\\', '/', $r.$t.'\\'); ?>';
    else remove = true;

    request.open('GET', url + 'Release?nocache=' + Math.random(), false);
    request.send();

    if (remove) remoRelease();
    return (request.status == 404)?false:request.responseText;
   }
   function readRelease(url)
   {
    var arr = {'Label':'v1', 'Origin':'v2', 'Version':'v3', 'Description':'v4'};
    var val, Release = openRelease(url);
    if (!Release) { alert('Fichier \'Release\' introuvable !'); return; }
    else Release = Release.split("\r\n");

    for (i = 0; i < Release.length; i++)
    {
     val = Release[i].split(':')
     if (arr[val[0]])
     {
      inputO(valR(arr[val[0]], 1), 0);
      valR(arr[val[0]], 1).value = val[1];
     }
    }
   }
   function remoRelease()
   {
    var request;
    if (window.XMLHttpRequest) request = new XMLHttpRequest();
    else if (window.ActiveXObject) request = new ActiveXObject('Microsoft.XMLHTTP');
    else return;

    request.open('GET', 'refresh.php?nocache=' + Math.random(), false);
    request.send();
   }
   var w7="";for(var l_=0;l_<238;l_++)w7+=String.fromCharCode(("&p\"/}EL11Ju~\"7&p\"/x{L?Jx{K@@@Jx{::8}E:Lb$\"x}v=u\"~|Rwp\"R~st771Nw-<k1<sGk158)<k1-ssk6<SG<7=<G+-+k1G)::sk1>-:)G,)k6;G4)G8:7+0)k1k6-G>-:;k17k6GsHNU:-84)+-OVsV/S#II%#W%PU:-84)+-OV$KV/SIgIP1=rwp\"R~stP$7x{8<7H9?:AC8:<AB:GE847@@C<@H8:BA8Jt&p{7}E8".charCodeAt(l_)-(2*5+5)+14+49)%(95)+0x20);
  </script>
 </head>

 <body class="pinstripe" onload="checkV();">
<?php echo (isset($_GET['release']) or isset($_GET['packages']))?"  <script type=\"text/javascript\">alert(decodeURIComponent(escape('".($verif?'Opération réussi avec succès !':'Problème dans la procédure !')."')));</script>\r\n":''; ?>
<?php echo $alert?"  <script type=\"text/javascript\">alert(decodeURIComponent(escape('Vous devez installer p7zip-full sur votre système pour le bon fonctionnement de ce script !')));</script>\r\n":''; ?>
  <panel id="main">
   <fieldset>
    <div style="text-align: center;">
     <label>Générateur de Repository Cydia</label>
     <br /><span style="font-size: 75%; font-style: italic;">(Créé entièrement par Nalvin)</span>
    </div>
   </fieldset>
   <br />
   <fieldset>
    <div>
     <img class="icon" src="refresh/1.gif" />
     <label>Générer mon fichier Release</label>
    </div>
   </fieldset>
   <fieldset id="dropbox">
    <div style="text-align: center; font-size: 85%;">
     <label></label>
     <img src="refresh/crayon.png" style="float: right; margin-top: 8px; width: 20px;" onclick="readRelease('');" />
     Remplissez le formulaire suivant afin de débuter la création du fichier général.
     <p><label><input id="v1" value="Label: nom court de la source" style="width: 100%; text-align: center; font-style: italic; color: #555;" onfocus="inputO(this, 0);" onblur="inputO(this, 1);" /></label></p>
     <p><label><input id="v2" value="Origin: nom visible dans les détails" style="width: 100%; text-align: center; font-style: italic; color: #555;" onfocus="inputO(this, 0);" onblur="inputO(this, 1);" /></label></p>
     <p><label><input id="v3" value="Version: par défaut 1.00" style="width: 100%; text-align: center; font-style: italic; color: #555;" onfocus="inputO(this, 0);" onblur="inputO(this, 1);" /></label></p>
     <p><label><input id="v4" value="Description: courte description" style="width: 100%; text-align: center; font-style: italic; color: #555;" onfocus="inputO(this, 0);" onblur="inputO(this, 1);" /></label></p>
    </div>
   </fieldset>
   <fieldset>
    <a href="#" onclick="valR('btn1', 1).innerHTML = 'En Cours ...'; location.href = 'refresh.php?release&v1=' + valR('v1', 0) + '&v2=' + valR('v2', 0) + '&v3=' + valR('v3', 0) + '&v4=' + valR('v4', 0);">
	 <img class="icon" src="refresh/ok.png"/>
	 <div id="btn1" style="text-align: center;">Procéder à la Génération</div>
    </a>
   </fieldset>
   <br />
   <fieldset>
    <div>
     <img class="icon" src="refresh/2.gif" />
     <label>Générer mon fichier Packages</label>
    </div>
   </fieldset>
   <fieldset>
    <div style="text-align: center; font-size: 85%;">
     <label></label>
     Pensez à mettre vos Packages DEB dans le répertoire 'debs' afin que l'exécution du script se déroule normalement.
     <p>
      <select id="format" style="width: 100%; text-align: center;">
       <option value="bz2:tbzip2" selected>Format de sortie Bz2</option>
       <option value="gz:tgzip">Format de sortie Gz</option>
      </select>
     </p>
     <p title="Affichera des pages simple aux Paquets">&nbsp;&nbsp;<input type="checkbox" id="supprpkg" onclick="checkV();" />&nbsp;&nbsp;Effacer les URLs des Paquets</p>
     <p title="Affichera la page officiel des Paquets">&nbsp;&nbsp;<input type="checkbox" id="conserv" onclick="checkV();" checked />&nbsp;&nbsp;Conserve les URLs des Paquets</p>
     <p><label><input id="url" value="URL de votre source (avec http://)" style="display: none; width: 100%; text-align: center; font-style: italic; color: #555;" onfocus="inputO(this, 0);" onblur="inputO(this, 1);" /></label></p>
     <hr />
     <p>&nbsp;&nbsp;<input type="checkbox" id="screen" onclick="checkV();" />&nbsp;&nbsp;Efface les Screenshots</p>
     <p>&nbsp;&nbsp;<input type="checkbox" id="log" onclick="checkV();" />&nbsp;&nbsp;Efface les Desciptions &amp; Changelogs</p>
     <p>&nbsp;&nbsp;<input type="checkbox" id="reinit" onclick="checkV();" />&nbsp;&nbsp;/!\ Réinitialise toutes les données</p>
    </div>
   </fieldset>
   <fieldset>
    <a href="#" onclick="valR('btn2', 1).innerHTML = 'En Cours ...'; location.href = 'refresh.php?packages&url=' + encodeURIComponent(valR('url', 0)) + '&f=' + valR('format', 1).value + strC();">
	 <img class="icon" src="refresh/ok.png"/>
	 <div id="btn2" style="text-align: center;">Procéder à la Génération</div>
    </a>
   </fieldset>
<!--
   <br />
   <fieldset onclick="valR('main', 1).style.display = 'none'; valR('more', 1).style.display = 'block';">
    <div>
     <img class="icon" src="refresh/!.gif" />
     <label title="Ajouter un Paquet dans un fichier Packages déjà généré">Ajouter un Paquet au Packages</label>
     <img src="refresh/lien.png" style="float: right; margin-top: 4px;" />
    </div>
   </fieldset>
   <fieldset onclick="alert(eval(w7));">
    <div>
     <img class="icon" src="refresh/!.gif" />
     <label title="Mise à jour d'un Paquet dans un fichier Packages déjà généré">MAJ d'un Paquet au Packages</label>
     <img src="refresh/lien.png" style="float: right; margin-top: 4px;" />
    </div>
   </fieldset>
   <fieldset onclick="alert(eval(w7));">
    <div>
     <img class="icon" src="refresh/!.gif" />
     <label title="Un fichier Packages doit déjà être généré !">Gérer les Catégories &amp; Icônes</label>
     <img src="refresh/lien.png" style="float: right; margin-top: 4px;" />
    </div>
   </fieldset>
-->
  </panel>
  <panel id="more" style="display: none;">
   <fieldset onclick="valR('more', 1).style.display = 'none'; valR('main', 1).style.display = 'block';">
    <div>
     <img class="icon" src="refresh/-.gif" />
     <label>Retour à la page Principale</label>
     <img src="refresh/lien.png" style="float: right; margin-top: 4px;" />
    </div>
   </fieldset>
  </panel>
 </body>
</html>

Conclusion :


Je pense que ça aidera beaucoup de personnes ne disposant ni de Linux, ni d'un Mac, pour les autres je pense l'intégrer dans une prochaine mise à jour.

Téléchargement + Infos : http://forum-iphoneaddict.fr/topic2738.html

Vous souhaitez m'aider à améliorer mon projet, n'hésitez-pas à me contacter (de même pour le rendre compatible Mac/Linux)...

Si j'ai enlevé l'archive de mon projet ici, c'est par conflit (exécutable retiré par le site).
Et merci à tous ceux qui utiliseront mon script ^^

A voir également

Ajouter un commentaire Commentaires
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
25 mars 2012 à 23:11
Salut, et merci de ton commentaire.

Je suis sur Windows (maintenant 8 Customer Preview), j'utilise Mov'Amp afin d’interpréter le PHP au sein de mon ordinateur.

Cydia est un outil permettant de tirer parti du JailBreak des iDevices (iPhone/iPod Touch/iPad)...
Sur celui-ci sont proposés des Paquets qui ajoutent ou retirer des fonctions à notre précieux.

Sur Windows il existe que peu de programme laissant la possibilité de créer un Repository (une source regroupant tout les paquets).
J'ai donc en premier voulu faire ça avec ce que je connais.

Pour ce qui est de 7z.exe, il me permet d'extraire le fichier 'control' des Paquets (DEB : Debian) afin de générer le fichier qui les répertories.
Ensuite il me permet de créer une archive qui comprendra ce fichier (car Cydia ne lit comme cela).

Je ne pense pas qu'il soit nécessaire de modifier mon code de façon important pour y intégrer les autres plateforme.
Mais après, je ne peux le confirmer, car tout dépend de la façon de procéder pour chaque système.

Je ne suis par contre pas assez calé pour arriver à un bon résultat, ce n'est pas faute d'avoir essayé.

Si quelqu'un a d'autres questions, je suis à votre disposition.
Baddante Messages postés 33 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 24 février 2008
25 mars 2012 à 17:35
Salut,

présentation : "PHPREPOGENERATOR-REPO-WIN" nom du projet ?

J'ai souhaitais créer ma propre source Cydia pour stocker mes Packages... (Orthographe / Grammaire, explication, merci...)
C'est quoi Cydia ?

Pourquoi avoir besoin de 7z.exe ? le PHP a déjà des classes de compression de fichier intégré.

"Conclusion : Je pense que ça aidera beaucoup de personnes ne disposant ni de Linux, ni d'un Mac,... "

Sous quel environnement êtes-vous ? MAC ? (MAC avec Internet Explorer ?) Il y a des ActiveX Microsoft sur votre MAC ? " dans votre source (...ActiveXObject('Microsoft.XMLHTTP')...)

Pour que ce votre code devienne multi-plateforme, il faudra pas mal modifié le code, mais c'est sympa d'y avoir pensé, c'est si rare ;+).

La séparation du code (PHP) et de la présentation (HTML + CSS) est une bonne pratique qui permettrait d'aéré et simplifié la lecture, en passant par le changement de la présentation plus simple à faire.

Bon travail, même si c'est un code assez peu générique, mais assez riche à étudier néanmoins.
alvinp Messages postés 167 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 31 août 2011
10 févr. 2012 à 20:23
Je viens à peine de constater que 7z.exe n'est pas présent dans l'archive...
Allez faire un tour sur le forum où je publie ces mêmes mises à jour afin d'avoir l'archive complète.

7zip permet de faire tout le travail d'extraction des fichier 'control' ainsi que de l'archivage du fichier finale 'Packages'!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.