mc c sftp у меня несколько раз падал, а из -за тормозов - не актуален
smb не особо удобен и глючен. Легковесное решение mount.cifs. Можно к меню mc его прикрутить
Если не отговорил - могу скомпилить только smb
MC_MNT - после доработки подошел для всех случаев где подойдет mount -o loop
В mc.ext
# ISO9660
regex/\.([iI][sS][oO])$
Open=MC_MNT %f
View=MC_MNT %f
# 234fs
regex/\.([234]fs)$
Open=MC_MNT %f
View=MC_MNT %f
# squashfs
regex/\.(sfs|tcz|squashfs|md|salt|sqf|xzm|pfs)$
Open=%cd %p/squashfs://
View=MC_MNT %f
iso - чтобы отказаться от isoinfo. Он , кстати, у нас в репе не strip
Хорошо бы что-то с отмонтированием придумать. Там что-то есть но толи не работает , то ли я не понял как работает
Меня вполне устраивает поменять в mc.ext
Если получится разобраться с pyc. в isoinfo - можно будет вернуть
# ISO9660
regex/\.([iI][sS][oO])$
#View=%view{ascii} /usr/libexec/mc/ext.d/misc.sh view iso9660
View=MC_MNT %f
просмотр по типу pfs файлов - т.е. Только список содержимого.
Для этого тоже используется isoinfo. В него же упрется запись сд и т.п.
Можно пока на оба случая MC_MNT. А isoinfo на потом оставить
rpm2pet - тоже проблемы. Я тестил на древних rpm - работало. Со свежими - нет
# file .cpio.gz
.cpio.gz: gzip compressed data, reserved method, ASCII, has CRC, extra field, has comment, comment, last modified: Wed Apr 4 09:13:44 1984
gzip -d .cpio.gz
gzip: .cpio.gz: unknown method 0 -- not supported
cpio.gz там какой-то другой. Его даже peazip не открывает
Утешает то что peazip все нормально открывает и iso и все rpm
И Open через оперу?
Вычитал в /usr/libexec/mc/extfs.d/README
# zip
regex/\.(zip|ZIP)$
Open=%cd %p/uzip://
View=%view{ascii} unzip -v %f
Icon=zip.xpm
Extract=unzip %f '*'
Последние 2 строчки кто-нибудь может пояснить?
Графика - по замыслу было:
Open: defaulteditor
View: defaultviewer
Так и работает.
Сделал Open: rpm без bsdtar
Переделал Open: sfs [234]fs iso на mount
C deb доразбираюсь и выложу. Постараюсь сегодня
Может вернуть dpkg-deb. Он весит меньше bsdtsr...
...нашел метод
ar p cdebootstrap_0.5.4_i386.deb data.tar.gz | tar zx
Сделал 008. Обновил в шапке.
dpkg-deb undeb unrpm bsdtar - не нужны. Обошелся штатными утилитами.
Нужна помощь по оптимизации кода:
#
TMP_DIR="/etc" #любая не пустая папка
cd $TMP_DIR > /dev/null
T() {
tar cf - . |tar -tvf - | awk '
{
sub("/", " ", $2)
date = substr($4, 6, 2) "-" substr($4, 9, 2) "-" substr($4, 1, 4) " " $5
name = $6
{if($7 != ""){name = name " " $7}}
{if($8 != ""){name = name " " $8}}
printf "%s 1 %s %s %s %s\n", $1, $2, $3, date, name
}'
}
T
На выходе - текст в именно таком формате
Хотелось бы наиболее быстро. Код вызывается чуть ли не при обработке каждого файла в deb sfs iso (если я правильно понял...)
tar |untar - у меня - это костыль для подгонки под формат
Можно делать на perl
Посмотрел defaultmediaplayer. Проблема в нем.
elif [ -x /usr/bin/mplayer ]; then urxvt -e mplayer -zoom -stop-xscreensaver "$@"
& - помогает, но все равно в строке mc цифры бегут
Можно Ctrl-z + bg - но это жестко...
С gui-овыми проигрывателями - ок
Неужели кто-то использует чистый mplayer? Там не стопа ни прокрутки (или я не умею)
Я приделал к нему gnome-mplayer из woof. Оптимально по сравнению с gmplayer и xine. Зависимостей не потянул. http://ubuntuone.com/6IN7HCcDuPFDfr3Bh3rhln 5мв и "все включено". Рекомендую...
include/video
Open=(mplayer %f >/dev/null 2>&1 &)
- как раньше - решает проблему
f1-f5 обучил
Посмотрел в версии PR-13.01 pupm-218-base.pfs/root/.config/mc/ini и никакого обучения не увидел.
Обучил сам в консоли, тогда в /root/.config/mc/ini появились строки:
[terminal:xterm]
f1=\\e[[A
f2=\\e[[B
f3=\\e[[C
f4=\\e[[D
f5=\\e[[E
если эти строчки f1...f5 добавить в файл /usr/share/mc/mc.lib в раздел [terminal:xterm], то тогда в дальнейшем обучение для этих клавишь не требуется, проверил на нетбуке, ноутбуке и двух стационарах с разным железом - везде нормально работает.
if [ "`pgrep X`" ] ;then
`which sudo` mnt_sfs %f && sfsstart %f & #|| ([ -n "`which pfsload`" ] && sudo pfsload %f) &
else
`which sudo` pfsload %f && sfsstart %f &
fi
Наверное так только для PRA покатит
[ "`which pacman`" ] && xpl=mnt_sfs || xpl=open_pfs
if [ "`pgrep X`" ] ;then
`which sudo` $xpl %f && sfsstart %f &
else
`which sudo` pfsload %f && sfsstart %f &
fi
Так нормально? Или что там раньше работало?
Отсутствие sfsstart не критично. Не будет автостарта (В PR и не было)
Си тут явный оверхед :)
Больно не пинайте, это прототип только.
!/bin/sh
LANG=C
umask 077
xzmfs_list()
{
#DATE=`date +"%b %d %H:%M"`
#user=`whoami`
unsquashfs -ll $2 |sed '1,4d' | while read fname
do
echo -n "$(echo $fname |awk '{print $1}') "
echo -n "1 "
echo -n "$(echo $fname |awk '{print $2 " " $3}' |sed 's:/: :') "
echo -n "$(echo $fname |awk '{print $4}' |awk -F- '{print $2 "-" $3 "-" $1}') "
echo -n "$(echo $fname |awk '{print $5 " " $6}' |sed 's:squashfs-root/::') "
if [ -n "$(echo $fname |awk '{print $7}')" ] ; then
echo "-> $(echo $fname |awk '{print $8}') "
else
echo ""
fi
#echo "$(basename $(echo $fname |awk '{print $NF}')) "
done |sed 's/ $//'
}
xzmfs_copyout()
{
unsquashfs -e $2
}
case "$1" in
list) xzmfs_list "$@" ;;
copyout) xzmfs_copyout "$@" ;;
*) exit 1 ;;
esac
exit 0
Чтоб заработало в mc файл надо поолжить в /usr/lib64/mc/extfs.d/
У меня называется xzm, можно назвать иначе. Запускается секцией из /etc/mc/mc.ext
Типа такого:
# xzm
regex/\.xzm$
Open=%cd %p/xzm://
View=
Тестить то, о чем я писал можно без mc,
./xzm list модуль.xzm
Должен возвращать правильный список.
Теперь про формат вывода. То есть кто есть правильный список.
unsquashfs -ll модуль.xzm даст вот такой вывод
unsquashfs -ll ./111.xzm
Parallel unsquashfs: Using 4 processors
3 inodes (1 blocks) to write
drwxrwxrwt root/root 37 2018-03-07 10:51 squashfs-root
drwxr-xr-x root/root 37 2018-03-07 10:51 squashfs-root/222
drwxr-xr-x root/root 37 2018-03-07 10:50 squashfs-root/222/444
-rw-r--r-- root/root 0 2018-03-07 10:50 squashfs-root/222/444/111
drwxr-xr-x root/root 26 2018-03-07 10:49 squashfs-root/222/444/555
drwxr-xr-x root/root 3 2018-03-07 10:49 squashfs-root/222/444/555/666
lrwxrwxrwx root/root 9 2018-03-07 10:51 squashfs-root/222/777 -> ./444/111
-rw-r--r-- root/root 0 2018-03-07 10:51 squashfs-root/ggg
А нужено сделать из него такой:
user@MagOS ~ $ ./xzm list ./111.xzm
drwxr-xr-x 1 root root 37 03-07-2018 10:51 222
drwxr-xr-x 1 root root 37 03-07-2018 10:50 222/444
-rw-r--r-- 1 root root 0 03-07-2018 10:50 222/444/111
drwxr-xr-x 1 root root 26 03-07-2018 10:49 222/444/555
drwxr-xr-x 1 root root 3 03-07-2018 10:49 222/444/555/666
lrwxrwxrwx 1 root root 9 03-07-2018 10:51 222/777 -> ./444/111
-rw-r--r-- 1 root root 0 03-07-2018 10:51 ggg
То есть по полям так:
<права> <пробел><кол-во ссылок><пробел><юзер><пробел><группа><пробел><размер><пробел><дата><пробел><время><пробел>[путь/]<имя файла>[<пробел>"->"<пробел>[путь/]<куды ссылка>]
То что в квадратных скобках не обязательно. То есть если файл в корне архива, пути перед ним нет. Последний кусок "-> [путь/]<пробел><куды ссылка>" только для ссылок.
Теперь то что удалось вычислить методом научного тыка. Формат даты отличается, и это важно ММ-ДД-ГГГГ и не иначе. В конце строк пробелов быть не должно, глючит. Количества ссылок в выхлопе unsquashfs нет, посчитать конечно можно, но думаю можно упустить, просто пишем 1 (0 нельзя, не работает).
Вторая функция для копирования. Ее пока вообще не делал.
Вот еще, чтоб оценить масштаб трагедии :)
user@MagOS ~ $ time unsquashfs -ll /memory/data/from/0/MagOS/base/00-kernel.xzm > ~/test1
real 0m1,231s
user 0m0,315s
sys 0m0,903s
user@MagOS ~ $ time ./xzm list /memory/data/from/0/MagOS/base/00-kernel.xzm > ~/test1
real 6m42,896s
user 5m41,353s
sys 1m31,200s
user@MagOS ~ $
Для сравнения питон:
user@MagOS ~ $ time unsquashfs -ll /memory/data/from/0/MagOS/base/00-kernel.xzm > ./test1
real 0m1,384s
user 0m0,405s
sys 0m0,971s
user@MagOS ~ $ time ./xzm.py /memory/data/from/0/MagOS/base/00-kernel.xzm > ./test1
real 0m1,416s
user 0m0,559s
sys 0m0,883s
Тоже без оптимизаций, чисто как написалось :)
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os, sys
def getList():
command = ('unsquashfs -ll ' + sys.argv[1] + ' |sed \'1,4d\'')
listing = os.popen( command ).read().split('\n')
return listing
for line in getList():
if len(line) != 0:
items=line.split()
if len(items) == 8 :
print items[0], '1', items[1].split('/')[0], items[1].split('/')[1], items[2], items[3].split('-')[2] + '-' + items[3].split('-')[0] + '-' + items[3].split('-')[1], items[4], items[5].replace('squashfs-root/', ' ') + ' -> ' + items[7]
if len(items) == 6 :
print items[0], '1', items[1].split('/')[0], items[1].split('/')[1], items[2], items[3].split('-')[2] + '-' + items[3].split('-')[0] + '-' + items[3].split('-')[1], items[4], items[5].replace('squashfs-root/', ' ')
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os, sys, tempfile, shutil
def unsq_list(arch):
command = ('unsquashfs -ll ' + arch + ' |sed \'1,4d\'')
for line in os.popen( command ).read().split('\n'):
if len(line) != 0:
items=line.split()
if len(items) == 8 :
print items[0], '1', items[1].split('/')[0], items[1].split('/')[1], items[2], items[3].split('-')[1] + '-' + items[3].split('-')[2] + '-' + items[3].split('-')[0], items[4], items[5].replace('squashfs-root/', ' ') + ' -> ' + items[7]
if len(items) == 6 :
print items[0], '1', items[1].split('/')[0], items[1].split('/')[1], items[2], items[3].split('-')[1] + '-' + items[3].split('-')[2] + '-' + items[3].split('-')[0], items[4], items[5].replace('squashfs-root/', ' ')
def copyout(arch, filename, dest):
tmpdir = tempfile.mkdtemp()
command = ('unsquashfs -f -d ' + tmpdir + " " + arch + ' -e /' + filename )
os.popen(command)
shutil.copy2(tmpdir + '/' + filename, dest )
shutil.rmtree(tmpdir, ignore_errors=True)
if sys.argv[1] == 'list':
unsq_list( sys.argv[2] )
if sys.argv[1] == 'copyout':
copyout( sys.argv[2], sys.argv[3], sys.argv[4] )
Рабочий скрипт. По скорости довольно сносно, с первым вариантом на баше не сравнить.
Проверил на своих модулях. В среднем около секунды на вход в модуль. Максимум 3 сек было, на модуле с кучей мелких файлов. Копирование из модуля выглядит как со смонтированного. Короче вполне нормально.
Еще нужна секция в /etc/mc/mc.ext вроде такой.
# xzm
regex/\.xzm$
Open=%cd %p/xzm://
Это если сам скрипт называется xzm.
А уже реализовали?
Прототип.
+ t t
q Compress tagged files to xzm module
list=''; droped=''
for i in %t ; do
if file $i |grep -q quashfs ; then
list="$list $i"
elif [ -d $i ] ; then
list="$list $i"
else
droped="$droped $i"
fi
done
echo "Dirs and modules for mkpfs: $list"
[ -n "$droped" ] && echo "Droped files (is not squashfs): $droped"
echo -n "Name of the compressed file: [ $(echo $list |cut -d " " -f 1) ]: "
read modname
if [ "$modname"x = x ] ; then
modname=""
else
modname="-o $modname"
fi
mkpfs $list -o $modname
А вот тот файл, что на питоне будет уже в следующей сборке. Оч. удобная штука получилась. Если сообразим сопоставимый по скорости и простоте поддержки вариант без питона думаю, что уговорю Михаила заменить. Если таких совместных кусочков для работы в mc с модулями наберется можно добавить в гит pfs-utils, только продумать в каком виде, тут же не только файлы, но и патчи.
Разница выхлопа ls -l и unsquashfs -ll небольшая -rw-r--r-- 1 root root 71514 Mar 30 11:23 unsquashfs.c
drwxr-xr-x root/root 30 2017-02-05 16:46 squashfs-root/etc/X11/app-defaults
начало строки генерируется в строке 557 unsquashfs.c printf("%s %s/%s ", modestr(str, inode->mode), userstr, groupstr);
можно изменить на printf("%s\t%s\t%s ", modestr(str, inode->mode), userstr, groupstr);
тогда получим drwxr-xr-x root root 30 2017-02-05 16:46 squashfs-root/etc/X11/app-defaults
Идея понятна?
Лажа. Этого мало. Надо дату править и squashfs-root вырезать
# ./unsquashfs -ll 1.pfs
drwxrwxrwt root root 26 2018-03-30 14:26 squashfs-root
-rw-r--r-- root root 0 2018-03-30 14:26 squashfs-root/aaa
root@pra-roll:1# mcls .
drwxr-xr-x 2 root root 60 03-30-2018 14:26 ./
-rw-r--r-- 1 root root 0 03-30-2018 14:26 ./aaa
правильный вывод внизу
может отсюда что поможет?
Не помогло, но углубился и нашел
Новые версии не любят пути с точкой в начале ./
В mcls добавил в конце строки
| sed 's# \.# # ; s# /$##'
заработало
Переписал extfs для bsdtar. 089-upd-2008-sf38.pfs (http://mirror.yandex.ru/puppyrus/roll/2008/pfs/089-upd-2008-sf38.pfs). Прикрутил к 7z и rar (т.е. тестируйте распаковкой таких архивов в mc)
Улучшения приветствуются
bsdtar (https://www.libarchive.org/) может кучу форматов (https://www.freebsd.org/cgi/man.cgi?query=bsdtar) tar, pax, cpio, zip, xar, lha, ar , cab, mtree, rar, iso
rar может, но не всякий и с проблемами (https://github.com/libarchive/libarchive/issues/151)
Старый мой вариант bsdtar0 вместо чтения содержимого архива распаковывал его в /tmp
#!/bin/sh
#210116 sfs
mcdpkg_deb_list () {
file "$1" |egrep '7-zip archive data, version 0.4$' >/dev/null && t=cat || t=tac
LC_TIME=C bsdtar -tvf "$1" |
awk '{
{cmd = "date -d \"" $6 " " $7 " "$8 "\" \"+%m-%d-%Y %H:%M:%S\""
cmd | getline d
cmd = "id -un $3"
cmd | getline u
cmd = "id -gn $4"
cmd | getline g
printf $1" 1"" "u" "g" "$5" "d" "$9}
for(i = 10; i <= NF; i++) { printf("%s ", " "$i) }
printf "\n"
}' |sed 's/[ \/]$//' | $t
}
mcdpkg_deb_copyout () {
bsdtar -xOf "$1" "$2" > "$3"
}
LC_ALL=C
cmd="$1"
shift
case "$cmd" in
list)
mcdpkg_deb_list "$@";
exit 0;;
copyout)
mcdpkg_deb_copyout "$@";
exit 0;;
esac
exit 1
C конвертацией bsdtar -tzvf в нужный mc формат пришлось заморочиться.
Можно использовать как пример для сложной awk обработки:
1. Использование внешних утилит внутри awk (cmd=) с полями awk в качестве аргументов
2. Разные обработки для разных полей (несколько print)
3. Вывод полей с 10 до конца строки for(i = 10; i <= NF; i++) { printf("%s ", " "$i) }
file "$1" |egrep '7-zip archive data, version 0.4$' >/dev/null && t=cat || t=tac - костыль для 7z архивов, созданных bsdtar. Если в списке папки после файлов - в mc видно как повторы. Вылечил чтением задом на перед (tac)
zip -r dir1/ dir2/ file1 file2 *.zip
Наверное zip -r имя-архива dir1/ dir2/ file1 file2
F Помеченнoe в zip
Pwd=`basename %d /`
echo -n "Введите имя файла (без расширения) [$Pwd]: "
read tar
if [ "$tar"x = x ]; then tar="$Pwd"; fi
zip -r "$tar" %t
echo "../$tar.zip создан."
Вышел mc 4.29 (https://www.opennet.ru/opennews/art.shtml?num=58481)
Файл mc.ext преобразован в формат INI и переименован в mc.ext.ini. Использование нового формата позволило реализовать более сложную логику выбора обработчиков.
Придется править
Например :
[pfs]
Regex=\.(sfs|tcz|squashfs|md|salt|sqf|xzm|pfs|pfs.old)$
Open=%cd %p/squashfs://
View=%view{ascii} unsquashfs -ll %f
Работает, но при входе в pfs выдает ошибку : EXTFS ... inconsistent archive
Причем с родными конфигами выдает такую же ошибку на zip и 7z
И 4.29 версию убрали http://ftp.midnight-commander.org/
Короче - похоже надо подождать 4.30