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"> <input type="checkbox" id="supprpkg" onclick="checkV();" /> Effacer les URLs des Paquets</p>
<p title="Affichera la page officiel des Paquets"> <input type="checkbox" id="conserv" onclick="checkV();" checked /> 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> <input type="checkbox" id="screen" onclick="checkV();" /> Efface les Screenshots</p>
<p> <input type="checkbox" id="log" onclick="checkV();" /> Efface les Desciptions & Changelogs</p>
<p> <input type="checkbox" id="reinit" onclick="checkV();" /> /!\ 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 & 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 ^^
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.