#macos #calendar #cli #source

app cpcalendars

一个非常简单的 CLI 应用,用于将 Mac OS Calendar.app 日历源复制到其他位置

2 个版本

0.1.1 2020 年 12 月 26 日
0.1.0 2020 年 12 月 25 日

#2414 in 命令行工具

自定义许可协议

11KB
56

cpcalendars

一个非常简单的 CLI 应用,用于将 Mac OS Calendar.app 日历源复制到其他位置。

Status

将 Mac OS Calendar 应用中的日历资源复制到指定的目录,创建一个伪 ICBU 文件。此文件构成了您日历的全面备份。

首次运行时,需要通过系统完整性保护系统授予日历应用的权限。

安装

推荐的安装选项是使用 Homebrew,命令如下

brew install bglezseoane/tap/cpcalendars

您只能使用 Cargo 命令安装程序

cargo install cpcalendars

使用

该工具的正常使用非常简单。您只需运行

cpcalendars <destination>

名为 All Calendars.icbu 的文件夹将保存到 <destination>

对抗 Mac OS 系统完整性保护的权限

如果您的当前 终端应用Calendars.app 访问权限完整磁盘访问权限,并且您从那时起使用 cpcalendars,则该工具将正常工作。如果您只想从您的终端或您从终端使用的脚本中与 cpcalendars 一起工作,则上述内容就足够了,以下步骤与您的用例无关。

否则,如果您想从作为 launchd 代理的脚本程序中使用此工具,则由于系统完整性保护,工具将失败。

Mac OS 系统完整性保护阻止 cpcalendars,因为它尝试访问受保护的 Calendars.app 目录,并且它不继承权限——在终端中使用时,继承终端授予的权限——。要获得权限,您需要运行以下命令

open -a '/usr/local/bin/cpcalendars' --args "<tmp_destination>"

运行上述命令时,将弹出一个窗口,您可以授予 cpcalendars 访问您的日历的权限。 请执行此操作,然后下次工具将正常工作。

如果使用 Cargo 安装,路径 /usr/local/bin/cpcalendars 可能不同。无论如何,您可以使用 which cpcalendars 检查它。

如果您的代理只需要运行工具而没有其他内容,您可以将以下行添加到代理 Info.plist 中,它将正常工作(在之前指示的第一次执行后)

<key>ProgramArguments</key>
    <array>
      	<string>/usr/local/bin/cpcalendars</string>
      	<string>destination</string>
    </array>

由于需要将工具与从 launchd 代理和 集成在 shell 脚本中 以来一起工作,无论出于何种原因,您都需要始终以以下方式运行它:open -'/usr/local/bin/cpcalendars' --args "<destination>" 的形式运行,而不是直接作为命令(例如:/usr/local/bin/cpcalendars <destination>)。也就是说,如果您使用以下代理规范...

<key>ProgramArguments</key>
    <array>
      	<string>/Users/You/scripts/script_which_calls_cpcalendars.sh</string>
    </array>

...您需要按照以下方式运行 cpcalendars

# 'script_which_calls_cpcalendars.sh'
# ...

open -a '/usr/local/bin/cpcalendars' --args "<destination>"
# And not '/usr/local/bin/cpcalendars <destination>

# ...

当使用 open - 运行时,如果启动的应用程序失败,则命令不会返回错误代码,因此为了将此步骤集成到设计良好的脚本中,建议采取以下方法

# ...

# Create temporary file to save the output of the 'open' command
TMP_OPEN_CPCALENDARS_STDOUT=$(mktemp -t open_cpcalendars)

# Run and wait
open -W -a '/usr/local/bin/cpcalendars' \
	--stdout "$TMP_OPEN_CPCALENDARS_STDOUT" \
	--stderr "$TMP_OPEN_CPCALENDARS_STDOUT" \
	--args <destination>

# Check and act attending to the process success
if grep -Fxq 'Error' "$TMP_OPEN_CPCALENDARS_STDOUT" \
	|| ! grep -Fxq 'Process finished successfully.' "$TMP_OPEN_CPCALENDARS_STDOUT"
then
	>&2 echo "Error using 'cpcalendars'."
	rm "$TMP_OPEN_CPCALENDARS_STDOUT"
	exit 1 
fi

# Clean
rm "$TMP_OPEN_CPCALENDARS_STDOUT"

# ...

动机

在我的 Mac OS 机器上,我有一些脚本不能作为代理工作,因为系统完整性保护阻止了它们,只允许授权二进制程序。加上我想学习 Rust 语言的事实,这促使我编写了这个简单的程序,以便在编译程序中将冲突步骤授权,并保持我的脚本流程优雅——而不是将 shell 脚本伪编译并插入到编译语言程序中。然而,最终 cpcalendars 是一个具有潜在用途的通用程序。

依赖项

~3.5MB
~57K SLoC