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

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

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

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

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

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

насколько я понимаю это

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

альтернативый репозиторий для андроидных програм

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

изначальный php скрипт generate.ph


#!/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/";

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

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);

foreach ($dump as $apk) {

    echo "nAPK: " . $apk;

    if(ends($apk, "apk")){

    $rtrn = getInfo($apk);

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

    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);

    $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);

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

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

        $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);

    $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);
    }

}
$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";

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); 
}


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);
}

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: выковырять иконки

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".