Вставка нового события в календарь CalDAV с помощью curl - PullRequest
1 голос
/ 30 января 2020

Я знаю, как использовать curl для вставки новых событий в календарь CalDAV, если событие было сохранено как локальный файл ics по предыдущей команде:

$command > $localfile
curl -T "$localfile" $url

Это отлично работает, но я бы хотел бы сделать это без необходимости в локальном файле, я хочу передать результат из $ command в curl, что-то вроде этого:

$command | curl -T - $url

В соответствии с руководством curl, опция "T -" должна быть что требуется: он должен читать из стандартного ввода вместо файла. Но если я использую эту опцию, я получаю следующий ответ:

<?xml version="1.0" encoding="utf-8"?>
    <d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">
      <s:exception>Sabre\DAV\Exception\Conflict</s:exception>
      <s:message>PUT is not allowed on non-files.</s:message>
    </d:error>

Я пробовал другие параметры, такие как "--data" и "--data-raw", но я не нашел правильная комбинация еще. Может ли кто-нибудь помочь мне с этим, пожалуйста?


На самом деле, полный цикл команд, который я пытаюсь реализовать, выглядит следующим образом:

cat<<EOC | curl -T - $url 
BEGIN:VCALENDAR
VERSION:2.0

BEGIN:VEVENT
CREATED:${CREATED}
UID:${RNDUID}
CLASS:PUBLIC
CATEGORIES:TV
SUMMARY:${SUMMARY}
LOCATION:${LOCATION}
DTSTART:${DTSTART}
DTEND:${DTEND}
DESCRIPTION:${DESCRIPTION}
END:VEVENT

END:VCALENDAR
EOC

Я пробовал «эхо» вместо «кошка», но это не меняет результат.

1 Ответ

1 голос
/ 02 февраля 2020

Эврика! :)

Решение состоит в том, чтобы использовать документ ЗДЕСЬ:

$CURL $url -T /dev/stdin <<-EOF
        BEGIN:VCALENDAR
        VERSION:2.0
        BEGIN:VEVENT
        CREATED:$CREATED
        UID:$RNDUID
        SUMMARY:$SUMMARY
        LOCATION:$LOCATION
        DTSTART:$DTSTART
        DTSTAMP:$DTSTART
        DTEND:$DTEND
        DESCRIPTION:$DESCRIPTION
        END:VEVENT
        END:VCALENDAR
EOF

Относительно входного параметра "/dev/stdin"! Параметр curl "-T" там не работает, когда для ввода используется "-" (da sh). Вместо этого вы должны использовать "/dev/stdin", что, к сожалению, не доступно на всех Unix подобных системах. На Linux его можно использовать в качестве замены для "-", когда программы не поддерживают параметр "-" или если da sh имеет для них другое значение, например, отмечает конец всех входных параметров.

"-" после "<<" является частью команды документа HERE: она подавляет табуляторы, но без пробелов, поэтому документ можно расположить более удобным для глаз способом.

Я еще не выяснил, в чем разница между

cat<<EOF | curl ...
...
EOF

и решением, которое я нашел сейчас, кроме первой попытки, очевидно, бесполезного использования кошки. Но это выглядит очень похоже на то, как «кошка» привносит в себя то, что старая собака по кличке «локон» не очень любит. ;)

Если у кого-нибудь есть объяснение этому, я был бы очень благодарен за это.

...