VDIRSYNCER(1) vdirsyncer VDIRSYNCER(1)

vdirsyncer - مستندات vdirsyncer

برنامهٔ vdirsyncer یک ابزار خط‌فرمانی برای همگام‌سازی تقویم‌ها و دفترچه‌های نشانی میان انواع سرورها و فایل‌سیستم محلی است. رایج‌ترین مورد استفاده، همگام‌سازی یک سرور با یک پوشهٔ محلی و استفاده از مجموعه‌ای از برنامه‌های دیگر <> برای تغییر رویدادها و مخاطبین محلی است. سپس vdirsyncer می‌تواند آن تغییرات را مجدداً با سرور همگام‌سازی کند.

با این حال، vdirsyncer به همگام‌سازی میان کلاینت‌ها و سرورها محدود نمی‌شود؛ بلکه می‌توان از آن برای همگام‌سازی مستقیم تقویم‌ها و/یا دفترچه‌های نشانی میان دو سرور نیز استفاده کرد.

هدف این ابزار آن است که همان نقشی را برای تقویم‌ها و مخاطبین ایفا کند که OfflineIMAP http://offlineimap.org برای ایمیل‌ها دارد.

پروژه‌هایی مانند todo.txt http://todotxt.com پیچیدگی برنامه‌های مدرن بهره‌وری را به درستی نقد می‌کنند. بنابراین آن‌ها دست به کار شدند تا قالبی جدید، فوق‌العاده ساده و خوانا برای انسان ایجاد کنند، به طوری که vim برای مشاهدهٔ داده‌های خام کافی باشد. با این حال، هنگامی که با این پرسش روبرو شدند که چگونه آن داده‌ها را میان چندین دستگاه همگام‌سازی کنند، به نظر می‌رسد با ایدهٔ نوآورانهٔ خود به بن‌بست رسیدند: "بیایید فقط از Dropbox استفاده کنیم".

نرم‌افزارهای همگام‌سازی فایل در صورتی که هر دو فایل از زمان آخرین همگام‌سازی تغییر کرده باشند چه می‌کنند؟ پاسخ این است که صورت‌مسئله را نادیده می‌گیرند، تا جای ممکن مکرراً همگام‌سازی می‌کنند و به بهترین نتیجه امید می‌بندند. زیرا اگر تداخل همگام‌سازی پیش بیاید، اغلب سرویس‌های همگام‌سازی جرئت ادغام فایل‌ها را ندارند و در عوض دو نسخه از آن را در هر رایانه ایجاد می‌کنند. ادغام این دو فهرست وظایف بر عهدهٔ کاربر گذاشته می‌شود.

ایدهٔ بهتر می‌توانست استفاده از git برای همگام‌سازی فایل todo.txt باشد، که حداقل قادر است برخی تداخل‌های پایه‌ای را حل و فصل کند.

از آنجا که vdirها <> صرفاً مجموعه‌ای از فایل‌ها هستند، امتحان کردن همگام‌سازی فایل برای همگام‌سازی داده‌هایتان میان چندین رایانه بدیهی به نظر می‌رسد، مانند:

معایب این راه‌حل‌ها تا حد زیادی به برنامهٔ دقیق همگام‌سازی فایلِ انتخاب‌شده بستگی دارد:

  • مشابه todo.txt، برنامهٔ Dropbox و ابزارهای مشابه آشکارا از محتوای فایل‌ها بی‌خبر هستند (نسبت به محتوا ناآگاهند). اگر فایلی در هر دو طرف تغییر کرده باشد، Dropbox صرفاً هر دو نسخه را در هر دو طرف کپی می‌کند.

    این ایده زمانی خوب است که کاربر مستقیماً با فایل‌سیستم تعامل داشته باشد و خود قادر به حل تداخل‌ها باشد. اما در اینجا ممکن است منجر به رفتار اشتباه در برنامه‌هایی نظیر khal شود، زیرا اکنون دو رویداد با UID یکسان وجود دارند.

    این نکته در مورد git صدق نمی‌کند: این ابزار قابلیت‌های ادغام بسیار خوبی دارد، حتی بهتر از آنچه vdirsyncer در حال حاضر ارائه می‌دهد.

  • چنین ساختاری اصلاً بر روی تلفن‌های هوشمند کار نمی‌کند. از سوی دیگر، vdirsyncer با سرورهای CardDAV/CalDAV همگام‌سازی می‌کند، سرورهایی که می‌توان از طریق برنامه‌هایی مانند DAVx⁵ https://www.davx5.com یا سایر برنامه‌های پیش‌فرض موجود در تلفن‌های هوشمند به آن‌ها دسترسی داشت.

بسته‌های زیر با مشارکت جامعه آماده شده‌اند و در زمان نگارش این مستند به‌روز بوده‌اند:

ما فقط از آخرین نسخهٔ vdirsyncer پشتیبانی می‌کنیم که در زمان نگارش این متن 0.21.0 است. لطفاً در صورت استفاده از نسخه‌های قدیمی‌تر، باگی گزارش نکنید.

برخی از توزیع‌ها دارای چندین کانال انتشار هستند. به عنوان مثال Debian و Fedora دارای یک کانال انتشار "stable" (پایدار) هستند که نسخهٔ قدیمی‌تری از vdirsyncer را ارائه می‌دهد. از آن نسخه‌ها نیز پشتیبانی نمی‌شود.

اگر بستهٔ مناسبی برای توزیع شما وجود ندارد، باید vdirsyncer را به‌صورت دستی نصب کنید. یک دستور ساده برای رونویسی و جای‌گذاری (copy-and-paste) برای این کار وجود دارد، اما باید از پیامدهای آن آگاه باشید.

اگر توزیع شما بسته‌ای برای vdirsyncer ارائه نمی‌دهد، همچنان می‌توانید از مدیر بستهٔ Python یعنی "pip" استفاده کنید. ابتدا باید بررسی کنید که موارد زیر نصب شده باشند:

  • Python نسخهٔ 3.9 تا 3.14 و pip.
  • libxml و libxslt
  • zlib
  • Linux یا macOS. سیستم‌عامل Windows پشتیبانی نمی‌شود، گزارش شمارهٔ #535 را در https://github.com/pimutils/vdirsyncer/issues/535 ببینید.

در سیستم‌های Linux، استفاده از مدیر بستهٔ توزیع بهترین راه برای انجام این کار است، برای مثال در Ubuntu:

sudo apt-get install libxml2 libxslt1.1 zlib1g python3

سپس چندین گزینه پیش رو دارید. ضمناً متن زیر برای بیشتر نرم‌افزارهای Python صدق می‌کند.

ابزار pipx https://github.com/pipxproject/pipx یک مدیر بستهٔ جدید برای نرم‌افزارهای مبتنی بر Python است که به‌طور خودکار برای هر برنامه‌ای که نصب می‌کند یک محیط مجازی ایجاد می‌نماید. لطفاً توجه داشته باشید که نصب از طریق pipx شامل صفحات راهنما (man pages) یا سرویس‌های systemd نخواهد بود.

ابزار pipx برنامهٔ vdirsyncer را در مسیر ~/.local/pipx/venvs/vdirsyncer نصب خواهد کرد.

با فرض اینکه pipx نصب شده است، vdirsyncer را می‌توان با دستور زیر نصب کرد:

pipx install vdirsyncer

بعداً می‌توان آن را با دستور زیر به آخرین نسخه به‌روزرسانی کرد:

pipx upgrade vdirsyncer

و با این دستور می‌توان آن را حذف کرد:

pipx uninstall vdirsyncer

این دستور آخر، vdirsyncer و تمام وابستگی‌های نصب‌شده در مکان فوق را حذف خواهد کرد..SS روش کثیف، اما آسان

اگر pipx روی توزیع شما در دسترس نیست، ساده‌ترین راه برای نصب vdirsyncer در این مرحله اجرای دستور زیر است:

pip install --ignore-installed vdirsyncer
•
گزینهٔ --ignore-installed برای دور زدن بسته‌های احتمالاً معیوب دبیان (Debian) است (خطاهای ImportError مرتبط با Requests را در <#debian-urllib3> ببینید).

با این حال این روش یک نقص عمده دارد: Pip فایل‌هایی را که نصب می‌کند ردگیری نمی‌کند. فایل‌های vdirsyncer در جایی درون ~/.local/lib/python* قرار خواهند گرفت، اما اگر تصمیم به حذف آن بگیرید، به هیچ وجه نمی‌توانید بدانید کدام بسته‌ها به عنوان وابستگی‌های vdirsyncer نصب شده‌اند و کدام‌ها نصب نشده‌اند. به عبارت دیگر، استفاده از pip به این شکل دایرکتوری خانگی شما را آلوده می‌کند.

راهی برای نصب نرم‌افزارهای پایتون بدون پراکنده کردن فایل‌ها در سراسر سیستم‌فایل شما وجود دارد: virtualenv https://virtualenv.readthedocs.io. منابع زیادی دربارهٔ نحوهٔ استفاده از آن وجود دارد، ساده‌ترین حالت ممکن چیزی شبیه به این خواهد بود:

virtualenv ~/vdirsyncer_env
~/vdirsyncer_env/bin/pip install vdirsyncer
alias vdirsyncer="~/vdirsyncer_env/bin/vdirsyncer"

شما باید خط آخر را در .bashrc یا .bash_profile خود قرار دهید.

این روش دو مزیت دارد:

  • همهٔ بسته‌های پایتون را به‌طور جداگانه و بدون اتکا به بسته‌های سیستم در ~/vdirsyncer_env/ نصب می‌کند. این کار مشکلات خاص سیستم‌عامل یا توزیع را دور می‌زند.
  • برای حذف کامل vdirsyncer می‌توانید ~/vdirsyncer_env/ را حذف کنید.

پیش از شروع، در نظر بگیرید که آیا واقعاً به vdirsyncer نیاز دارید <>. برای کاربردهای خاص، جایگزین‌های بهتری در دسترس است.

بخش نصب <#installation> را ببینید.

نکته:

  • فایل config.example از مخزن پروژه https://github.com/pimutils/vdirsyncer/blob/main/config.example شامل نسخه‌ای بسیار خلاصه از این پیکربندی است.
  • در این مثال ما همگام‌سازی مخاطبین را راه‌اندازی می‌کنیم، اما همگام‌سازی تقویم نیز تقریباً به همین شکل کار می‌کند. تنها کافی است type = "carddav" را به type = "caldav" و fileext = ".vcf" را به fileext = ".ics" تغییر دهید.
  • اگر چیزی مطابق برنامه پیش نرفت، نگاهی به صفحهٔ Known Problems <> بیندازید.

به‌طور پیش‌فرض، vdirsyncer فایل پیکربندی خود را در مکان‌های زیر جستجو می‌کند:

فایل پیکربندی باید با بخش general <#general-config> آغاز شود، که در آن تنها پارامتر الزامی status_path است. در ادامه یک نمونهٔ کمینه آمده است:

[general]
status_path = "~/.vdirsyncer/status/"

پس از بخش general، ممکن است تعداد دلخواهی از بخش‌های pair و storage قرار گیرند.

در vdirsyncer، همگام‌سازی همیشه بین دو فضای ذخیره‌سازی انجام می‌شود. این فضاهای ذخیره‌سازی در بخش‌های storage تعریف می‌شوند <#storage-config>، و اینکه کدام جفت‌های ذخیره‌سازی در عمل باید همگام‌سازی شوند در بخش pair تعریف می‌گردد <#pair-config>. این ساختار از OfflineIMAP الگوبرداری شده است، جایی که فضاها repository و جفت‌ها account نامیده می‌شوند.

مثال زیر دفترچه‌های نشانی ownCloud را در ~/.contacts/ همگام‌سازی می‌کند:

[pair my_contacts]
a = "my_contacts_local"
b = "my_contacts_remote"
collections = ["from a", "from b"]
[storage my_contacts_local]
type = "filesystem"
path = "~/.contacts/"
fileext = ".vcf"
[storage my_contacts_remote]
type = "carddav"
# We can simplify this URL here as well. In theory it shouldn't matter.
url = "https://owncloud.example.com/remote.php/carddav/"
username = "bob"
password = "asdf"

نکته:

پیکربندی سایر سرورها را می‌توان در بخش Servers <#supported-servers> یافت.

پس از اجرای vdirsyncer discover و vdirsyncer sync، دایرکتوری ~/.contacts/ شامل زیرپوشه‌هایی برای هر دفترچه نشانی خواهد بود، که هر یک به نوبهٔ خود شامل تعدادی فایل .vcf هستند که هر کدام حاوی یک مخاطب با قالب VCARD است. می‌توانید محتوای آن‌ها را تغییر دهید، موارد جدید اضافه کنید و برخی را حذف نمایید [1]، و پس از اجرای مجدد vdirsyncer sync، تغییرات شما با سرور CalDAV همگام خواهد شد. برای اطلاعات بیشتر، این روش از فضاهای ذخیره‌سازی filesystem <#storage-filesystem> و carddav <#storage-carddav> استفاده می‌کند.

با این حال، اگر مجموعه‌های جدیدی روی سرور ایجاد شوند، همگام‌سازی آن‌ها به‌طور خودکار شروع نخواهد شد [2]. در عوض باید vdirsyncer discover را دوباره اجرا کنید تا این فهرست مجدداً دریافت شود.

[1]
احتمالاً برای این کار می‌خواهید از یک برنامهٔ کمکی استفاده کنید <>.
[2]
زیرا مجموعه‌ها به ندرت اضافه می‌شوند، و بررسی این موضوع قبل از هر بار همگام‌سازی ارزش بار پردازشی اضافه را ندارد..SS "پیکربندی بیشتر (More Configuration)"

اگر یک آیتم در هر دو طرف تغییر کند چه می‌شود؟ vdirsyncer چه کاری باید انجام دهد؟ در حال حاضر سه گزینه پیش‌بینی شده است:

1.
vdirsyncer یک پیام خطا نمایش می‌دهد (پیش‌فرض)؛
2.
vdirsyncer یکی از نسخه‌ها را به جای دیگری انتخاب می‌کند؛
3.
vdirsyncer دستور انتخابی شما را اجرا می‌کند که وظیفه دارد دو نسخه متفاوت را ادغام کند.

گزینه‌های ۲ و ۳ نیازمند افزودن پارامتر "conflict_resolution" به بخش pair هستند. گزینه ۲ نیازمند تعیین یکی از مقادیر "a wins" یا "b wins" برای این پارامتر است:

[pair my_contacts]
...
conflict_resolution = "b wins"

پیش‌تر نوشتیم که b = "my_contacts_remote"، بنابراین هنگامی که vdirsyncer با شرایطی مواجه شود که یک آیتم در هر دو طرف تغییر کرده باشد، صرفاً آیتم محلی را با نسخه سرور بازنویسی می‌کند.

گزینه ۳ نیازمند تعیین آرایه‌ای به عنوان مقدار "conflict_resolution" است که با "command" آغاز شده و شامل مسیرها و آرگومان‌های یک دستور باشد. برای مثال:

[pair my_contacts]
...
conflict_resolution = ["command", "vimdiff"]

در این مثال، vimdiff <a> <b> فراخوانی خواهد شد که در آن <a> و <b> دو فایل موقت شامل فایل‌های دارای تعارض هستند. فایل‌ها باید در زمان پایان و بازگشت دستور دقیقاً یکسان شده باشند. با افزودن عناصر بیشتر به آرایه، می‌توان آرگومان‌های بیشتری را به دستور ارسال کرد.

برای مستندات مرجع، به Pair Section <#pair-config> مراجعه کنید.

افزون بر آیتم‌ها، vdirsyncer همچنین می‌تواند فراداده‌هایی مانند نام «کاربرپسند» دفترچه مخاطبین یا تقویم (که در ساختار داخلی "displayname" نامیده می‌شود) یا رنگ مرتبط با یک تقویم را همگام‌سازی کند. به منظور شرح این قابلیت، بیایید به سراغ یک مثال پایهٔ دیگر برویم. این بار تقویم‌ها را همگام‌سازی می‌کنیم:

[pair my_calendars]
a = "my_calendars_local"
b = "my_calendars_remote"
collections = ["from a", "from b"]
metadata = ["color"]
[storage my_calendars_local]
type = "filesystem"
path = "~/.calendars/"
fileext = ".ics"
[storage my_calendars_remote]
type = "caldav"
url = "https://owncloud.example.com/remote.php/caldav/"
username = "bob"
password = "asdf"

برای شناسایی، دستور vdirsyncer discover را اجرا کنید. سپس می‌توانید از vdirsyncer metasync برای همگام‌سازی ویژگی color بین تقویم‌های محلی خود در ~/.calendars/ و ownCloud استفاده کنید. به صورت محلی، رنگ صرفاً در قالب فایلی به نام color درون پوشهٔ تقویم نمایش داده می‌شود..SS اطلاعات بیشتر درباره مجموعه‌ها

«مجموعه» ("Collection") یک اصطلاح کلی برای دفترچه‌های نشانی و تقویم‌ها است. یک سرور Carddav یا Caldav می‌تواند شامل چندین «مجموعه» باشد که با چندین دفترچه نشانی یا تقویم مطابقت دارند.

هر مجموعه از یک مخزن (storage) دارای یک «نام مجموعه» ("collection name") است که شناسه‌ای یکتا برای هر مجموعه به‌شمار می‌رود. در مورد مخزن filesystem <#storage-filesystem>-storage، این مقدار نام پوشه‌ای است که بیانگر مجموعه است؛ در مورد مخازن DAV، این مقدار آخرین بخش URL می‌باشد. ما از این شناسه در پارامتر collections در بخش pair استفاده می‌کنیم.

این شناسه حتی اگر تقویم خود را در هر واسط کاربری تغییر نام دهید عوض نمی‌شود، زیرا آن کار تنها ویژگی اصطلاحاً "displayname" [3] را تغییر می‌دهد. در برخی سرورها (مانند iCloud یا Google) این شناسه به‌صورت تصادفی تولید می‌شود و هیچ ارتباطی با نام نمایشی (displayname) انتخابی شما ندارد.

[3]
که می‌توانید آن را نیز با metasync و با استفاده از metadata = ["displayname"] همگام‌سازی کنید.

سه نام مجموعه وجود دارند که معنای خاصی دارند:

  • "from a"، "from b": جای‌بانی برای تمام مجموعه‌هایی که هنگام اجرای vdirsyncer discover در سمت A/B یافت می‌شوند.
  • null: پارامترهای داده‌شده به مخزن دقیق هستند و نیازی به کشف (discovery) ندارند.

مورد آخر به کمی توضیح بیشتر نیاز دارد. این پیکربندی را فرض کنید که دو دایرکتوری از دفترچه‌های نشانی را همگام‌سازی می‌کند:

[pair foobar]
a = "foo"
b = "bar"
collections = ["from a", "from b"]
[storage foo]
type = "filesystem"
fileext = ".vcf"
path = "./contacts_foo/"
[storage bar]
type = "filesystem"
fileext = ".vcf"
path = "./contacts_bar/"

همان‌طور که قبلاً دیدیم، این کار تمام مجموعه‌های موجود در ./contacts_foo/ را با هر مجموعه هم‌نام در ./contacts_bar/ همگام‌سازی می‌کند. اگر مجموعه‌ای وجود داشته باشد که در یک سمت هست اما در سمت دیگر نیست، vdirsyncer خواهد پرسید که آیا آن پوشه در سمت دیگر ایجاد شود یا خیر.

اگر مقدار collections = null را تنظیم کنیم، با ./contacts_foo/ و ./contacts_bar/ دیگر به‌عنوان پوشه‌های حاوی مجموعه‌ها رفتار نمی‌شود، بلکه خودشان به‌عنوان مجموعه در نظر گرفته می‌شوند. این بدان معناست که ./contacts_foo/ و ./contacts_bar/ مستقیماً شامل فایل‌های .vcf خواهند بود، نه زیرپوشه‌هایی که شامل فایل‌های .vcf هستند.

این قابلیت در شرایطی مفید است که برای مثال، فهرست‌کردن تمام مجموعه‌ها به دلیل عدم پشتیبانی سرور DAV شما با شکست مواجه می‌شود. در این حالت، می‌توانید url مخزن carddav <#storage-carddav>- یا caldav <#storage-caldav>-storage خود را روی نشانی‌ای تنظیم کنید که مستقیماً به مجموعه CalDAV/CardDAV شما اشاره می‌کند.

توجه داشته باشید که همه مخازن از مجموعه null پشتیبانی نمی‌کنند؛ به عنوان مثال google_contacts <#storage-google_contacts> و google_calendar <#storage-google_calendar> از آن پشتیبانی نمی‌کنند.

مثال‌های بالا در صورتی که بخواهید یک سرور دوردست را با یک دیسک از قبل خالی همگام‌سازی کنید، به اندازه کافی مناسب هستند. با این حال، زمانی که دو سرور با مجموعه‌هایی از قبل موجود داشته باشید که می‌خواهید آن‌ها را با یکدیگر همگام کنید، به ترفندهای بیشتری نیاز است.

مشکل اصلی در این شرایط این است که vdirsyncer به‌طور پیش‌فرض مجموعه‌ها را بر اساس نام مجموعه جفت می‌کند (تعریف آن در بخش قبل را ببینید، اساساً یک نام پوشه یا یک UUID از راه دور). هنگامی که دو سرور دارید، این نام‌های مجموعه ممکن است به این زیبایی با یکدیگر تطابق نداشته باشند. فرض کنید دو تقویم با نام "Test" ایجاد کرده‌اید، یکی روی سرور NextCloud و دیگری روی iCloud، با استفاده از واسط‌های وب مربوط به هرکدام. نشانی‌های وب چیزی شبیه به این خواهند بود:

NextCloud: https://example.com/remote.php/dav/calendars/user/test
iCloud:    https://p-XX.caldav.icloud.com/YYY/calendars/3b4c9995-5c67-4021-9fa0-be4633623e1c

این‌ها دو مجموعه تقویم DAV هستند. نام‌های مجموعه آن‌ها به ترتیب test و 3b4c9995-5c67-4021-9fa0-be4633623e1c خواهد بود، بنابراین نام واحدی ندارید که بتوانید با آن به هر دوی آن‌ها اشاره کنید. شما باید به‌صورت دستی این مجموعه‌ها را به این صورت «جفت» (pair) کنید:

[pair doublecloud]
a = "my_nextcloud"
b = "my_icloud"
collections = [["mytest", "test", "3b4c9995-5c67-4021-9fa0-be4633623e1c"]]

نام mytest به این ترکیب از تقویم‌ها یک نام مناسب می‌دهد که می‌توانید هنگام اشاره به آن استفاده کنید، بنابراین می‌توانید از vdirsyncer sync doublecloud/mytest استفاده کنید تا بگویید: "فقط این دو مخزن را همگام‌سازی کن، و نه چیز دیگری که ممکن است پیکربندی شده باشد".

نکته:

چرا از displaynameها استفاده نکنیم؟

ممکن است این پرسش برایتان پیش بیاید که چرا vdirsyncer نتوانست خودش این موضوع را تشخیص دهد؟ به هر حال، شما هر دو مجموعه را "Test" نام‌گذاری کرده‌اید (که "displayname" نامیده می‌شود)، پس چرا مجموعه‌ها بر اساس این مقدار جفت نمی‌شوند؟

چند مشکل در رابطه با این ایده وجود دارد:

  • دو تقویم ممکن است دقیقاً displayname یکسانی داشته باشند.
  • یک تقویم ممکن است فاقد displayname (غیرخالی) باشد.
  • ممکن است displayname تغییر کند؛ چه به این دلیل که شما تقویم را تغییر نام دهید، چه به این دلیل که تقویم خود به دلیل تغییر تنظیمات زبان نامش را تغییر دهد.

در نهایت، این ویژگی هیچ‌گاه برای تجزیه و پردازش توسط ماشین‌ها طراحی نشده است.

تمام پیکربندی‌های SSL به‌ازای هر فضای ذخیره‌سازی انجام می‌شود.

برای سنجاق کردن گواهی بر اساس اثر انگشت:

[storage foo]
type = "caldav"
...
verify_fingerprint = "6D:83:EA:32:6C:39:BA:08:ED:EB:C9:BC:BE:12:BB:BF:0F:D9:83:00:CC:89:7E:C7:32:05:94:96:CA:C5:59:5E"

باید از اثر انگشت‌های SHA256 استفاده شود؛ الگوریتم‌های MD5 و SHA-1 ناامن هستند و پشتیبانی نمی‌شوند. هنگام سنجاق کردن اثر انگشت، اعتبارسنجی CA غیرفعال می‌شود.

می‌توانید از دستور زیر برای دریافت اثر انگشت SHA256 استفاده کنید:

echo -n | openssl s_client -connect unterwaditzer.net:443 | openssl x509 -noout -fingerprint -sha256

با این حال، لطفاً استفاده از Let's Encrypt https://letsencrypt.org را مد نظر قرار دهید تا نیازی به این کارها نباشد. دریافت و به‌کارگیری یک گواهی رایگان از آن‌ها بسیار آسان‌تر از پیکربندی تک‌تک کلاینت‌هایتان برای پذیرش گواهی خودامضا (self-signed) است.

برای هدایت vdirsyncer به مجموعه‌ای سفارشی از CAهای ریشه:

[storage foo]
type = "caldav"
...
verify = "/path/to/cert.pem"

برنامه Vdirsyncer از کتابخانه aiohttp https://docs.aiohttp.org/en/stable/index.html بهره می‌برد که به‌طور پیش‌فرض از

`ssl.SSLContext
https://docs.python.org/3/library/ssl.html#ssl.SSLContext`_
پیش‌فرض استفاده می‌کند.

مواردی وجود دارد که اعتبارسنجی گواهی با شکست مواجه می‌شود، حتی اگر بتوانید برای مثال از طریق مرورگر خود به‌راحتی به سرور دسترسی داشته باشید. این موضوع معمولاً نشان می‌دهد که نصب python یا کتابخانه aiohttp شما به نحوی ناقص یا خراب است. در چنین مواردی، تعیین صریح verify یا verify_fingerprint همان‌طور که در بالا نشان داده شد، منطقی است.

گواهی‌های کلاینت را می‌توان با پارامتر auth_cert مشخص کرد. اگر کلید و گواهی در یک فایل ذخیره شده باشند، مقدار آن می‌تواند یک رشته باشد:

[storage foo]
type = "caldav"
...
auth_cert = "/path/to/certificate.pem"

اگر کلید و گواهی جدا از هم باشند، می‌توان از یک لیست استفاده کرد:

[storage foo]
type = "caldav"
...
auth_cert = ["/path/to/certificate.crt", "/path/to/key.key"]

تغییر یافته در نسخه 0.7.0: پیکربندی گذرواژه به‌طور کامل دگرگون شده است.

برنامه Vdirsyncer می‌تواند گذرواژه‌ها را از چندین منبع دیگر به‌جز فایل پیکربندی دریافت کند.

فرض کنید پیکربندی زیر را دارید:

[storage foo]
type = "caldav"
url = ...
username = "foo"
password = "bar"

اما این‌که گذرواژه به‌صورت متن آشکار (cleartext) در فایل پیکربندی ذخیره شده است شما را نگران می‌کند. می‌توانید این‌گونه عمل کنید:

[storage foo]
type = "caldav"
url = ...
username = "foo"
password.fetch = ["command", "~/get-password.sh", "more", "args"]

می‌توانید نام کاربری را نیز به همین ترتیب دریافت کنید:

[storage foo]
type = "caldav"
url = ...
username.fetch = ["command", "~/get-username.sh"]
password.fetch = ["command", "~/get-password.sh"]

یا در واقع هر نوع پارامتر دیگری در یک بخش storage.

همچنین می‌توانید دستور را به‌عنوان یک رشته برای اجرا در شل (shell) ارسال کنید:

[storage foo]
...
password.fetch = ["shell", "~/.local/bin/get-my-password | head -n1"]

به‌عنوان مثال با pass https://www.passwordstore.org، ممکن است بخواهید چیزی شبیه به این را در فایل پیکربندی خود بنویسید:

password.fetch = ["command", "pass", "caldav"]

همان‌طور که در بالا نشان داده شد، می‌توانید از راهبرد command برای دریافت اعتبارنامه‌های خود از منابع دلخواه استفاده کنید. یک مورد استفاده بسیار رایج، دریافت گذرواژه از جاکلیدی سیستم است.

بسته پایتون keyring https://github.com/jaraco/keyring شامل یک ابزار خط فرمانی برای دریافت گذرواژه‌ها از مخزن گذرواژه سیستم‌عامل است. نصب:

pip install keyring

کاربرد پایه:

password.fetch = ["command", "keyring", "get", "example.com", "foouser"]

همچنین می‌توانید به سادگی گذرواژه را به صورت تعاملی درخواست کنید:

[storage foo]
type = "caldav"
username = "myusername"
password.fetch = ["prompt", "Password for CalDAV"]

برای خواندن گذرواژه از یک متغیر محیطی:

[storage foo]
type = "caldav"
username = "myusername"
password.fetch = ["command", "printenv", "DAV_PW"]

این روش به‌ویژه زمانی کارآمد است که از یک گذرواژه چندین بار استفاده می‌کنید (به عنوان مثال، برای یک فضای ذخیره‌سازی CardDAV و یک CalDAV). در bash، می‌توانید بدون چاپ گذرواژه روی صفحه، آن را خوانده و export کنید:

read -s DAV_PW "DAV Password: " && export DAV_PW

اگر می‌خواهید در یک تقویم عمومی و فقط‌خواندنی WebCAL https://en.wikipedia.org/wiki/Webcal مشترک شوید، اما نه سرور شما و نه برنامه‌های تقویمتان از آن پشتیبانی نمی‌کنند (یا پشتیبانی ناقصی دارند)، می‌توان از vdirsyncer برای همگام‌سازی چنین تقویم عمومی A با یک تقویم جدید B از خودتان و به‌روز نگه داشتن B استفاده کرد.

ابتدا باید تقویمی را ایجاد کنید که می‌خواهید تقویم WebCAL را با آن همگام‌سازی نمایید. بیشتر سرورها یک رابط تحت وب برای این کار ارائه می‌دهند. سپس باید نشانی URL پروتکل CalDAV تقویم خود را یادداشت کنید. توجه داشته باشید که این URL باید مستقیماً به تقویمی که تازه ایجاد کرده‌اید اشاره کند؛ به این معنی که برای هر تقویمی که دارید، یک نشانی اختصاصی خواهید داشت.

این تنظیمات را در پیکربندی vdirsyncer خود قرار دهید:

[pair holidays]
a = "holidays_public"
b = "holidays_private"
collections = null
[storage holidays_public]
type = "http"
# The URL to your iCalendar file.
url = "..."
[storage holidays_private]
type = "caldav"
# The direct URL to your calendar.
url = "..."
# The credentials to your CalDAV server
username = "..."
password = "..."

سپس vdirsyncer discover holidays و vdirsyncer sync holidays را اجرا کنید؛ تقویمی که پیش‌تر ایجاد کرده بودید باید با رویدادها پر شود..SS "گام ۳: پارامتر partial_sync"

در نسخهٔ 0.14 اضافه شد.

ممکن است در شرایطی قرار بگیرید که بخواهید برخی رویدادها را از تقویم holidays خود پنهان کرده یا تغییر دهید. اگر در این مرحله چنین کاری انجام دهید، متوجه خواهید شد که vdirsyncer پس از چند بار اجرای sync تمام تغییرات اعمال‌شده توسط شما را بازگردانی (revert) خواهد کرد. دلیل این امر آن است که vdirsyncer می‌خواهد همه‌چیز را همگام نگه دارد، و از آنجا که دسترسی‌های لازم برای اعمال تغییرات در تقویم عمومی تعطیلات (public holidays-calendar) را ندارد، نمی‌تواند تغییرات را در آن همگام‌سازی کند.

برای چنین اهدافی می‌توانید پارامتر partial_sync را روی ignore تنظیم کنید:

[pair holidays]
a = "holidays_public"
b = "holidays_private"
collections = null
partial_sync = ignore

برای اطلاعات بیشتر، مستندات پیکربندی <#partial-sync-def> را ببینید.

برنامهٔ vdirsyncer برای ذخیرهٔ پیکربندی خود از قالبی شبیه به ini استفاده می‌کند. تمام مقادیر در قالب JSON هستند؛ مقادیر نامعتبر JSON به‌صورت رشته (string) تفسیر خواهند شد:

x = "foo"  # String
x = foo  # Shorthand for same string
x = 42  # Integer
x = ["a", "b", "c"]  # List of strings
x = true  # Boolean
x = false
x = null  # Also known as None

[general]
status_path = ...
•
status_path: دایرکتوری‌ای که vdirsyncer برخی داده‌های اضافی را برای همگام‌سازی بعدی در آن ذخیره می‌کند.

این داده‌ها برای تشخیص این موضوع لازم است که آیا یک آیتم جدید به این معناست که در یک طرف اضافه شده یا در طرف دیگر حذف شده است. مسیرهای نسبی نسبت به دایرکتوری فایل پیکربندی تفسیر خواهند شد.

برای مشاهدهٔ جزئیات آنچه دقیقاً در آنجا قرار دارد، مقالهٔ «الگوریتم همگام‌سازی ساده» را در https://unterwaditzer.net/2016/sync-algorithm.html ببینید.

[pair pair_name]
a = ...
b = ...
#collections = null
#conflict_resolution = null
  • نام‌های جفت (Pair names) می‌توانند از هر نویسهٔ الفبایی-عددی و خط زیرین (underscore) تشکیل شوند.
  • a و b با استفاده از نام‌هایشان، به فضاهای ذخیره‌سازی جهت همگام‌سازی ارجاع می‌دهند.
  • collections: فهرستی از مجموعه‌ها (collections) برای همگام‌سازی در زمان اجرای vdirsyncer sync. همچنین «اطلاعات بیشتر دربارهٔ مجموعه‌ها» را در <#collections-tutorial> ببینید.

    مقادیر ویژهٔ "from a" و "from b" به vdirsyncer می‌گویند که کشف خودکار (autodiscovery) را روی یک فضای ذخیره‌سازی مشخص امتحان کند. این به معنای تمام مجموعه‌های سمت A / سمت B است.

    اگر مجموعه‌ای که می‌خواهید همگام‌سازی کنید در هر دو طرف نام یکسانی ندارد، می‌توانید از مقداری به شکل ["config_name", "name_a", "name_b"] استفاده کنید. این کار مجموعهٔ name_a در سمت A را با مجموعهٔ name_b در سمت B همگام‌سازی می‌کند. از config_name برای نمایش در آرگومان‌های CLI و ثبت رخدادها (logging) استفاده خواهد شد.

    مثال‌ها:

  • مقدار collections = ["from b", "foo", "bar"] باعث می‌شود vdirsyncer تمام مجموعه‌های سمت B و همچنین مجموعه‌های با نام "foo" و "bar" را همگام‌سازی کند.
  • مقدار collections = ["from b", "from a"] باعث می‌شود vdirsyncer تمام مجموعه‌های موجود در هر دو طرف را همگام‌سازی کند.
  • مقدار collections = [["bar", "bar_a", "bar_b"], "foo"] باعث می‌شود vdirsyncer مجموعهٔ bar_a از سمت A را با bar_b از سمت B، و همچنین مجموعهٔ foo را در هر دو طرف با یکدیگر همگام‌سازی نماید.
•
conflict_resolution: اختیاری است؛ نحوهٔ مدیریت تداخل‌ها (conflicts) را مشخص می‌کند. تداخل زمانی رخ می‌دهد که یک آیتم (رویداد، وظیفه) از زمان آخرین همگام‌سازی، در هر دو طرف تغییر کرده باشد. همچنین «حل تداخل» را در <#conflict-resolution-tutorial> ببینید.

مقادیر معتبر عبارتند از:

  • null، که در آن یک خطا نمایش داده شده و هیچ تغییری اعمال نمی‌شود.
  • "a wins" و "b wins"، که در آن کل آیتم از یک طرف برداشته می‌شود.
  • ["command", "vimdiff"]: دستور vimdiff <a> <b> فراخوانی خواهد شد که در آن <a> و <b> فایل‌های موقتی هستند که به ترتیب شامل آیتم هر یک از طرف‌ها می‌باشند. فایل‌ها باید در هنگام بازگشت دستور کاملاً یکسان باشند.
  • vimdiff را می‌توان با هر دستور دیگری جایگزین کرد. برای مثال، در POSIX مقدار ["command", "cp"] معادل با "a wins" است.
  • آیتم‌های اضافی فهرست، به‌عنوان آرگومان ارسال خواهند شد. برای مثال، ["command", "vimdiff", "--noplugin"] دستور vimdiff --noplugin را اجرا می‌کند.

برنامهٔ vdirsyncer هرگز تلاش نمی‌کند دو آیتم را «به‌طور خودکار ادغام» کند.

•
partial_sync: فرض کنید A فقط-خواندنی (read-only) است و B خیر. اگر آیتم‌ها را در B تغییر دهید، vdirsyncer نمی‌تواند تغییرات را در A همگام کند. در عوض چه باید رخ دهد؟
  • error: یک خطا نمایش داده می‌شود.
  • ignore: تغییر نادیده گرفته می‌شود. با این حال: رویدادهای حذف‌شده در B در صورتی که در A به‌روزرسانی شوند، دوباره ظاهر خواهند شد.
  • revert (پیش‌فرض): تغییر در همگام‌سازی بعدی بازگردانی می‌شود.

همچنین «همگام‌سازی با فضاهای ذخیره‌سازی فقط-خواندنی» را در <#partial-sync-tutorial> ببینید.

•
metadata: کلیدهای متاداده‌ای که باید هنگام اجرای vdirsyncer metasync همگام‌سازی شوند. مثال:
metadata = ["color", "displayname", "description", "order"]

این کار ویژگی‌های زیر را همگام‌سازی می‌کند:

•
implicit: فعال‌سازی ایجاد ضمنی مجموعه‌ها (collections). مثال:
implicit = "create"

هنگامی که روی "create" تنظیم شود، مجموعه‌های ناموجود به‌طور خودکار در طول همگام‌سازی و بدون پرسش از کاربر در هر دو طرف ایجاد می‌شوند. این امر جریان‌های کاری را که در آن‌ها همه مجموعه‌ها باید به‌صورت دوطرفه همگام‌سازی شوند، ساده می‌کند.

[storage storage_name]
type = ...
  • نام‌های storage می‌توانند از هر نویسهٔ حرفی-عددی و خط زیر (underscore) تشکیل شوند.
  • type مشخص می‌کند که چه نوع فضایی تعریف شده است. بخش Supported Storages را ببینید.
  • read_only تعیین می‌کند که آیا فضای ذخیره‌سازی باید فقط‌خواندنی در نظر گرفته شود یا خیر. مقدار true به این معنی است که همگام‌سازی هرگونه تغییر ایجادشده در طرف دیگر را نادیده می‌گیرد. مقدار false به معنای همگام‌سازی عادی دوطرفه است.
  • هر پارامتر دیگری به کلاس storage فرستاده می‌شود.

نکته:

لطفاً بخش Servers <#supported-servers> را نیز ببینید، چرا که ممکن است برخی سرورها به‌خوبی کار نکنند.
CalDAV.
[storage example_for_caldav]
type = "caldav"
#start_date = null
#end_date = null
#item_types = []
url = "..."
#username = ""
#password = ""
#verify = /path/to/custom_ca.pem
#auth = null
#useragent = "vdirsyncer/0.16.4"
#verify_fingerprint = null
#auth_cert = null

شما می‌توانید با استفاده از پارامترهای start_date و end_date یک محدوده زمانی را برای همگام‌سازی تنظیم کنید. درون این پارامترها، می‌توانید از هر عبارت پایتونی برای برگرداندن یک شیء معتبر datetime.datetime استفاده کنید. برای نمونه، کد زیر محدوده زمانی از یک سال پیش تا یک سال آینده را همگام می‌کند:

start_date = "datetime.now() - timedelta(days=365)"
end_date = "datetime.now() + timedelta(days=365)"

باید هر دو مشخص شوند یا هیچ‌کدام. پیش‌فرض، همگام‌سازی همه‌چیز است.

می‌توانید item_types را برای محدود کردن نوع آیتم‌های مورد نظر جهت همگام‌سازی تنظیم کنید. برای مثال، اگر فقط می‌خواهید رویدادها را همگام‌سازی کنید (اما هیچ وظیفه‌ای (task) را از سرور بارگیری نکنید)، عبارت item_types = ["VEVENT"] را تنظیم کنید. اگر می‌خواهید رویدادها و وظایف را همگام‌سازی کنید، اما برخی آیتم‌های VJOURNAL در سرور وجود دارند که نمی‌خواهید همگام شوند، از item_types = ["VEVENT", "VTODO"] استفاده کنید.

پارامترها
  • start_date -- تاریخ شروع محدوده زمانی برای نمایش، پیش‌فرض -inf است.
  • end_date -- تاریخ پایان محدوده زمانی برای نمایش، پیش‌فرض +inf است.
  • item_types -- نوع آیتم‌ها برای نمایش. پیش‌فرض، فهرست خالی است که به معنی نمایش همه است. این ویژگی به قابلیت‌های خاص سرور بستگی دارد و نتایج اعتبارسنجی نمی‌شوند.
  • url -- نشانی URL پایه یا یک URL به تقویم.
  • username -- نام کاربری برای احراز هویت.
  • password -- گذرواژه برای احراز هویت.
  • verify -- اختیاری. مسیر محلی به گواهی خودامضاشدهٔ SSL. برای اطلاعات بیشتر SSL and certificate validation <#ssl-tutorial> را ببینید.
  • verify_fingerprint -- اختیاری. اثرانگشت SHA256 گواهی مورد انتظار سرور. برای اطلاعات بیشتر SSL and certificate validation <#ssl-tutorial> را ببینید.
  • auth -- اختیاری. یکی از مقادیر basic، digest یا guess. پیش‌فرض Basic auth پیش‌دستانه است که اطلاعات احراز هویت را حتی در صورت عدم درخواست سرور ارسال می‌کند. این کار از یک رفت‌وبرگشت اضافی در هر درخواست جلوگیری می‌کند. در صورتی که این مورد با سرور شما مشکلی ایجاد می‌کند، guess را تنظیم کنید.
  • auth_cert -- اختیاری. مسیری به گواهی شامل گواهی کلاینت و کلید یا فهرستی از مسیرها به فایل‌های مربوط به آن‌ها.
  • useragent -- پیش‌فرض vdirsyncer است.
CardDAV.
[storage example_for_carddav]
type = "carddav"
url = "..."
#username = ""
#password = ""
#verify = /path/to/custom_ca.pem
#auth = null
#useragent = "vdirsyncer/0.16.4"
#verify_fingerprint = null
#auth_cert = null
#use_vcard_4 = false
پارامترها
  • url -- نشانی URL پایه یا یک URL به یک دفترچه نشانی (addressbook).
  • username -- نام کاربری برای احراز هویت.
  • password -- گذرواژه برای احراز هویت.
  • verify -- اختیاری. مسیر محلی به گواهی خودامضاشدهٔ SSL. برای اطلاعات بیشتر SSL and certificate validation <#ssl-tutorial> را ببینید.
  • verify_fingerprint -- اختیاری. اثرانگشت SHA256 گواهی مورد انتظار سرور. برای اطلاعات بیشتر SSL and certificate validation <#ssl-tutorial> را ببینید.
  • auth -- اختیاری. یکی از مقادیر basic، digest یا guess. پیش‌فرض Basic auth پیش‌دستانه است که اطلاعات احراز هویت را حتی در صورت عدم درخواست سرور ارسال می‌کند. این امر مانع از یک رفت‌وبرگشت اضافی در هر درخواست می‌شود. در صورتی که این مورد مشکلی برای سرور شما ایجاد می‌کند، guess را تنظیم کنید..IP • 2 auth_cert -- اختیاری. یا مسیری به یک گواهی شامل گواهی کلاینت و کلید، یا فهرستی از مسیرها به فایل‌های حاوی آن‌ها.
  • useragent -- پیش‌فرض vdirsyncer.
  • use_vcard_4 -- اینکه آیا سرور از vCard 4.0 استفاده می‌کند یا خیر.

برنامه Vdirsyncer از همگام‌سازی با تقویم‌های Google پشتیبانی می‌کند، با این محدودیت که فایل‌های VTODO توسط سرور رد می‌شوند.

همگام‌سازی با مخاطبین Google به دلیل غفلت در CardDAV API گوگل، قابلیت اطمینان کمتری دارد. ادعا شده است که پیاده‌سازی CardDAV گوگل از نظر امنیت داده‌ها یک فاجعه است. برای جزئیات به این پست وبلاگ https://evertpot.com/google-carddav-issues مراجعه کنید. همیشه از داده‌های خود نسخه پشتیبان تهیه کنید.

اشکال دیگر این است که برچسب‌های گروه در Google با ویژگی CATEGORIES در vCard https://www.rfc-editor.org/rfc/rfc6350#section-6.7.1 همگام‌سازی نمی‌شوند (همچنین برای مرجع به شماره موضوع #814 https://github.com/pimutils/vdirsyncer/issues/814 و شماره موضوع بالادستی #36761530 https://issuetracker.google.com/issues/36761530 مراجعه کنید) و ویژگی BDAY https://www.rfc-editor.org/rfc/rfc6350#section-6.2.5 زمانی که تنها بخشی از اطلاعات تاریخ موجود باشد (برای مثال سال وجود نداشته باشد) همگام‌سازی نمی‌شود.

در اولین اجرا از شما خواسته می‌شود برنامه را برای دسترسی به حساب Google احراز هویت کنید.

برای استفاده از این نوع فضای ذخیره‌سازی، باید برخی وابستگی‌های اضافی را نصب کنید:

pip install vdirsyncer[google]

علاوه بر این، شما باید خودتان vdirsyncer را به عنوان یک برنامه ثبت کنید تا client_id و client_secret را دریافت نمایید، زیرا قرار دادن ثابت (hardcode) آن‌ها در نرم‌افزارهای متن‌باز خلاف شرایط خدمات Google است [googleterms] <#googleterms>:

1.
به Google API Manager بروید https://console.developers.google.com
2.
یک پروژه جدید با هر نام دلخواهی ایجاد کنید.
2.
درون آن پروژه، APIهای "CalDAV" و "CardDAV" را فعال کنید (نه APIهای Calendar و Contacts، چرا که آن‌ها متفاوت هستند و کار نخواهند کرد). باید یک جعبه جستجو وجود داشته باشد که بتوانید این عبارات را در آن وارد کنید.
3.
در نوار کناری، "Credentials"، سپس "Create Credentials" را انتخاب کرده و یک "OAuth Client ID" جدید بسازید.

ابتدا از شما خواسته می‌شود یک OAuth consent screen بسازید. آن فرم را به هر شکلی که مایلید پر کنید.

پس از راه‌اندازی صفحه رضایت (consent screen)، ایجاد "OAuth Client ID' جدید را به پایان برسانید. نوع برنامه صحیح، "Desktop application" است.

4.
در نهایت باید یک Client ID و یک Client secret در اختیار داشته باشید. این موارد را در پیکربندی فضای ذخیره‌سازی خود وارد کنید.

پارامتر token_file باید مسیری به فایلی باشد که vdirsyncer بتواند بعداً داده‌های مربوط به احراز هویت را در آن ذخیره کند. نیازی به ایجاد این فایل توسط خودتان یا نوشتن چیزی درون آن نیست.

[googleterms]
شرایط خدمات (ToS) https://developers.google.com/terms/?hl=th را ببینید، بخش "Confidential Matters".

نکته:

شما باید با استفاده از یک صفحه مخفی تنظیمات https://calendar.google.com/calendar/syncselect مشخص کنید که Google کدام تقویم‌ها را به vdirsyncer ارائه دهد.
تقویم Google.
[storage example_for_google_calendar]
type = "google_calendar"
token_file = "..."
client_id = "..."
client_secret = "..."
#start_date = null
#end_date = null
#item_types = []

لطفاً برای اطلاعات بیشتر درباره پارامترهای item_types و بازه زمانی به caldav مراجعه کنید.

پارامترها (Parameters)
  • token_file -- مسیر فایلی که توکن‌های دسترسی در آن ذخیره می‌شوند.
  • client_id/client_secret -- اطلاعات احراز هویت OAuth، به‌دست‌آمده از Google API Manager.
مخاطبین Google.
[storage example_for_google_contacts]
type = "google_contacts"
token_file = "..."
client_id = "..."
client_secret = "..."
پارامترها (Parameters)
  • token_file -- مسیر فایلی که توکن‌های دسترسی در آن ذخیره می‌شوند.
  • client_id/client_secret -- اطلاعات احراز هویت OAuth، به‌دست‌آمده از Google API Manager.

فرآیند فعلی ایده‌آل نیست، اما Google رابط‌های برنامه‌نویسی قبلی مورد استفاده برای این کار را بدون ارائه جایگزینی مناسب منسوخ کرده است. برای گفتگو پیرامون این موضوع به شماره موضوع #975 https://github.com/pimutils/vdirsyncer/issues/975 مراجعه کنید..SS محلی (Local)

با مشخص کردن یک دایرکتوری، هر مورد را در فایل اختصاصی خودش ذخیره می‌کند.
[storage example_for_filesystem]
type = "filesystem"
path = "..."
fileext = "..."
#encoding = "utf-8"
#post_hook = null
#pre_deletion_hook = null
#fileignoreext = ".tmp"

می‌تواند همراه با khal http://lostpackets.de/khal استفاده شود. برای توصیف رسمی‌تر این قالب، The Vdir Storage Format <> را ببینید.

دایرکتوری‌هایی که نامشان با نقطه آغاز می‌شود نادیده گرفته می‌شوند تا برای مثال استفاده از کنترل نسخه آسان‌تر شود.

پارامترها (Parameters)
  • path -- مسیر مطلق به یک vdir/مجموعه (collection). اگر این پارامتر در ترکیب با پارامتر collections در بخش pair استفاده شود، در عوض باید به یک دایرکتوری از vdirها اشاره کند.
  • fileext -- پسوند فایل مورد استفاده (برای نمونه .txt). در href گنجانده شده است، بنابراین اگر پسوند فایل را پس از همگام‌سازی تغییر دهید، باعث بارگیری مجدد همه چیز خواهد شد (اما نباید باعث هیچ نوع از دست رفتن داده‌ای شود). برای سازگاری با قالب vset باید از .vcf یا .ics استفاده کنید. توجه داشته باشید که اگر در اینجا از یک رشته خالی استفاده کنید، metasync کار نخواهد کرد.
  • encoding -- کدگذاری فایل برای موارد، هم محتوا و هم نام فایل.
  • post_hook -- فرمانی برای اجرا به ازای ایجاد یا تغییر هر مورد. این فرمان به همراه مسیر فایل جدید/به‌روزشده فراخوانی خواهد شد.
  • pre_deletion_hook -- فرمانی برای اجرا به ازای حذف هر مورد. این فرمان به همراه مسیر فایل حذف‌شده فراخوانی خواهد شد.
  • fileeignoreext -- پسوند فایل برای نادیده گرفتن. این گزینه تنها در صورتی مفید است که fileext روی یک رشته خالی تنظیم شده باشد. مقدار پیش‌فرض .tmp است.
داده‌ها را در یک فایل محلی واحد .vcf یا .ics ذخیره می‌کند.

این فضای ذخیره‌سازی اساساً نحوه پیوند موارد در فایل را حدس می‌زند.

در نسخه 0.1.6 اضافه شد.

نکته:

این فضای ذخیره‌سازی بسیار کُند است و بعید است این وضعیت تغییر کند. اگر با سناریوی کاربردی شما همخوانی دارد، باید استفاده از filesystem را در نظر بگیرید.
پارامترها (Parameters)
  • path -- مسیر فایلی که باید در آن نوشته شود. در صورت استفاده از مجموعه‌ها، این مسیر باید شامل %s به عنوان یک جانگهدار برای نام مجموعه باشد.
  • encoding -- این که فایل باید از چه کدگذاری استفاده کند. مقدار پیش‌فرض UTF-8 است.

مثال برای همگام‌سازی با caldav:

[pair my_calendar]
a = my_calendar_local
b = my_calendar_remote
collections = ["from a", "from b"]
[storage my_calendar_local]
type = "singlefile"
path = ~/.calendars/%s.ics
[storage my_calendar_remote]
type = "caldav"
url = https://caldav.example.org
#username =
#password =

مثال برای همگام‌سازی با caldav با استفاده از یک مجموعه null:

[pair my_calendar]
a = my_calendar_local
b = my_calendar_remote
[storage my_calendar_local]
type = "singlefile"
path = ~/my_calendar.ics
[storage my_calendar_remote]
type = "caldav"
url = https://caldav.example.org/username/my_calendar
#username =
#password =

این فضاهای ذخیره‌سازی از نوشتن روی آیتم‌های خود پشتیبانی نمی‌کنند، در نتیجه read_only به‌طور پیش‌فرض بر روی true تنظیم شده است. تغییر read_only به false در آن‌ها منجر به بروز خطا می‌شود.

استفاده از یک فایل سادهٔ .ics (یا مشابه آن) از وب. تقویم‌های webcal:// باید با این مورد استفاده شوند، اما شما باید webcal:// را با http://، یا بهتر از آن با https:// جایگزین کنید.
[pair holidays]
a = holidays_local
b = holidays_remote
collections = null
[storage holidays_local]
type = "filesystem"
path = ~/.config/vdir/calendars/holidays/
fileext = .ics
[storage holidays_remote]
type = "http"
url = https://example.com/holidays_from_hicksville.ics
#filter_hook = null

بسیاری از ارائه‌دهندگان WebCAL شناسه‌های یکتای (UID) تمام مؤلفه‌های VEVENT را به‌صورت آنی (on-the-fly) تولید می‌کنند؛ یعنی هر بار که تقویم بارگیری می‌شود، همه UIDها تغییر می‌کنند. این امر باعث می‌شود بسیاری از برنامه‌های همگام‌سازی چنین برداشت کنند که تمام رویدادها حذف شده و موارد جدیدی ایجاد شده‌اند، و متعاقباً باعث بارگذاری‌ها و حذف‌های غیرضروری فراوانی در طرف دیگر می‌شود. Vdirsyncer شناسه‌های UID حاصل از http را کاملاً نادیده می‌گیرد و آن‌ها را با یک هش از محتوای استانداردسازی‌شده آیتم جایگزین می‌کند.

پارامترها (Parameters)
  • url -- نشانی اینترنتی (URL) فایل .ics.
  • username -- نام کاربری برای احراز هویت.
  • password -- گذرواژه برای احراز هویت.
  • verify -- اختیاری. مسیر محلی به یک گواهی SSL خودامضاشده. برای اطلاعات بیشتر، بخش اعتبارسنجی گواهی و SSL را ببینید: <#ssl-tutorial>
  • verify_fingerprint -- اختیاری. اثر انگشت (fingerprint) از نوع SHA256 برای گواهی مورد انتظار سرور. برای اطلاعات بیشتر، بخش اعتبارسنجی گواهی و SSL را ببینید: <#ssl-tutorial>
  • auth -- اختیاری. یکی از مقادیر basic، digest یا guess. پیش‌فرض Basic auth پیش‌دستانه است که اطلاعات احراز هویت را حتی در صورت درخواست نکردن سرور ارسال می‌کند. این کار از یک رفت‌وبرگشت (roundtrip) اضافه در هر درخواست جلوگیری می‌کند. در صورتی که این مورد با سرور شما مشکل ایجاد می‌کند، مقدار آن را روی guess قرار دهید.
  • auth_cert -- اختیاری. یا مسیری به یک گواهی حاوی گواهی کلاینت و کلید، یا فهرستی از مسیرها به فایل‌های شامل آن‌ها.
  • useragent -- پیش‌فرض vdirsyncer است.
  • filter_hook -- اختیاری. یک دستور فیلتر برای فراخوانی به‌ازای هر آیتم دریافت‌شده، که به‌صورت خام به stdin ارسال شده و نتیجه را از طریق stdout بازمی‌گرداند. اگر هیچ خروجی توسط دستور فیلتر بازگردانده نشود، آیتم نادیده گرفته می‌شود. از این قابلیت می‌توان برای تغییر فیلدها در صورت نیاز هنگام کار با ارائه‌دهندگانی که رویدادهای ناقص یا ناصحیح تولید می‌کنند استفاده کرد.

بخش زیر شامل آموزش‌هایی است که صریحاً دربارهٔ هیچ‌یک از عملکردهای اصلی vdirsyncer نیستند. آن‌ها معمولاً نحوهٔ یکپارچه‌سازی vdirsyncer با نرم‌افزارهای شخص ثالث را نشان می‌دهند. به همین دلیل، ممکن است اطلاعات مربوط به آن نرم‌افزارها تنها برای نسخه‌های خاصی از آن‌ها صدق کند.

نکته:

لطفاً آموزش‌های خود را نیز مشارکت دهید <>! این صفحات معمولاً تنها ناقص (stub) هستند و مثال‌های جامعی ندارند.

پیش از هر چیز، Claws-Mail فقط از قابلیت‌های فقط‌خواندنی (read-only) برای vCardها پشتیبانی می‌کند. این برنامه تنها می‌تواند مخاطبین را بخواند، اما فاقد ویرایشگر است.

ما باید vdirsyncer را نصب کنیم؛ برای این منظور به اینجا مراجعه کنید: <>. سپس باید چند پوشه ایجاد کنیم:

mkdir ~/.vdirsyncer
mkdir ~/.contacts

اکنون پیکربندی را برای vdirsyncer ایجاد می‌کنیم. فایل ~/.vdirsyncer/config را با یک ویرایشگر متن باز کنید. پیکربندی باید به این صورت باشد:

[general]
status_path = "~/.vdirsyncer/status/"
[storage local]
type = "singlefile"
path = "~/.contacts/%s.vcf"
[storage online]
type = "carddav"
url = "CARDDAV_LINK"
username = "USERNAME"
password = "PASSWORD"
read_only = true
[pair contacts]
a = "local"
b = "online"
collections = ["from a", "from b"]
conflict_resolution = "b wins"
  • در بخش general، مسیر پوشه وضعیت (status) را برای مجموعه‌های شناسایی‌شده و به‌طور کلی مواردی که باید بین دفعات همگام‌سازی حفظ شوند، تعیین می‌کنیم.
  • در بخش local مشخص می‌کنیم که تمام مخاطبین باید در یک تک‌فایل همگام شوند و همچنین مسیر قرارگیری مخاطبین را تعیین می‌کنیم.
  • در بخش online باید مقادیر url، username و password را مطابق با مشخصات خود تغییر دهید. ما همچنین این فضای ذخیره‌سازی را روی read-only قرار می‌دهیم تا هیچ تغییری به سرور بازگردانده و همگام نشود. در هر صورت Claws-Mail نباید قادر به اعمال هیچ تغییری باشد، اما این یک گام ایمنی بیشتر است تا در صورت خرابی فایل‌ها یا عملکرد غیرمنتظره vdirsyncer مشکلی پیش نیاید. اگر می‌خواهید قادر به ویرایش این فایل‌ها به‌صورت محلی باشید، می‌توانید این بخش را نادیده بگیرید.
  • در بخش آخر پیکربندی می‌کنیم که در صورت بروز تداخل (conflict)، مخاطبین آنلاین اولویت داشته باشند (برنده شوند). این بخش را به هر شکل که مایلید تنظیم کنید؛ مقدار مناسب بستگی به این دارد که کدام سمت به احتمال زیاد به‌روزتر است.

اکنون مخاطبین خود را شناسایی و همگام‌سازی می‌کنیم:

vdirsyncer discover contacts
vdirsyncer sync contacts

برنامه Claws-Mail را باز کنید. به مسیر Tools => Addressbook بروید.

روی Addressbook => New vCard کلیک کنید. نامی برای دفترچه مخاطبین انتخاب نمایید.

سپس در پوشه ~/.contacts/ به دنبال vCard بگردید. روی ok کلیک کنید، تا مخاطبین خود را ببینید.

نکته:

برنامه Claws-Mail تنها مخاطبینی را نشان می‌دهد که دارای نشانی رایانامه باشند.

در پایان یک crontab ایجاد می‌کنیم تا vdirsyncer مخاطبین ما را به‌طور خودکار هر ۳۰ دقیقه همگام‌سازی کند:

crontab -e

در انتهای آن فایل این خط را وارد کنید:

*/30 * * * * /usr/local/bin/vdirsyncer sync > /dev/null

و کار تمام است!

ابزار vdirsyncer شامل فایل‌های واحد (unit files) برای اجرا در بازه‌های زمانی مشخص (به‌طور پیش‌فرض هر ۵±۱۵ دقیقه) است.

نکته:

این فایل‌ها هنگام نصب از طریق pip نصب نمی‌شوند و فقط همراه با بسته‌های توزیع ارائه می‌گردند. اگر برنامه را از طریق pip نصب کرده‌اید یا توزیع شما فایل‌های واحد systemd را ارائه نمی‌دهد، باید vdirsyncer.service https://raw.githubusercontent.com/pimutils/vdirsyncer/main/contrib/vdirsyncer.service و vdirsyncer.timer https://raw.githubusercontent.com/pimutils/vdirsyncer/main/contrib/vdirsyncer.timer را در یکی از مسیرهای /etc/systemd/user/ یا ~/.local/share/systemd/user بارگیری نمایید.

برای فعال‌سازی تایمر، کافی است دستور systemctl --user enable vdirsyncer.timer را اجرا کنید. جهت مشاهده لاگ‌های اجراهای پیشین، از journalctl --user -u vdirsyncer استفاده کنید.

کاملاً محتمل است که بازه زمانی پیش‌فرض "هر پانزده دقیقه" مطابق میل شما نباشد. هیچ پیش‌فرضی مناسب همگان نخواهد بود، اما این مورد با اجرای دستور زیر به‌سادگی قابل پیکربندی است:

systemctl --user edit vdirsyncer.timer

این دستور یک ویرایشگر خالی باز می‌کند که در آن می‌توانید با افزودن خطوط زیر، تایمر را بازنویسی کنید:

OnBootSec=5m  # This is how long after boot the first run takes place.
OnUnitActiveSec=15m  # This is how often subsequent runs take place.

قالب iCalendar همچنین از ذخیره‌سازی وظایف در قالب ورودی‌های VTODO با همان پسوند فایل رویدادهای عادی پشتیبانی می‌کند: .ics. بسیاری از سرورهای CalDAV از همگام‌سازی وظایف پشتیبانی می‌کنند و vdirsyncer نیز همین‌طور است.

برنامه todoman http://todoman.readthedocs.io یک مدیر وظیفه تحت خط فرمان (CLI) با پشتیبانی از vdir <> است. رابط کاربری آن شبیه به Taskwarrior یا برنامه خط فرمانی todo.txt است. می‌توانید filesystem <#storage-filesystem> را به همراه آن به کار ببرید.

برای این آموزش از NextCloud استفاده خواهیم کرد.

با فرض داشتن چنین پیکربندی‌ای:

[general]
status_path = "~/.vdirsyncer/status/"
[pair calendars]
conflict_resolution = "b wins"
a = "calendars_local"
b = "calendars_dav"
collections = ["from b"]
metadata = ["color", "displayname"]
[storage calendars_local]
type = "filesystem"
path = "~/.calendars/"
fileext = ".ics"
[storage calendars_dav]
type = "caldav"
url = "https://nextcloud.example.net/"
username = "..."
password = "..."

سپس دستور vdirsyncer sync تقویم‌های نمونه NextCloud https://nextcloud.com شما را با زیرپوشه‌های ~/.calendar/ همگام‌سازی خواهد کرد.

این متن را در ~/.config/todoman/config.py بنویسید:

path = "~/.calendars/*"

الگوی glob <https://en.wikipedia.org/wiki/Glob_(programming)> در path با تمام زیرپوشه‌های درون ~/.calendars/ تطابق خواهد داشت، که دقیقاً همان فهرست‌های وظایف مدنظر ما است. اکنون می‌توانید همان‌گونه که در مستندات آن http://todoman.readthedocs.io آمده است از todoman استفاده کنید و برای همگام‌سازی تغییرات با NextCloud دستور vdirsyncer sync را اجرا نمایید.

برنامه‌های کلاینت زیر نیز بر بستر CalDAV همگام‌سازی می‌کنند:

برنامه‌های بیشتر، با صفحه‌های ناموجود:

برنامهٔ Vdirsyncer به‌طور مداوم با آخرین نسخهٔ Baikal http://sabre.io/baikal آزمایش می‌شود.

•
برنامهٔ Baikal تا نسخهٔ 0.2.7 نیز از یک نسخهٔ قدیمی SabreDAV با همان مشکل ownCloud استفاده می‌کند؛ گزارش #160 https://github.com/pimutils/vdirsyncer/issues/160 را ببینید. این مشکل در نسخه‌های بعدی برطرف شده است.

نرم‌افزار DavMail http://davmail.sourceforge.net یک برنامهٔ پراکسی (پیشکار) است که امکان استفاده از کلاینت‌های Card- و CalDAV را با Outlook فراهم می‌کند. این ابزار به شما اجازه می‌دهد از vdirsyncer به همراه Outlook استفاده کنید.

در عمل، میزان موفقیت شما با DavMail ممکن است بسیار متغیر باشد. بسته به سرور Exchange شما، ممکن است با انواع خطاهای عجیب‌وغریب (از جمله از دست رفتن داده‌ها) مواجه شوید.

کاملاً مطمئن شوید که از آخرین نسخهٔ DavMail استفاده می‌کنید:

[storage outlook]
type = "caldav"
url = "http://localhost:1080/users/user@example.com/calendar/"
username = "user@example.com"
password = "..."
  • نسخه‌های قدیمی‌تر DavMail با URLها به‌صورت غیرحساس به حروف بزرگ و کوچک (case-insensitively) رفتار می‌کنند. گزارش #144 https://github.com/pimutils/vdirsyncer/issues/144 را ببینید.
  • برنامهٔ DavMail داده‌های معیوب و ناهنجار را در سرور Exchange بسیار ضعیف مدیریت می‌کند. در چنین مواردی، ابزار Calendar Checking Tool for Outlook https://www.microsoft.com/en-us/download/details.aspx?id=28786 ممکن است کمک‌کننده باشد.
  • در برخی موارد، ممکن است خطاهایی دربارهٔ رویدادهای تکراری مشاهده کنید؛ چیزی شبیه به این:
error: my_calendar/calendar: Storage "my_calendar_remote/calendar" contains multiple items with the same UID or even content. Vdirsyncer will now abort the synchronization of this collection, because the fix for this is not clear; It could be the result of a badly behaving server. You can try running:
error:
error:     vdirsyncer repair my_calendar_remote/calendar
error:
error: But make sure to have a backup of your data in some form. The offending hrefs are:
[...]

به‌منظور برطرف کردن این مورد، می‌توانید اسکریپت پاورشل Remove-DuplicateAppointments.ps1 https://blogs.msdn.microsoft.com/emeamsgdev/2015/02/12/powershell-remove-duplicate-calendar-appointments را که مایکروسافت برای حذف موارد تکراری ارائه داده است، امتحان کنید.

برنامهٔ Vdirsyncer به‌طور مداوم با FastMail https://www.fastmail.com آزمایش می‌شود؛ با تشکر از آن‌ها بابت ارائهٔ یک حساب رایگان برای این منظور. هیچ مشکل شناخته‌شده‌ای با آن وجود ندارد. صفحات پشتیبانی FastMail https://www.fastmail.com/help/technical/servernamesandports.html تنظیمات لازم برای استفاده را ارائه می‌دهند:

[storage cal]
type = "caldav"
url = "https://caldav.fastmail.com/"
username = "..."
password = "..."
[storage card]
type = "carddav"
url = "https://carddav.fastmail.com/"
username = "..."
password = "..."

استفاده از vdirsyncer با Google Calendar از نسخهٔ 0.10 امکان‌پذیر است، اما مرتباً آزمایش نمی‌شود. می‌توانید از google_contacts <#storage-google_contacts> و google_calendar <#storage-google_calendar> استفاده کنید.

برای اطلاعات بیشتر، issue #202 https://github.com/pimutils/vdirsyncer/issues/202 و issue #8 https://github.com/pimutils/vdirsyncer/issues/8 را ببینید.

ابزار vdirsyncer به‌طور منظم با iCloud https://www.icloud.com آزمایش می‌شود.

[storage cal]
type = "caldav"
url = "https://caldav.icloud.com/"
username = "..."
password = "..."
[storage card]
type = "carddav"
url = "https://contacts.icloud.com/"
username = "..."
password = "..."

مشکلات:

  • ابزار vdirsyncer نمی‌تواند احراز هویت دومرحله‌ای (two-factor auth) را با iCloud انجام دهد (به نظر نمی‌رسد راهی برای انجام احراز هویت دومرحله‌ای از طریق APIهای DAV وجود داشته باشد). در عوض باید از گذرواژه‌های مخصوص برنامه (app-specific passwords) https://support.apple.com/en-us/HT204397 استفاده کنید.
  • سرویس iCloud هنگام ایجاد مجموعه‌ها نیازمندی‌های خاصی دارد. در اصل vdirsyncer قادر به انجام آن است، اما توصیه می‌شود آن‌ها را از طریق یک کلاینت Apple (یا واسط وب iCloud) ایجاد کنید.
  • سرویس iCloud حداقل طولی را برای نام‌های مجموعه الزامی می‌داند.
  • تقویم‌های ایجادشده توسط vdirsyncer نمی‌توانند به‌عنوان فهرست وظایف (tasklists) استفاده شوند.

ابزار vdirsyncer به‌طور مداوم با آخرین نسخهٔ nextCloud https://nextcloud.com آزمایش می‌شود:

[storage cal]
type = "caldav"
url = "https://nextcloud.example.com/"
username = "..."
password = "..."
[storage card]
type = "carddav"
url = "https://nextcloud.example.com/"
•
اشتراک‌های WebCAL توسط vdirsyncer قابل شناسایی نیستند. این issue مرتبط را ببینید: https://github.com/nextcloud/calendar/issues/63.

ابزار vdirsyncer به‌طور مداوم با آخرین نسخهٔ ownCloud https://owncloud.org آزمایش می‌شود:

[storage cal]
type = "caldav"
url = "https://example.com/remote.php/dav/"
username = ...
password = ...
[storage card]
type = "carddav"
url = "https://example.com/remote.php/dav/"
username = ...
password = ...
•
نسخه‌های قدیمی‌تر از 7.0.0: سرویس ownCloud از SabreDAV استفاده می‌کند که در تشخیص تداخل‌ها و شرایط رقابتی (race-conditions) مشکلاتی داشت. این مشکلات گزارش شده و در مخزن SabreDAV رفع شده‌اند، و اصلاحیهٔ متناظر نیز از نسخهٔ 7.0.0 در ownCloud اعمال شده است. برای اطلاعات بیشتر issue #16 https://github.com/pimutils/vdirsyncer/issues/16 را ببینید.

سرور Radicale http://radicale.org بسیار سبک است؛ با این حال، استانداردهای CalDAV و CardDAV را به‌صورت عمدی به‌طور کامل پیاده‌سازی نمی‌کند، که ممکن است حتی با کلاینت‌های بسیار خوش‌ساخت نیز به بروز مشکلاتی بینجامد. فارغ از عدم انطباق آن با استانداردها، چندین مشکل دیگر در کیفیت کد و شیوهٔ نگهداری آن وجود دارد. به‌جای آن، استفاده از مواردی مانند Xandikos <> را در نظر بگیرید.

با این وجود، vdirsyncer به‌طور مداوم با نسخهٔ git و آخرین انتشار PyPI از Radicale آزمایش می‌شود.

  • ابزار Vdirsyncer نمی‌تواند روی Radicale مجموعه (collection) ایجاد کند.
  • سرور Radicale از بازه‌های زمانی در calendar-query پروتکل CalDAV https://github.com/Kozea/Radicale/issues/146 پشتیبانی نمی‌کند، بنابراین مقداردهی start_date و end_date برای caldav <#storage-caldav> هیچ اثری نداشته یا عواقب پیش‌بینی‌نشده‌ای خواهد داشت.
  • نسخه‌های Radicale قدیمی‌تر از 0.9b1 هنگام پردازش پرس‌وجوهای منطبق با RFC برای تمام آیتم‌های یک مجموعه https://github.com/Kozea/Radicale/issues/143 با شکست مواجه می‌شوند.

    برای اینکه vdirsyncer با آن نسخه‌ها کار کند، باید مقدار item_types = ["VTODO", "VEVENT"] را در caldav <#storage-caldav> تنظیم کنید.

برنامهٔ Xandikos https://github.com/jelmer/xandikos یک سرور سبک و در عین حال کامل برای CalDAV و CardDAV است که از git به‌عنوان پشتیبان استفاده می‌کند. ابزار vdirsyncer به‌طور مداوم در برابر آخرین نسخهٔ آن آزمایش می‌شود.

پس از اجرای ./bin/xandikos --defaults -d $HOME/dav، باید بتوانید vdirsyncer را به‌صورت زیر به ریشهٔ Xandikos متصل کنید:

[storage cal]
type = "caldav"
url = "https://xandikos.example.com/"
username = "..."
password = "..."
[storage card]
type = "carddav"
url = "https://xandikos.example.com/"
username = "..."
password = "..."

برای هرگونه پرسش یا مشکل بی‌پاسخ، بخش Support and Contact <> را ببینید.

ImportError: No module named packages.urllib3.poolmanager

ImportError: cannot import name iter_field_objects

توزیع دبیان و امروزه حتی سایر توزیع‌ها تغییراتی را روی بستهٔ requests اعمال می‌کنند که با بسته‌هایی که یک requests استاندارد را فرض می‌کنند سازگار نیست. این موضوع به دلیل سرسختی هر دو طرف است.

برای مشاهدهٔ بحث‌های پیشین، گزارش شمارهٔ #82 https://github.com/pimutils/vdirsyncer/issues/82 و گزارش شمارهٔ #140 https://github.com/pimutils/vdirsyncer/issues/140 را ببینید. برای دور زدن این مشکل یک راهکار دارید؛ یعنی نصب vdirsyncer در یک محیط مجازی (virtual environment)، بخش Manual installation <#manual-installation> را ببینید.

نکته:

  • لطفاً برای پرسش‌ها و درخواست‌های پشتیبانی، بخش Support and Contact <> را بخوانید.
  • همهٔ شرکت‌کنندگان باید از مرام‌نامهٔ رفتاری pimutils Code of Conduct http://pimutils.org/coc پیروی کنند.

ما از بخش مسائل گیت‌هاب (GitHub issues) https://github.com/pimutils/vdirsyncer/issues برای سازمان‌دهی گزارش‌های باگ و درخواست‌های ویژگی‌های جدید استفاده می‌کنیم.

برچسب‌های زیر https://github.com/pimutils/vdirsyncer/labels قابل توجه هستند:

  • برچسب "Planning" برای مواردی است که هنوز درباره آن‌ها تصمیم‌گیری نشده است، اما دست‌کم گفتگوهایی پیرامونشان وجود دارد.
  • برچسب "Blocked" برای مواردی است که در حال حاضر به دلیل وجود مشکلی دیگر که هنوز حل نشده، امکان کار روی آن‌ها نیست. این مشکل ممکن است برای نمونه، یک باگ در یکی از وابستگی‌های نرم‌افزاری باشد.
  • برچسب "Ready" شامل مواردی است که آماده کار و پیاده‌سازی هستند.

اگر صرفاً قصد دارید مشارکت را آغاز کنید، موارد "ready" گزینه مناسبی هستند. مواردی که همچنان در وضعیت "Planning" قرار دارند نیز گزینه دیگرند، اما نیازمند تفکر اولیه بیشتری بوده و ممکن است در عمل غیرقابل‌حل از آب درآیند یا دست‌کم سخت‌تر از حد انتظار باشند. از سوی دیگر، بسته به نوع نگاه شما، این موارد معمولاً چالش‌برانگیزتر و جالب‌تر نیز هستند.

تمام این برچسب‌ها همچنین به صورت تابلوی کانبان در waffle.io https://waffle.io/pimutils/vdirsyncer در دسترس هستند. این نما صرفاً دیدگاهی جایگزین از تمامی مسائل است، اما ممکن است درک آن ساده‌تر باشد.

برای اطلاعات بیشتر، با من تماس بگیرید <> یا روی موارد مربوطه دیدگاه بگذارید.

  • اطمینان حاصل کنید که مشکل شما قبلاً در مشکلات شناخته‌شده (Known Problems) <> فهرست نشده باشد.
  • مطمئن شوید که قطعاً از آخرین نسخه vdirsyncer استفاده می‌کنید. برای کاربران برخی از توزیع‌های لینوکس مانند Debian یا Fedora، ممکن است این نسخه همان نسخه‌ای نباشد که توزیع شما ارائه می‌دهد. در چنین مواردی لطفاً باگ را برای بسته توزیع ثبت کنید، نه برای بالادست (upstream) vdirsyncer.
  • هنگام قرار دادن خروجی vdirsyncer، از --verbosity=DEBUG استفاده کنید.

اگر ویژگی جدیدی پیشنهاد می‌کنید، به یاد داشته باشید که vdirsyncer تلاش می‌کند تا یک کلاینت کامل تقویم یا مخاطبین نباشد، بلکه تنها نرم‌افزاری باشد که تمام داده‌ها را همگام‌سازی می‌کند. نگاهی به مستندات نرم‌افزارهایی که با vdirsyncer کار می‌کنند <> بیندازید.

  • پیش از پیاده‌سازی، ابتدا همه‌چیز را در سامانه پیگیری اشکالات به بحث بگذارید (یا از راهی دیگر با من ارتباط برقرار کنید).
  • مطمئن شوید که آزمون‌ها با موفقیت پاس می‌شوند. برای اجرای آن‌ها بخش زیر را ببینید.
  • اما نه صرفاً به این دلیل که آزمون‌های بسیار کمی نوشته‌اید.
  • نام خود را به AUTHORS.rst اضافه کنید، و همچنین یادداشتی به CHANGELOG.rst بیفزایید.

برای بسیاری از وصله‌ها، ممکن است واگذاری اجرای آزمون‌ها به CI کافی باشد. با این حال، CI کند است، بنابراین ممکن است بخواهید آن‌ها را به صورت محلی نیز اجرا کنید. برای این کار، یک virtualenv http://virtualenv.readthedocs.io راه‌اندازی کرده و دستورات زیر را درون آن اجرا کنید:

# Install development dependencies, including:
#  - vdirsyncer from the repo into the virtualenv
#  - style checks and formatting (ruff)
make install-dev
# Install git commit hook for some extra linting and checking
pre-commit install

سپس می‌توانید دستورات زیر را اجرا کنید:

pytest                # The normal testsuite
pre-commit run --all  # Run all linters (which also run via pre-commit)
make -C docs html     # Build the HTML docs, output is at docs/_build/html/
make -C docs linkcheck  # Check docs for any broken links

فایل Makefile گزینه‌های فراوانی دارد که به شما اجازه می‌دهد کنترل کنید چه آزمون‌هایی اجرا شوند و کدام سرورها مورد آزمایش قرار گیرند. به کدهای آن نگاهی بیندازید که در آنجا همگی مقداردهی اولیه و مستند شده‌اند.

برای اجرای آزمون در برابر یک سرور DAV خاص، از DAV_SERVER استفاده کنید:

make DAV_SERVER=xandikos test

سرور درون یک کانتینر docker راه‌اندازی شده و در پایان اجرای مجموعه آزمون‌ها متوقف خواهد شد.

اگر هرگونه سؤالی دارید، بدون تردید در این زمینه ایشو (issue) باز کنید..SS "ساختار مجموعه آزمون (Structure of the testsuite)"

درون tests/، سه پوشه اصلی وجود دارد:

  • پوشه system شامل آزمون‌های سیستم و همچنین یکپارچه‌سازی است. یک قاعده کلی این است: اگر آزمون از فایل‌های موقت استفاده می‌کند، آن را اینجا قرار دهید.
  • پوشه unit، که در آن هر مورد آزمون، یک کلاس یا تابع واحد را می‌آزماید.
  • پوشه storage یک مجموعه آزمون ذخیره‌سازی عمومی را روی تمام فضاهای ذخیره‌سازی اجرا می‌کند.

دلیل این تفکیک این است: ما قصد داریم برای هر یک از این مجموعه‌های آزمون، گزارش‌های پوشش کُد جداگانه‌ای تولید کنیم. در حالت ایده‌آل، unit باید به‌تنهایی پوشش مناسبی از کل کُد منبع ارائه دهد، و همچنین ترکیب system و storage نیز به همین صورت باشد.

این سند استانداردی را برای ذخیره‌سازی گاه‌شمارها و مخاطبان در یک سیستم‌فایل تشریح می‌کند که هدف اصلی آن، پیاده‌سازی آسان است.

ابزار Vdirsyncer از طریق filesystem <#storage-filesystem> با vdirها همگام‌سازی می‌شود. هر vdir (که اساساً تنها یک دایرکتوری حاوی تعدادی فایل است) نمایانگر یک گاه‌شمار یا دفترچه نشانی است.

پوشه اصلی (ریشه) شامل تعداد دلخواهی زیرپوشه (مجموعه‌ها یا collections) است که فقط حاوی فایل‌ها (آیتم‌ها یا items) هستند. مترادف‌های "collection" می‌توانند "addressbook" یا "calendar" باشند.

یک آیتم عبارت است از:

یک آیتم باید شامل مشخصه UID همان‌گونه که در استانداردهای vCard و iCalendar تعریف شده باشد. در صورتی که شامل بیش از یک مشخصه UID باشد، مقادیر آن‌ها نباید متفاوت باشند.

فایل باید دقیقاً شامل یک رویداد، وظیفه یا مخاطب باشد. در بیشتر موارد، این امر به معنای وجود تنها یک مؤلفه VEVENT/VTODO/VCARD در هر فایل است، اما برای مثال، استثنائات تکرار نیازمند چندین مؤلفه VEVENT برای هر رویداد خواهند بود.

نام فایل باید ویژگی‌های مشابهی با UID محتوای فایل داشته باشد. با این حال، هیچ الزامی برای یکسان بودن این دو وجود ندارد. برنامه‌ها می‌توانند فراداده‌های اضافی را در نام فایل ذخیره کنند، اما در عین حال نباید فرض کنند که فراداده‌های گنجانده‌شده توسط آن‌ها در سایر برنامه‌ها نیز حفظ خواهد شد.

هر یک از فایل‌های فراداده زیر ممکن است وجود نداشته باشند. هیچ‌یک از فایل‌های فهرست‌شده در زیر دارای پسوند فایل نیستند.

  • فایلی به نام color درون vdir رنگ vdir را مشخص می‌کند؛ این مشخصه صرفاً در طراحی رابط کاربری (UI) اهمیت دارد.

    محتوای آن یک مقدار hex-RGB با کدگذاری ASCII به قالب #RRGGBB است. برای نمونه، محتوای فایل #FF0000 مشخص می‌کند که vdir رنگ قرمز (قابل مشاهده برای کاربر) دارد. استفاده از اشکال کوتاه یا مقادیر غیررسمی مانند red (برای مثال آن‌گونه که در CSS وجود دارد) مجاز نیست. علامت پیشوند # باید وجود داشته باشد.

  • فایل‌هایی به نام‌های displayname و description حاوی عنوان/توضیحاتی با کدگذاری UTF-8 هستند که ممکن است برای نمایش vdir در رابط‌های کاربری به کار روند.
  • فایلی به نام order درون vdir شامل ترتیب نسبی گاه‌شمار است؛ مشخصه‌ای که صرفاً در طراحی رابط کاربری اهمیت دارد.

ایجاد و تغییر آیتم‌ها یا فایل‌های فراداده باید به‌صورت اتمیک انجام شود https://en.wikipedia.org/wiki/Atomicity_%28programming%29.

نوشتن در یک فایل موقت روی همان دستگاه فیزیکی و سپس انتقال آن به مکان مناسب، معمولاً راهکاری بسیار کارآمد است. به این منظور، ممکن است فایل‌هایی با پسوند .tmp درون مجموعه‌ها ایجاد شوند.

هنگام تغییر یک آیتم، باید از نام فایل اصلی استفاده شود..SS خواندن از vdirها

  • هر فایلی که به .tmp ختم شود یا فاقد پسوند فایل باشد، نباید به عنوان یک آیتم در نظر گرفته شود.
  • بخش ident از نام فایل نباید به منظور افزایش سرعت جستجوی آیتم‌ها تجزیه شود.

دلیل اصلی انتخاب این قالب، سازگاری آن با استانداردهای CardDAV http://tools.ietf.org/html/rfc6352 و CalDAV http://tools.ietf.org/search/rfc4791 است.

در حال حاضر، vdirها از یک مشکل کارایی نسبتاً عمده رنج می‌برند؛ مشکلی که پیاده‌سازی‌های فعلی با ایجاد نمایه (index) از مجموعه‌ها به منظور جستجو و یافتن سریع‌تر، سعی در کاهش آن دارند.

دلیل اینکه نام فایل آیتم‌ها شامل اطلاعات اضافی نیست ساده است: راه‌حل‌های ارائه‌شده موجب تکثیر داده‌ها می‌شدند، جایی که ممکن بود یکی از نسخه‌های تکراری به دلیل پیاده‌سازی‌های نامناسب قدیمی و منسوخ شود. با این حال در وضعیت کنونی، می‌توان قالب نمایه را به طور جداگانه فرمول‌بندی کرد.

برنامه vdirsyncer واقعاً نیازی ندارد که نگران جستجوی بهینه‌ی آیتم‌ها باشد، زیرا الگوریتم همگام‌سازی آن در هر صورت باید کل فهرست آیتم‌ها را واکشی کند. تشخیص تغییرات نیز به سادگی با بررسی زمان تغییر (modification time) فایل‌ها انجام می‌شود.

از شما برای بسته‌بندی vdirsyncer بسیار سپاسگزاریم! دستورالعمل‌های زیر باید به شما در اجتناب از برخی تله‌ها و خطاهای رایج کمک کنند.

اگر نیاز به وصله کردن (patch) چیزی پیدا کردید یا در مسیری متفاوت پیش رفتید، لطفاً یک issue باز کنید تا بتوانیم آن را به شیوه‌ای که برای همه مناسب باشد برطرف کنیم. در غیر این صورت، گزارش‌های باگی برای کدها یا سناریوهایی دریافت می‌کنیم که در نسخه‌ی بالادست (upstream) vdirsyncer وجود ندارند.

کانال اصلی توزیع PyPI https://pypi.python.org/pypi/vdirsyncer است و تاربال‌های منبع را می‌توان از آنجا دریافت کرد. ما همان تاربال بسته و wheel را در انتشارهای GitHub بازتاب (mirror) می‌دهیم. لطفاً این‌ها را با تاربال‌های تولید خودکار "Source Code" در GitHub اشتباه نگیرید؛ آن‌ها فاقد برخی فراداده‌های مهم هستند و ساخت (build) شما با شکست مواجه خواهد شد.

ما در مخزن git به هر انتشار یک تگ اختصاص می‌دهیم. اگر می‌خواهید از انتشارهای جدید مطلع شوید، خوراک GitHub در https://github.com/pimutils/vdirsyncer/releases.atom روش بسیار خوبی است.

تگ‌ها توسط نگه‌دارنده‌ای که فرآیند انتشار را انجام می‌دهد امضا خواهند شد (از نسخه‌ی 0.16.8 به بعد)، و تولید tarball و wheel توسط CI انجام می‌شود. بنابراین، تنها خود تگ امضا شده است.

همانند بیشتر بسته‌های Python، فایل setup.py وابستگی‌های vdirsyncer را مشخص می‌کند. این فایل همچنین شامل حد پایین نسخه‌های هر وابستگی است. نگارش‌های قدیمی‌تر توسط مجموعه‌ی آزمون رد خواهند شد.

همه‌چیز در ارتباط با آزمون‌ها از طریق Makefile در ریشه‌ی مخزن یا بسته‌ی PyPI انجام می‌شود. تلاش برای اجرای مستقیم مواردی مانند pytest نیازمند تنظیم متغیرهای محیطی فراوانی (جهت پیکربندی) خواهد بود و احتمالاً شما تمایلی به درگیر شدن با آن ندارید.

می‌توانید تمام وابستگی‌های توسعه را با دستور زیر نصب کنید:

make install-dev

احتمالاً این روش را ترجیح نمی‌دهید، زیرا برای بارگیری وابستگی‌ها از pip استفاده خواهد کرد. در عوض، وابستگی‌های آزمون به عنوان وابستگی‌های اختیاری test در pyproject.toml فهرست شده‌اند که مجدداً الزامات حداقل نسخه را به همراه دارند.

همچنین در این مرحله باید vdirsyncer به طور کامل نصب شده باشد. صرفاً اجرای دستور cd به داخل تاربال کافی نخواهد بود.

اجرای آزمون‌ها با دستور زیر انجام می‌شود:

pytest

کتابخانه‌ی Hypothesis داده‌های ورودی آزمون را به صورت تصادفی تولید می‌کند. اگر آزمون‌های قطعی (deterministic) برایتان مهم است، متغیر DETERMINISTIC_TESTS را روی "true" تنظیم کنید:

make DETERMINISTIC_TESTS=true test

متغیرهای اضافی فراوانی وجود دارند که به شما اجازه می‌دهند vdirsyncer را در برابر یک کارگزار خاص بیازمایید. آن متغیرها "پایدار" نیستند و ممکن است در نسخه‌های جزئی به شدت تغییر کنند. از آن‌ها استفاده نکنید؛ بسیار بعید است باگ‌هایی را پیدا کنید که CI پروژه vdirsyncer از قبل نیافته باشد..SS مستندات

با استفاده از Sphinx <www.sphinx-doc.org> می‌توانید مستنداتی را که هم‌اکنون می‌خوانید در قالب‌های گوناگونی چون HTML، PDF، یا حتی صفحه راهنما (manpage) تولید کنید. با این وجود، من فقط به قالب‌بندی مستندات HTML رسیدگی می‌کنم.

فهرست وابستگی‌ها را می‌توانید در pyproject.toml، در بخش project.optional-dependencies با عنوان docs بیابید. همچنین، می‌توانید آن‌ها را با استفاده از pip با دستور زیر نصب کنید:

pip install '.[docs]'

سپس به دایرکتوری docs/ رفته و هر قالبی را که می‌خواهید با استفاده از Makefile موجود در آن بسازید (برای مشاهده قالب‌هایی که می‌توانید بسازید، make را اجرا کنید).

فایل‌های واحد مرجع systemd.service و systemd.timer ارائه شده‌اند. اگر توزیع شما مبتنی بر systemd است، نصب این فایل‌ها توصیه می‌شود.

  • کانال IRC با نام #pimutils در Libera.Chat https://pimutils.org/contact بسته به منطقه زمانی شما ممکن است فعال باشد. از آن برای دریافت پشتیبانی و گفتگوهای عمومی (شامل موضوعات متفرقه) استفاده کنید.
  • برای گزارش‌های مشخص اشکال (باگ) و درخواست‌های قابلیت جدید، یک issue در GitHub باز کنید https://github.com/pimutils/vdirsyncer/issues.
  • برای مسائل امنیتی، با contact@pimutils.org تماس بگیرید.

این گزارش تغییرات فقط شامل اطلاعاتی است که ممکن است برای کاربران نهایی و نگه‌دارندگان بسته مفید باشد. برای اطلاعات بیشتر، لاگ کامیت‌های git را ببینید.

نگه‌دارندگان بسته و کاربرانی که باید نصب خود را به صورت دستی به‌روزرسانی کنند، ممکن است بخواهند در خوراک تگ‌های GitHub مشترک شوند https://github.com/pimutils/vdirsyncer/tags.atom.

  • پیاده‌سازی تلاش مجدد برای نوع ذخیره‌سازی google در صورت رسیدن به سقف نرخ درخواست (rate limit).
  • بسته tenacity اکنون یک وابستگی الزامی است.
  • پایان پشتیبانی از Python 3.8.
  • تلاش مجدد برای خطاهای گذرا شبکه در درخواست‌های بی‌اثر (nullipotent).
  • افزودن پشتیبانی از Python 3.14.

  • حذف وابستگی به کتابخانه متروکه atomicwrites.
  • پیاده‌سازی filter_hook برای فضای ذخیره‌سازی HTTP.
  • پایان پشتیبانی از Python 3.7.
  • افزودن پشتیبانی از Python 3.12 و Python 3.13.
  • بستن صحیح پایگاه داده وضعیت پس از استفاده. این موضوع به‌ویژه بر آزمون‌ها تأثیر می‌گذارد، جایی که شمار زیادی از توصیف‌کننده‌های فایل (file descriptors) نشت می‌کردند.
  • گسترش نسخه‌های پشتیبانی‌شده از aiostream برای دربرگرفتن 0.7.x.

  • بهبود کارایی SingleFileStorage. issue #818 https://github.com/pimutils/vdirsyncer/issues/818
  • مستندسازی مناسب برخی از نکات و هشدارهای ذخیره‌ساز Google Contacts.
  • رفع کرش هنگام استفاده از گواهی‌های احراز هویت. issue #1033 https://github.com/pimutils/vdirsyncer/issues/1033
  • ذخیره‌ساز filesystem را می‌توان با type = "filesystem/icalendar" یا type = "filesystem/vcard" تعیین کرد. این موضوع هیچ تأثیر عملکردی ندارد و صرفاً برای سازگاری رو به جلو با پیاده‌سازی Rust برنامه vdirsyncer است.
  • پشتیبانی رسمی از Python 3.10 و 3.11 اضافه شد.
  • دستورالعمل‌های یکپارچه‌سازی با Google CalDav/CardDav تغییر کرده است. اکنون برنامه‌ها باید به عنوان "Desktop applications" ثبت شوند. استفاده از "Web application" به دلیل تغییرات سمت گوگل دیگر کار نمی‌کند. issue #1078 https://github.com/pimutils/vdirsyncer/issues/1078

  • افزودن راهبرد دریافت گذرواژه "shell" برای فرستادن رشته دستور به یک شل.
  • افزودن "description" و "order" به عنوان متادیتا. این مقادیر به ترتیب ویژگی‌های CalDAV: calendar-description، CardDAV:addressbook-description و apple-ns:calendar-order را دریافت می‌کنند.
  • افزودن وضعیت جدید showconfig. این دستور برخی از مقادیر پیکربندی را به صورت JSON نمایش می‌دهد. این قابلیت برای استفاده توسط ابزارها و برنامه‌های کمکی خارجی که با vdirsyncer در تعامل هستند در نظر گرفته شده و آزمایشی محسوب می‌شود.
  • افزودن گزینه implicit به بخش pair <#pair-config>. هنگامی که روی "create" تنظیم شود، مجموعه‌های مفقود را در حین همگام‌سازی بدون نیاز به تأیید کاربر ایجاد می‌کند. این امر جریان‌های کاری را که در آن‌ها مجموعه‌ها باید به طور خودکار در هر دو طرف ایجاد شوند ساده می‌کند.
  • به‌روزرسانی آزمون‌های مرتبط با TLS که به دلیل MDهای ضعیف با شکست مواجه می‌شدند. issue #903 https://github.com/pimutils/vdirsyncer/issues/903
  • بسته‌های pytest-httpserver و trustme اکنون برای اجرای آزمون‌ها الزامی هستند.
  • بسته pytest-localserver دیگر برای اجرای آزمون‌ها الزامی نیست.
  • پشتیبانی از چندنخی (Multithreaded) متوقف شد. گزینه "--max-workers حذف شده است.
  • اکنون از بک‌اند جدید asyncio استفاده می‌شود. تا اینجا، این تغییر باعث بهبود چشمگیر سرعت در discovery و metasync شده، اما تغییر اندکی در sync داشته است. این مورد احتمالاً در طول زمان بهبود بیشتری خواهد یافت. issue #906 https://github.com/pimutils/vdirsyncer/issues/906
  • انواع ذخیره‌ساز google دیگر به requests-oauthlib نیازی ندارند، و به جای آن نیازمند python-aiohttp-oauthlib هستند.
  • برنامه Vdirsyncer دیگر پشتیبانی آزمایشی از EteSync https://www.etesync.com را شامل نمی‌شود. یکپارچه‌سازی موجود مدت‌ها بود که پشتیبانی نمی‌شد و دیگر کار نمی‌کرد. در صورت تمایل افراد به نگهداری یک افزونه برای EteSync، ممکن است پشتیبانی از ذخیره‌سازهای خارجی اضافه شود. به کاربران EteSync پیشنهاد می‌شود استفاده از etesync-dav https://github.com/etesync/etesync-dav را مد نظر قرار دهند.
  • فایل plist برای macOS حذف شد. این فایل ایراد داشت و homebrew نسخه خودش را بر اساس متادیتای بسته تولید می‌کند. به کاربران macOS توصیه می‌شود از آن به عنوان مرجع استفاده کنند.

پشتیبانی از اثر انگشت‌های گواهی (fingerprints) از نوع md5 و sha1 متوقف شده است. اگر اثر انگشت‌های گواهی را اعتبارسنجی می‌کنید، به جای آن‌ها از sha256 استفاده نمایید.

هنگام استفاده از verify_fingerprint سفارشی، اعتبارسنجی CA همواره غیرفعال است.

اگر verify_fingerprint تنظیم نشده باشد، اعتبارسنجی CA همیشه فعال است. غیرفعال کردن هر دو ویژگی ناامن بوده و دیگر پشتیبانی نمی‌شود.

پارامتر verify دیگر مقادیر بولی نمی‌پذیرد، اکنون اختیاری است و تنها یک رشته شامل مسیر CA سفارشی را برای اعتبارسنجی قبول می‌کند.

پارامترهای verify و verify_fingerprint احتمالاً در آینده در قالب یک پارامتر واحد ادغام خواهند شد..SS نسخه 0.18.0

نکته: نسخه 0.17 شامل چند انتشار آلفا بود اما در نهایت هرگز نهایی نشد. نسخه 0.18 در واقع از همان‌جایی ادامه می‌یابد که 0.16 متوقف شده بود.

  • پشتیبانی از Python 3.5 و 3.6 پایان یافته است. این انتشار عمدتاً بر حفظ سازگاری vdirsyncer با محیط‌های جدیدتر تمرکز دارد.
  • اکنون نسخه‌های click 8 و click-threading 0.5.0 مورد نیاز هستند.
  • برای کسانی که از pipsi استفاده می‌کنند، اکنون استفاده از جانشین آن، pipx، توصیه می‌شود.
  • اکنون از Python 3.9 پشتیبانی می‌شود.
  • اسکریپت‌های ساخت Debian/Ubuntu به‌روزرسانی شده‌اند. نسخه‌های جدید باید به‌زودی به آن مخازن فرستاده شوند.

منتشرشده در 09 ژوئن 2020

•
پشتیبانی از Python 3.7 و 3.8.

این انتشار از نظر عملکردی همسان با 0.16.7 است. با نسخه‌های اخیر Python آزمایش شده و به عنوان پشتیبانی‌کننده از آن‌ها علامت‌گذاری شده است. این نسخه همچنین آخرین انتشاری خواهد بود که از Python 3.5 و 3.6 پشتیبانی می‌کند.

منتشرشده در 19 ژوئیه 2018

•
رفع اشکال‌ها برای Python 3.7

منتشرشده در 13 ژوئن 2018

•
بسته‌سازان: ساخت مستندات دیگر نیازی به یک نسخهٔ نصب‌شده و فعال از vdirsyncer ندارد.

منتشرشده در 13 ژوئن 2018

  • بسته‌سازان: نسخه click-log 0.3 مورد نیاز است.
  • تمام خروجی‌ها اکنون روی stderr ارسال خواهند شد (به دلیل ارتقای click-log).

منتشرشده در 05 فوریه 2018

•
اصلاح آزمون‌ها برای نسخه جدید Hypothesis. (دقیقاً هیچ تغییر دیگری اعمال نشده است)

منتشرشده در 03 اکتبر 2017

منتشرشده در 24 اوت 2017

  • رفع خرابی ناگهانی هنگام استفاده از فیلترهای daterange یا item_type در google_calendar <#storage-google_calendar>، مسئلهٔ #657 را ببینید https://github.com/pimutils/vdirsyncer/issues/657.
  • بسته‌سازان: اصلاحات مربوط به نسخهٔ جدید 0.2.0 از click-log. نیازمندی‌های نسخه برای وابستگی click-log تغییر یافته است.

    منتشرشده در 8 اوت 2017

منتشرشده در 2 ژوئن 2017

  • حذف METHOD:PUBLISH اضافه‌شده توسط برخی ارائه‌دهندگان تقویم؛ گزارش شماره #502 https://github.com/pimutils/vdirsyncer/issues/502 را ببینید.
  • رفع مشکل از کار افتادن (crash) فضاهای ذخیره‌سازی Google هنگام ذخیره فایل توکن.
  • انطباق بیشتر شناسایی DAV با استانداردهای RFC؛ درخواست ادغام #585 https://github.com/pimutils/vdirsyncer/pull/585 را ببینید.
  • ابزار vdirsyncer اکنون در برابر Xandikos آزمایش می‌شود؛ درخواست ادغام #601 https://github.com/pimutils/vdirsyncer/pull/601 را ببینید.
  • زیرپوشه‌های دارای نقطه در ابتدای نام اکنون در طول فرایند شناسایی برای فضای ذخیره‌سازی filesystem نادیده گرفته می‌شوند. این امر ادغام آن را با سیستم‌های کنترل نسخه آسان‌تر می‌کند.
  • وضعیت‌ها اکنون در یک پایگاه داده sqlite ذخیره می‌شوند. داده‌های قدیمی به‌طور خودکار مهاجرت داده می‌شوند. کاربران دارای مجموعه‌داده‌های بسیار بزرگ باید شاهد بهبود عملکرد باشند. این بدان معناست که sqlite3 اکنون یک وابستگی برای vdirsyncer است.
  • Vdirsyncer اکنون تحت مجوز 3-بندی BSD منتشر می‌شود؛ گزارش شماره #610 https://github.com/pimutils/vdirsyncer/issues/610 را ببینید.
  • ابزار vdirsyncer اکنون شامل پشتیبانی آزمایشی از EteSync https://www.etesync.com است؛ درخواست ادغام #614 https://github.com/pimutils/vdirsyncer/pull/614 را ببینید.
  • ابزار vdirsyncer اکنون برای تشخیص تغییر یک آیتم، از متاداده‌های بیشتری از سامانه فایل استفاده می‌کند. ممکن است در نخستین همگام‌سازی پس از ارتقا متوجه افزایش ناگهانی و شدید بار پردازنده و ورودی/خروجی (CPU/IO) شوید.
  • بسته‌بندها: فایل‌های واحد مرجع systemd.service و systemd.timer ارائه شده‌اند. توصیه می‌شود اگر توزیع شما مبتنی بر systemd است، این فایل‌ها را به‌عنوان مستندات نصب کنید.

منتشرشده در 28 فوریه 2017

منتشرشده در 05 ژانویه 2017

  • دستور vdirsyncer repair دیگر به‌طور پیش‌فرض "UIDهای ناامن" را تغییر نمی‌دهد؛ یک گزینه اضافی باید مشخص شود. گزارش شماره #527 https://github.com/pimutils/vdirsyncer/issues/527 را ببینید.
  • به‌روزرسانی‌های مهم متعددی در مستندات.

منتشرشده در 26 اکتبر 2016

  • دستور vdirsyncer sync اکنون در صورت شکست یک بارگذاری، بارگذاری‌های دیگر را ادامه می‌دهد. کد خروج در چنین شرایطی همچنان غیر صفر خواهد بود.
  • افزودن گزینه partial_sync به بخش pair. مستندات پیکربندی <#partial-sync-def> را ببینید.
  • ابزار vdirsyncer اکنون در صورت وجود رشته‌های بدون نقل‌قول در پیکربندی شما هشدار می‌دهد. لطفاً در صورت مشاهده مستنداتی که از رشته‌های بدون نقل‌قول استفاده می‌کنند، گزارش خطا ارسال کنید.
  • رفع مشکلی که باعث از کار افتادن دستیار پیکربندی ابزار khal می‌شد.

    منتشر شده در ۳۰ سپتامبر ۲۰۱۶

•
رفع باگی که شناسایی مجموعه‌ها (collection discovery) را کاملاً از کار می‌انداخت.

منتشر شده در ۲۹ سپتامبر ۲۰۱۶

  • پشتیبانی از Python 2 به طور کامل متوقف شد. گزارش #219 را ببینید: https://github.com/pimutils/vdirsyncer/issues/219.
  • اکنون بخش‌های پیکربندی از نظر نام‌های تکراری بررسی می‌شوند. این بدان معناست که شما نمی‌توانید یک بخش ذخیره‌سازی [storage foo] و یک جفت [pair foo] با نام یکسان در پیکربندی خود داشته باشید؛ آنها باید نام‌های متفاوتی داشته باشند. این کار انجام شد تا خروجی کنسول همیشه بدون ابهام باشد. گزارش #459 را ببینید: https://github.com/pimutils/vdirsyncer/issues/459.
  • اکنون می‌توان از دستورات سفارشی برای حل تعارض در حین همگام‌سازی استفاده کرد. گزارش #127 را ببینید: https://github.com/pimutils/vdirsyncer/issues/127.
  • ذخیره‌ساز http <#storage-http> اکنون UIDها را کاملاً نادیده می‌گیرد. این کار از بارگیری و بارگذاری‌های غیرضروری بسیاری جلوگیری می‌کند.

منتشر شده در ۲۰ اوت ۲۰۱۶

منتشر شده در ۱۹ اوت ۲۰۱۶

•
ذخیره‌ساز singlefile <#storage-singlefile> اکنون از مجموعه‌ها پشتیبانی می‌کند. درخواست ادغام #488 را ببینید: https://github.com/pimutils/vdirsyncer/pull/488.

منتشر شده در ۲۹ ژوئیه ۲۰۱۶

منتشر شده در ۱۵ ژوئن ۲۰۱۶

•
رفع غلط املایی که آزمون‌ها را با شکست مواجه می‌کرد.

منتشر شده در ۱۵ ژوئن ۲۰۱۶

  • رفع باگ در اعتبارسنجی مجموعه‌ها.
  • رفع باگ ظاهری در خروجی اشکال‌زدایی (debug).
  • بهبودهای مختلف در مستندات.

منتشر شده در ۱۹ مه ۲۰۱۶

  • شناسایی (Discovery) دیگر به طور خودکار هنگام اجرای vdirsyncer sync انجام نمی‌شود. اکنون باید vdirsyncer discover صریحاً فراخوانی شود.
  • افزودن یک نمونه .plist برای Mac OS X.
  • استفاده تحت Python 2 اکنون نیازمند تنظیم یک پارامتر پیکربندی ویژه است.
  • چندین پارامتر پیکربندی منسوخ‌شده دیگر پیام‌های خطای اختصاصی ندارند. پیام خطای عمومی برای پارامترهای ناشناخته نمایش داده می‌شود.
  • برنامه Vdirsyncer دیگر درباره تغییر نام پارامتر passwordeval به password_command هشدار نمی‌دهد.
  • راهبرد واکشی keyring چند نسخه پیش کنار گذاشته شد و اکنون پیام خطای اختصاصی آن نیز حذف شده است.
  • یک قالب قدیمی وضعیت مربوط به نسخه 0.4 دیگر پشتیبانی نمی‌شود. اگر با مشکلی مواجه شدید، کافی است پوشه status خود را حذف کنید.

منتشرشده در ۲۳ آوریل ۲۰۱۶

  • انواع جدید ذخیره‌سازی google_calendar <#storage-google_calendar> و google_contacts <#storage-google_contacts> افزوده شده‌اند.
  • گزینه خط فرمان سراسری جدید --config، برای مشخص کردن فایل پیکربندی جایگزین. گزارش مشکل شماره ۴۰۹ را ببینید: https://github.com/pimutils/vdirsyncer/issues/409.
  • اکنون می‌توان از پارامتر collections برای همگام‌سازی مجموعه‌هایی با نام‌های متفاوت با یکدیگر استفاده کرد.
  • بسته‌بندها: وابستگی lxml حذف شده است.
  • تجزیه XML اکنون بسیار سخت‌گیرانه‌تر شده است. سرورهای دارای عملکرد نادرست که قبلاً با vdirsyncer کار می‌کردند ممکن است از کار بیفتند.

منتشرشده در ۲۲ مارس ۲۰۱۶

  • اکنون singlefile <#storage-singlefile> و http <#storage-http> رویدادهای تکرارشونده را به‌درستی مدیریت می‌کنند.
  • رفع یک غلط املایی در دستورالعمل‌های بسته‌بندی.
  • انتقال به سازمان pimutils در GitHub. پیوندهای قدیمی باید تغییر مسیر دهند، اما مراقب نرم‌افزارهای کلاینتی که تغییر مسیرها را به‌درستی مدیریت نمی‌کنند باشید.

منتشرشده در ۱۳ مارس ۲۰۱۶

•
مجموعه آزمون برای محیط‌هایی که هیچ مرورگر وبی در آن‌ها نصب نشده اصلاح شد. درخواست ادغام شماره ۳۸۴ را ببینید: https://github.com/pimutils/vdirsyncer/pull/384.

منتشرشده در ۱۳ مارس ۲۰۱۶

  • دستور چاپ اشکال‌زدایی باقی‌مانده در vdirsyncer discover حذف شد؛ کامیت 3d856749f37639821b148238ef35f1acba82db36 را ببینید.
  • دستور metasync اکنون فاصله‌های خالی را از ابتدا و انتهای مقادیر حذف می‌کند. گزارش مشکل شماره ۳۵۸ را ببینید: https://github.com/pimutils/vdirsyncer/issues/358.
  • بخش جدید Packaging Guidelines به مستندات افزوده شده است.

منتشرشده در ۱۵ فوریه ۲۰۱۶

•
پارامتر collections اکنون در پیکربندی‌های جفت الزامی است. Vdirsyncer در پیام خطای خود به شما خواهد گفت چه کاری انجام دهید. گزارش مشکل شماره ۳۲۸ را ببینید: https://github.com/pimutils/vdirsyncer/issues/328.

منتشرشده در ۳۰ ژانویه ۲۰۱۶

•
اصلاح پیام‌های خطا هنگام استفاده از راهبرد نامعتبر برای واکشی پارامتر. این مورد از آنجا اهمیت دارد که کاربران به دلیل استفاده از روش منسوخ‌شده واکشی با keyring خطاهای نامفهومی دریافت می‌کردند.

منتشرشده در ۲۷ ژانویه ۲۰۱۶

  • پشتیبانی از Keyring حذف شده است، به این معنی که password.fetch = ["keyring", "example.com", "myuser"] دیگر کار نمی‌کند.

    برای راه‌اندازی‌های موجود: در عوض از password.fetch = ["command", "keyring", "get", "example.com", "myuser"] استفاده کنید که عمومی‌تر است. برای جزئیات به مستندات مراجعه کنید.

  • اکنون هنگام اجرا تحت Python 2 یک هشدار صادر می‌شود. گزارش مشکل شماره ۲۱۹ را ببینید: https://github.com/pimutils/vdirsyncer/issues/219.

    منتشرشده در ۲۳ دسامبر ۲۰۱۵

  • رفع باگی در remotestorage که تلاش می‌کرد یک مرورگر CLI را برای OAuth باز کند.
  • رفع یک باگ بسته‌بندی که مانع از کارکرد vdirsyncer با نسخه‌های جدیدتر lxml می‌شد.

منتشرشده در ۲۲ دسامبر ۲۰۱۵

  • بهبود پیام‌های خطا به جای رفتار نادرست سرور؛ گزارش مشکل #290 https://github.com/pimutils/vdirsyncer/issues/290 و گزارش مشکل #300 https://github.com/pimutils/vdirsyncer/issues/300 را ببینید.
  • خاموش‌سازی ایمن‌تر threadpool و جلوگیری از بروز استثناها؛ گزارش مشکل #291 https://github.com/pimutils/vdirsyncer/issues/291 را ببینید.
  • رفع باگ همگام‌سازی برای حافظه‌های ذخیره‌سازی فقط-خواندنی (read-only)؛ کامیت ed22764921b2e5bf6a934cf14aa9c5fede804d8e را ببینید.
  • تغییرات Etag دیگر برای راه‌اندازی عملیات همگام‌سازی کافی نیستند. تغییر واقعی محتوا نیز ضروری است. گزارش مشکل #257 https://github.com/pimutils/vdirsyncer/issues/257 را ببینید.
  • اکنون remotestorage به‌طور خودکار کادرهای گفتگوی احراز هویت را در مرورگر GUI پیکربندی‌شده شما باز می‌کند.
  • بسته‌بندها (Packagers): اکنون lxml>=3.1 مورد نیاز است (نسخه حداقل جدیدتر).

منتشرشده در ۰۵ نوامبر ۲۰۱۵

•
واقعاً اختیاری کردن وابستگی‌های remotestorage (remotestorage-dependencies).

منتشرشده در ۰۵ نوامبر ۲۰۱۵

•
رفع خرابی مجموعه آزمون (testsuite).

منتشرشده در ۰۵ نوامبر ۲۰۱۵

  • بسته‌بندها (Packagers): موارد اضافی (extras) در setuptools با عنوان‌های keyring و remotestorage اضافه شده‌اند. آن‌ها اساساً وابستگی‌های اختیاری هستند. برای جزئیات بیشتر setup.py را ببینید.
  • پشتیبانی بسیار آزمایشی از remoteStorage اضافه شده است. ممکن است این قابلیت در هر نسخه‌ای کاملاً بازنویسی شود یا حتی حذف گردد.
  • حذف ارجاعات به password_command قدیمی در مستندات.

منتشرشده در ۲۷ اکتبر ۲۰۱۵

  • بسته‌بندها (Packagers): وابستگی‌های جدید عبارتند از click_threading، click_log و click>=5.0.
  • دستور password_command حذف شده است. پشتیبانی از Keyring کاملاً بازنویسی شد. بخش ذخیره‌سازی گذرواژه‌ها (Storing passwords) <> را ببینید.

منتشرشده در ۰۶ اوت ۲۰۱۵

  • فراخوانی‌های password_command با کد خروج غیرصفر اکنون مهلک تلقی شده (و همگام‌سازی را متوقف می‌کنند) به جای اینکه صرفاً هشداری تولید کنند.
  • برنامه Vdirsyncer اکنون قادر به همگام‌سازی متاداده‌های مجموعه‌ها است. مقدار metadata = ["displayname"] را تنظیم کرده و vdirsyncer metasync را اجرا کنید.
  • بسته‌بندها (Packagers): از بسته‌های tarball گیت‌هاب استفاده نکنید، بلکه از بسته‌های PyPI استفاده کنید.
  • بسته‌بندها (Packagers): اسکریپت build.sh حذف شده و Makefile در بسته‌های tarball گنجانده شده است. برای چگونگی اجرای آزمون‌ها پس از بسته‌بندی، محتوای Makefile را ببینید.
  • گزینه verify_fingerprint دیگر به‌طور خودکار verify را غیرفعال نمی‌کند.

    منتشر شده در 15 ژوئن 2015

  • برنامه Vdirsyncer اکنون مجوزهای فایل‌های وضعیت را بررسی و اصلاح می‌کند.
  • برنامه Vdirsyncer اکنون در برابر تغییر UIDها درون آیتم‌ها پایدارتر است.
  • برنامه Vdirsyncer اکنون hrefها و UIDهای یونیکد را به درستی مدیریت می‌کند. نرم‌افزاری که UIDهای غیر ASCII تولید کند معیوب است، اما ظاهراً چنین نرم‌افزارهایی وجود دارند.

منتشر شده در 29 مه 2015

  • توجه: نسخه آپلود شده 0.5.0 روی PyPI کاملاً معیوب است.
  • ارتقای نسخه مورد نیاز requests-toolbelt به 0.4.0.
  • خط فرمان زمانی که کاری برای انجام دادن وجود ندارد (مانند خروجی راهنما)، باید بسیار سریع‌تر باشد.
  • رفع مجدد سازگاری با iCloud.
  • استفاده از تنها یک worker در صورت فعال بودن حالت اشکال‌زدایی (debug mode).
  • استفاده از verify=false اکنون در vdirsyncer غیرمجاز است؛ لطفاً به جای آن از verify_fingerprint استفاده کنید.
  • رفع باگی که در آن فضای ذخیره‌سازی DAV در vdirsyncer از useragent پیکربندی‌شده برای کشف مجموعه (collection discovery) استفاده نمی‌کرد.

منتشر شده در 12 مارس 2015

منتشر شده در 20 فوریه 2015

  • بهبودهای عملکردی بیشتر برای فضای ذخیره‌سازی singlefile.
  • افزودن پارامتر post_hook به فضای ذخیره‌سازی filesystem.
  • ایجاد مجموعه اکنون با سرورهای مبتنی بر SabreDAV مانند Baikal یا ownCloud نیز کار می‌کند.
  • حذف برخی راه‌حل‌های موقت برای Radicale. ارتقا به آخرین نسخه Radicale این مشکلات را برطرف خواهد کرد.
  • رفع مشکلات مربوط به کشف در iCloud.
  • برنامه Vdirsyncer اکنون شامل یک دستور ساده repair است که تلاش می‌کند برخی آیتم‌های معیوب را اصلاح کند.

منتشر شده در 30 ژانویه 2015

  • برنامه Vdirsyncer اکنون هنگام بارگذاری و به‌روزرسانی آیتم‌ها از تغییرمسیرها پیروی می‌کند. این امر ممکن است مشکلات مربوط به Zimbra را رفع کند.
  • مقادیر نسبی status_path اکنون به عنوان مسیر نسبی نسبت به دایرکتوری فایل پیکربندی تفسیر می‌شوند.
  • رفع سازگاری با سرورهای سفارشی SabreDAV. گزارش باگ شماره 166 را ببینید: https://github.com/pimutils/vdirsyncer/issues/166.
  • گرفتن استثناهای بی‌خطر ریسه‌بندی (threading) که هنگام متوقف شدن vdirsyncer رخ می‌دهند. گزارش باگ شماره 167 را ببینید: https://github.com/pimutils/vdirsyncer/issues/167.
  • برنامه Vdirsyncer اکنون به atomicwrites وابسته است.
  • بهبودهای عملکردی چشمگیر در فضای ذخیره‌سازی singlefile.
  • آیتم‌هایی با UIDهای بسیار طولانی اکنون باید به درستی در فضای ذخیره‌سازی filesystem ذخیره شوند. گزارش باگ شماره 173 را ببینید: https://github.com/pimutils/vdirsyncer/issues/173.

    منتشرشده در ۵ ژانویه ۲۰۱۵

  • تمام آرگومان‌های create از همهٔ فضاهای ذخیره‌سازی حذف شده‌اند. اکنون vdirsyncer می‌پرسد که آیا باید برای ایجاد مجموعه‌ها تلاش کند یا خیر.
  • مقادیر پیکربندی قدیمی True، False، on، off و None اکنون نامعتبر هستند.
  • تداخل‌های UID اکنون به جای نادیده گرفتن یکی از موارد، به درستی مدیریت می‌شوند؛ هرچند انتظار می‌رود سرورهای CardDAV و CalDAV خود به این موارد رسیدگی کنند.
  • پشتیبانی رسمی از Baikal اضافه شد.

منتشرشده در ۳۱ دسامبر ۲۰۱۴

  • پارامتر passwordeval به password_command تغییر نام یافته است.
  • روش قدیمی برای نوشتن برخی مقادیر پیکربندی مانند فهرست‌ها حذف شده است.
  • شناسایی مجموعه (Collection discovery) بازنویسی شده است. فایل‌های پیکربندی قدیمی باید با آن سازگار باشند، اما اکنون vdirsyncer نتایج شناسایی مجموعه را کَش می‌کند. در صورتی که مجموعه‌ها در یک طرف اضافه یا حذف شوند، باید دستور vdirsyncer discover را اجرا کنید.
  • نام‌های جفت (pair) و فضای ذخیره‌سازی (storage) اکنون به نویسه‌های خاصی محدود شده‌اند. اگر فایل پیکربندی شما از این نظر نامعتبر باشد، vdirsyncer یک پیام خطای واضح صادر خواهد کرد.
  • اکنون vdirsyncer از مشخصات XDG-Basedir پشتیبانی می‌کند. اگر متغیر محیطی VDIRSYNCER_CONFIG تنظیم نشده باشد و فایل ~/.vdirsyncer/config وجود نداشته باشد، به دنبال فایل پیکربندی در مسیر $XDG_CONFIG_HOME/vdirsyncer/config خواهد گشت.
  • بهبودهایی در شناسایی CardDAV و CalDAV بر پایهٔ مشکلات مشاهده‌شده با FastMail صورت گرفته است. پشتیبانی از URIهای .well-known اضافه شد.

منتشرشده در ۸ دسامبر ۲۰۱۴

•
چند رفع اشکال دیگر در مدیریت پیکربندی.

منتشرشده در ۸ دسامبر ۲۰۱۴

  • برنامهٔ vdirsyncer اکنون با iCloud نیز کار می‌کند. به‌ویژه شناسایی مجموعه و مدیریت etag اصلاح شده‌اند.
  • اکنون vdirsyncer درخواست‌های CalDAV و CardDAV را به شکلی متفاوت کُدگذاری می‌کند. این تغییر با سرورهایی مانند Zimbra یا SoGo به طور کامل آزمایش نشده است، اما انتظار نمی‌رود مشکلی ایجاد کند.
  • برنامهٔ vdirsyncer اکنون در برابر پاسخ‌های نامعتبر از سرورهای CalDAV مقاوم‌تر است. این امر به سازگاری آینده با Davmail/Outlook کمک خواهد کرد.
  • رفع یک اشکال هنگام تعیین item_types برای caldav <#storage-caldav> در قالب منسوخ‌شدهٔ پیکربندی.
  • رفع اشکالی که در آن vdirsyncer همهٔ نویسه‌ها به جز یک مورد را در مقدار مشخص‌شدهٔ unsafe_href_chars برای caldav <#storage-caldav> و carddav <#storage-carddav> نادیده می‌گرفت.

منتشرشده در ۳ دسامبر ۲۰۱۴

•
قالب فعلی پیکربندی منسوخ شده است و پشتیبانی از آن در نسخه 0.4.0 حذف خواهد شد. اکنون vdirsyncer در این باره هشدار می‌دهد.

منتشرشده در ۲۴ نوامبر ۲۰۱۴

  • رفع اشکالی که در آن اگر مواردی در سمت A حذف ولی در سمت B تغییر داده می‌شدند، vdirsyncer آن‌ها را حذف می‌کرد. اکنون در عوض، vdirsyncer موارد جدید را در سمت A بارگذاری خواهد کرد. گزارش مشکل شماره ۱۲۸ https://github.com/pimutils/vdirsyncer/issues/128 را ببینید.
  • در صورت بروز نقص در یک جفت، همگام‌سازی با جفت‌های باقی‌مانده ادامه می‌یابد؛ گزارش مشکل شماره ۱۲۱ https://github.com/pimutils/vdirsyncer/issues/121 را ببینید.
  • کلید پیکربندی processes حذف شده است. اکنون گزینهٔ --max-workers در خط فرمان وجود دارد که هدف مشابهی دارد. درخواست ادغام شماره ۱۲۶ https://github.com/pimutils/vdirsyncer/pull/126 را ببینید.
  • پوستهٔ Read The Docs دیگر برای ساخت مستندات الزامی نیست. اگر نصب نباشد، پوستهٔ پیش‌فرض استفاده خواهد شد. گزارش مشکل شماره ۱۳۴ https://github.com/pimutils/vdirsyncer/issues/134 را ببینید.

    منتشر شده در ۲۰ سپتامبر ۲۰۱۴

منتشر شده در ۲۷ اوت ۲۰۱۴

  • عدم درخواست گذرواژه یک سرور بیش از یک‌بار و رفع چندین مشکل هم‌زمانی، گزارش مشکل #101 https://github.com/pimutils/vdirsyncer/issues/101 را ببینید.
  • اعتبارسنجی بهتر نقطه‌های پایانی DAV.

منتشر شده در ۱۸ اوت ۲۰۱۴

منتشر شده در ۱۱ اوت ۲۰۱۴

منتشر شده در ۰۴ اوت ۲۰۱۴

منتشر شده در ۰۵ ژوئیه ۲۰۱۴

  • رفع باگی که در آن vdirsyncer هنگام استفاده از CardDAV با Zimbra دفترچه‌های نشانی را خالی نشان می‌داد.
  • رفع حلقه بی‌نهایت هنگام عدم وجود گذرواژه در keyring سامانه.
  • رنگی‌سازی خطاها، هشدارها و پیام‌های اشکال‌زدایی (debug).
  • اکنون vdirsyncer به‌جای argvard به بسته click وابسته است.

منتشر شده در ۱۲ ژوئن ۲۰۱۴

  • اکنون vdirsyncer برای رهایی از تجزیه‌کننده خراب خود، به بسته icalendar از PyPI وابسته است.
  • اکنون vdirsyncer به requests_toolbelt نیز وابسته است. این موضوع حدس زدن نوع احراز هویت را به‌جای پیش‌فرض گرفتن بی‌چون‌وچرای basic ممکن می‌سازد.
  • رفع یک شبه‌باگ در ذخیره‌سازهای caldav و carddav که در آن به‌جای etag صحیح، یک چندتایی (href, etag) از متد upload بازگردانده می‌شد. ممکن است vdirsyncer هنگام ارتقا به این نسخه، کپی‌برداری غیرضروری انجام دهد.
  • افزودن ذخیره‌ساز singlefile <#storage-singlefile>. گزارش مشکل #48 https://github.com/pimutils/vdirsyncer/issues/48 را ببینید.
  • پارامتر collections برای بخش‌های pair اکنون مقادیر خاص from a و from b را برای کشف خودکار مجموعه‌ها می‌پذیرد. بخش Pair Section <#pair-config> را ببینید.
  • پارامتر read_only به بخش‌های ذخیره‌ساز اضافه شد. بخش Storage Section <#storage-config> را ببینید.

    منتشر شده در 14 مه 2014

  • معرفی گزارش تغییرات (changelogs)
  • رفع بسیاری از باگ‌ها
  • اصلاحات متعدد در مستندات
  • اکنون vdirsyncer برای همگام‌سازی لزوماً نیازی به UIDها ندارد.
  • اکنون اگر یک مجموعه در فاصله بین دو همگام‌سازی کاملاً خالی شده باشد، vdirsyncer متوقف می‌شود. گزارش شماره 42 را ببینید: https://github.com/pimutils/vdirsyncer/issues/42.

به ترتیب حروف الفبا:

  • Ben Boeckel
  • Bleala
  • Christian Geier
  • Clément Mondon
  • Corey Hinshaw
  • Kai Herlemann
  • Hugo Osvaldo Barrera
  • Jason Cox
  • Julian Mehne
  • Malte Kiefer
  • Marek Marczykowski-Górecki
  • Markus Unterwaditzer
  • Michael Adler
  • rEnr3n
  • Thomas Weißschuh
  • Witcher01
  • samm81

تشکر ویژه از:

حق نشر (c) 2014-2020 متعلق به Markus Unterwaditzer و مشارکت‌کنندگان. برای جزئیات بیشتر AUTHORS.rst را ببینید.

برخی حقوق محفوظ است.

توزیع مجدد و استفاده از این نرم‌افزار و مستندات آن در قالب‌های سورس و باینری، با یا بدون تغییر، به شرط رعایت شرایط زیر مجاز است:

  • توزیع‌های مجدد کد منبع باید اعلان حق نشر بالا، این فهرست شرایط و سلب مسئولیت زیر را حفظ کنند.
  • توزیع‌های مجدد در قالب باینری باید اعلان حق نشر بالا، این فهرست شرایط و سلب مسئولیت زیر را در مستندات و/یا سایر موارد ارائه‌شده همراه با توزیع، بازتولید کنند.
  • نام‌های مشارکت‌کنندگان نباید بدون مجوز کتبی و قبلی مشخص، برای تأیید یا تبلیغ محصولات مشتق‌شده از این نرم‌افزار به کار رود.

این نرم‌افزار و مستندات توسط دارندگان حق نشر و مشارکت‌کنندگان به صورت "همان‌گونه که هست" ارائه شده است و هرگونه ضمانت صریح یا ضمنی، از جمله ضمانت‌های ضمنی خریدوفروش و تناسب برای یک هدف خاص، سلب می‌شود. در هیچ موردی مالک حق نشر یا مشارکت‌کنندگان مسئول هرگونه خسارت مستقیم، غیرمستقیم، تصادفی، خاص، نمونه‌ای یا تبعی (از جمله تهیه کالاها یا خدمات جایگزین؛ از دست دادن استفاده، داده‌ها یا سودها؛ یا وقفه در کسب‌وکار) به هر نحوی که ایجاد شده باشد و بر پایه هر نظریه مسئولیتی، چه قراردادی، چه مسئولیت مدنی یا شبه‌جرم (از جمله سهل‌انگاری یا موارد دیگر) که به هر نحو ناشی از استفاده از این نرم‌افزار و مستندات باشد نخواهند بود، حتی اگر احتمال وقوع چنین خسارتی گوشزد شده باشد..SH "حمایت‌های مالی (DONATIONS)"

vdirsyncer یک نرم‌افزار آزاد و متن‌باز است و همواره چنین خواهد ماند. ما از حامیانی که مایل به تأمین مالی ادامهٔ کار ما روی آن هستند، قدردانی می‌کنیم.

اگر کار من برایتان مفید بوده است، لطفاً حمایت مالی از آن را مد نظر داشته باشید. با سپاس!

  • بیت‌کوین (Bitcoin): 13p42uWDL62bNRH3KWA6cSpSgvnHy1fs2E.
  • حمایت از طریق پرداخت‌های یک‌باره یا کمک‌های مالی دوره‌ای از طریق Ko-fi https://ko-fi.com/whynothugo.
  • حمایت از طریق کمک‌های مالی دوره‌ای از طریق liberapay https://liberapay.com/WhyNotHugo.

Markus Unterwaditzer

2014-2026, Markus Unterwaditzer و مشارکت‌کنندگان

September 5, 2026 0.21