Вы здесь

использование python вместо php для создание info.xml

Всем доброго времени суток,

я думаю поднять apk репозиторий для внутреннего пользования.
на http://aptoide.com/server.html выложен php скрипт для создания info.xml
может будет у кого желание изобразить функционал на python?
держать php ради одного скрипта не хочется.

Неплохо бы сказать, что это вообще такое.

Не грусти, товарищ! Всё хорошо, beautiful good!

насколько я понимаю это оверлей для андроидофона.

Как Вадим правильно ответил - это оверлей для андроидных програм.
в деталях - приложения в андроиде мне хотелось бы ставить подряд из своей коллекции, вместо того что бы лазить по гугломаркету в поисках.
сам скрипт обходит поддиректории, вытаскивает инфу из apk файлов и складывает ее в xml файл.
Это скрипт потом отдается aptoid/apktor клиенту при подключении.
а учитывая то что перешиваю rom довольно часто - то хочется централизованного решения для себя.
про бэкап в гугле знаю, но не хочу, подумываю о полной отвязке телефона от гугла.



#!/usr/bin/php -q
<?
/*
 * Aptoide server generate script version 1.4
 */
/***************************************/
/*
 * Directory where apk's are stored
 * Configuration changes go here! 
 */
$DIR = "</your/repo/path/here/>";
$ICON_DIR_OUT = "icons/";</p>

<p>/****************************************/
$ICON_DIR = $DIR.$ICON_DIR_OUT;
$xml_path = $DIR."info.xml";</p>

<p>exec('rm ' . $DIR . '*.xml');
exec('rm -rf ' . $ICON_DIR);
exec('mkdir ' . $ICON_DIR);
exec('ls ' . $DIR, $dump);
$dom = new DomDocument("1.0","UTF-8");
$root = $dom->createElement('apklst');
$root = $dom->appendChild($root);</p>

<p>foreach ($dump as $apk) {</p>

<p>    echo "nAPK: " . $apk;</p>

<p>    if(ends($apk, "apk")){</p>

<p>    $rtrn = getInfo($apk);</p>

<p>    if($rtrn["icon"] == ""){
        $icon = "";
    }else{
        $icon = getIcon($DIR.'/'.$apk, $rtrn["icon"], $rtrn["pkg"]);
    }</p>

<p>    echo "nPackage (hasID): " . $rtrn["pkg"];
    echo "nVersion: " . $rtrn["ver"];
    echo "nVersion: " . $rtrn["vercode"];
    echo "nName: " . $rtrn["name"];
    echo "nIcon: " . $rtrn["icon"];
    echo "nIcon(L): " . $icon;
    echo "nDate: " . $rtrn["date"];
    echo "nMd5Hash: " . $rtrn["md5h"];
    echo "n ======================== n";
    
    $occ = $dom->createElement('package');
    $occ = $root->appendChild($occ);</p>

<p>    $child = $dom->createElement('name');
    $child = $occ->appendChild($child);
    $value = $dom->createTextNode($rtrn["name"]);
    $value = $child->appendChild($value);
       
    $child = $dom->createElement('path');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($apk);
        $value = $child->appendChild($value);</p>

<p>    $child = $dom->createElement('ver');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($rtrn["ver"]);
        $value = $child->appendChild($value);</p>

<p>    $child = $dom->createElement('vercode');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($rtrn["vercode"]);
        $value = $child->appendChild($value);</p>

<p>        $child = $dom->createElement('apkid');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($rtrn["pkg"]);
    $value = $child->appendChild($value);
    
           $child = $dom->createElement('icon');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($icon);
    $value = $child->appendChild($value);</p>

<p>    $child = $dom->createElement('date');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($rtrn["date"]);
    $value = $child->appendChild($value);
        
    $child = $dom->createElement('md5h');
        $child = $occ->appendChild($child);
        $value = $dom->createTextNode($rtrn["md5h"]);
    $value = $child->appendChild($value);
    }</p>

<p>}
$xml_string = $dom->saveXML();
$fp = @fopen($xml_path,'w');
if(!$fp) {
       die('Error cannot create XML file');
}
fwrite($fp,$xml_string);
fclose($fp);
echo "nXML FILE SUCCESSFULLY CREATED!n";</p>

<p>function getIcon($file, $icon, $apk){
    global $ICON_DIR;
    global $ICON_DIR_OUT;
    exec('unzip ' . $file . ' -d .tmp');
    exec('mv ./.tmp/'.$icon . ' ' . $ICON_DIR.$apk);
    exec('rm -rf ./.tmp');
    return($ICON_DIR_OUT.$apk); 
}</p>

<p>function getInfo($file){
    global $DIR;
    $send = array();
    exec("./aapt d badging " . $DIR . $file . "|grep application| cut -d' -f2", $out);
    $send["name"] = implode("",$out);
    $out = "";
    exec("./aapt d badging " . $DIR . $file . "|grep application| cut -d' -f4", $out);
    $send["icon"] = implode("",$out);
    $out = "";
    exec("./aapt d badging " . $DIR . $file . "|grep package| cut -d' -f2", $out);
    $send["pkg"] = implode("",$out);
    $out = "";
    exec("./aapt d badging " . $DIR . $file . "|grep package| cut -d' -f6", $out);
    $send["ver"] = implode("",$out);
    $out = "";
    exec("./aapt d badging " . $DIR . $file . "|grep package| cut -d' -f4", $out);
    $send["vercode"] = implode("",$out);
    $out = "";
    exec("md5sum " . $DIR . $file . "| cut -d  -f1", $out);
    $send["md5h"] = implode("",$out);
    $out = "";
    exec("stat " .$DIR . $file . "|grep Change| cut -d ' ' -f2", $out);
    $send["date"] = implode("",$out);
    return($send);
}</p>

<p>function ends($string, $end){
    $len = strlen($end);
    $string_end = substr($string, strlen($string) - $len);
    return $string_end == $end;
}
?>

bash скрипт может быть даже и удобнее чем питон...

Dmitri написал:
bash скрипт может быть даже и удобнее чем питон...

Давно известно, что настоящие джедаи пишут cgi-скрипты на баше :)))

:wq
--
Live free or die

ну скажем это далеко не cgi-script, определение на wikipedia (на русский перевод там тоже линк есть).

скрипт нужен для создания статичного xml файла, и будет от силы запускатся один - два раза в неделю,
и обходить десяток - другой поддиректорий, в смысле участвовать в формировании html он не будет.
так что разницы от языка, на котором скрипт сделан - я не прочувствую.

просто у самого навыков программирования практически нету, и поэтому прошу помочь.

1. сделать лист apk файлов
find . -type f -name '*.apk' -print

2.попользовать aapt для вытаскивания инфы из apk файла
find . -type f -name '*.apk' -exec ./aapt d badging {} +
уже не работает.

Как сделать рекурсию для программы которая не понимает список файлов?

Dmitri написал:
1. сделать лист apk файлов
find . -type f -name '*.apk' -print

2.попользовать aapt для вытаскивания инфы из apk файла
find . -type f -name '*.apk' -exec ./aapt d badging {} +
уже не работает.

Как сделать рекурсию для программы которая не понимает список файлов?

Склонен подозревать особенность реализации опции -exec (ты ничего не напутал в синтаксисе?).
Я бы написал скрипт для обработки одного файла и указывал его в качестве аргумента.

Т.е. process.sh:

#!/bin/bash
/path/to/aapt d badging $1
exit 0

Ну и далее:
find . -type f -name '*.apk' -exec /path/to/process.sh {}\;

:wq
--
Live free or die

ага, напутал.

выводим инфу из всех найденных пакетов и записываем в list.raw
find . -type f -name '*.apk' -exec ./aapt d badging {} \; > list.raw

теперь вытаскиваем то что нам надо
name grep application list.raw| cut -d\' -f2
icon grep application list.raw| cut -d\' -f4
pkg grep package list.raw| cut -d\' -f2
ver grep package list.raw| cut -d\' -f6
vercode grep package list.raw| cut -d\' -f4

считаем md5sum - здесь снова надо обращаться с файлу
find . -type f -name '*.apk' -exec md5sum {} \;

Смотрим дату модификации файла
find . -type f -name '*.apk' -exec stat -c %z {} \; | cut -d\ -f1

а вот как теперь эту информацию собрать в xml файл я не представляю
у них на сайте pdf со спецификациями выложен
Должно получится что то вроде

<?xml version="1.0" encoding="UTF-8"?>
 <apklst>
   <package>
     <apkid>ex.app1.com</apkid>
     <path>App1.apk</path>
   </package>
   <package>
     <apkid>ex.app2.com</apkid>
     <path>App2.apk</path>
     <name>App 2</name>
     <ver>2.1.1</ver>
     <icon>/icons/app2.ico</icon>
     <catg>Game</catg>
     <date>21-01-10</date>
   </package>
 </apklst>

TODO: выковырять иконки