3

Open edX课程备份工具

 2 years ago
source link: http://wwj718.github.io/post/edx/backup-open-edx-course/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Open edX课程备份工具

2016-04-12

就教育而言,内容始终是个宝贵资源,随着平台课程增多,如何备份就是个摆上日程的问题了,当课程还少的时候,采用定人定期备份的方式也觉得尚可接受,可手动备份的缺陷太多

  • 重复性的导入导出极其乏味,浪费时间
  • 导出课程名是随机字符,很闹归类
  • 人类不善于且厌恶重复性的工作,容易出错

这类工作让代码来做再合适不过了,所以我写了个备份Open edx课程的工具,已经上传到github和pypi,直接安装就可使用

当前版本只支持python2

建议采用virtualenv来管理环境(virtualenv -p /usr/bin/python2 env),使用centos的同学最好采用以上建议,其他操作系统的其他同学可以无视

我们先来看下如何使用,十分简单,首先安装它:pip install course_backup

安装完成后,执行course_backup --help会看到参数提示

首先你需要登录studio,查看你的cookies中sessionid和csrftoken字段,然后填入配置文件,默认的配置文件为~/.backup_course.ini,当然你也可以自己指定它

我的配置文件为(cat ~/.backup_course.ini):

[main]
studio = http://192.168.0.100:18010
sessionid = 2aerthgca4fyqt4hqza38jhmoue9te5v
csrftoken = c4DiddgttfhhttjfKrCb47YQBeyS

填好配置文件后就可以启动备份任务啦

现在开始备份

course_backup –start

晚上两点开始备份

course_backup –start –night

指定配置文件

course_backup –start –config_file ./my_config_file.ini

指定备份目录

course_backup –start –courses_data_path /tmp/data

course_backup –start –night –interval_days 7 –courses_data_path /tmp/data

每七天备份一次,滚动周期为3周(超过3周的文件将自动删除)

  • 只备份差异版本
  • 定时任务(for humans)

这个自己写的工具从使用来看倒是挺顺手的。不过设计的时候,有一点始终让我左右为难:是提供一体化的解决方案好,还是让工具只专注在一件事(诸如只下载课程),然后把它和其他linux工具组合起来使用

《Unix编程艺术》里建议说

do one thing,and do well

这也是Unix哲学提倡的。

陷入到实际项目中,什么叫one thing呢?就很让人头疼,在这里我可能觉得backup courses整件事就是one thing,而其他人可能觉得download course是one thing,other thing可以通过组合其他工具,这样最终完成backup courses,诸如:

  • course_backup提供download course指令(粒度似乎很合适,利落)
  • course_backup提供所有课程id
  • 通过course_backup首先获得所有id,然后通过bash写一个循环来download all courses
  • 使用cron来写定时任务
  • 使用bash来写滚动备份功能

如果你真的这样做,你可能会发现,实际上我们只是把编程的任务从python移交到bash脚本里。

在bash里写逻辑是我极不情愿做的一件事,相比于shell里那些好用的工具(vim/grep/find/sed…),bash的语法简直丑哭。所以就我而言我会选择尽可能用python把逻辑写到course_backup里,对外暴露出配置选项,那么我的one thing粒度可能大一些

即便如此我对一些东西是不是应该包含在工具内还是犹豫不决,即便现在也是,诸如定时任务功能是应该用系统的cron来做还是采用python的定时任务模块来写到工具内部,写在外部的好处是:

  • 用户可以自由写定时任务
  • 代码简介干净

而混杂在工具里,就是这个工具不得不是一个常驻进程,同时为了追求灵活的配置参数,解析参数的代码也会很长,而这些本不是核心代码,不过是重造了一个丑陋的车轮

可把定时功能混和在工具里,也有好处

  • 对用户而言,上手容易,不需要而外去学cron和linux脚本

当然你可以说这是我对目标用户的定位不够清晰。这又是另一种的问题了。工程问题也许就许多这一类各种因素都需要权衡的问题

关于one thing的粒度,我一直拿捏不好,不知道别人是不是也有这个疑惑。我的自我安慰是这是一件需要权衡的事,也许还包含武断/拖鞋的/拍脑袋的过程,也许我们会把它称为直觉,无论用哪个词,指的似乎都是非理性的判断过程

这可能也是《Unix编程艺术》书名中艺术的所指吧

我并不是说我不喜欢do one thing,and do well这个建议,相反,它可能是我最喜欢的几个编程箴言之一,它优美而非线性,需要我们不断打磨练习和试错。在我读过的所有计算机的书里,《Unix编程艺术》和《代码大全》可能是我最喜欢的两本实践类指导书籍,我把他们看做best practice。

付诸直觉的事,尤其是在各种特质中做折衷选择的事,决策者肯定都会有足够的理由为自己辩护,最后我们能说的可能只有

Talk is cheap, show me your code

上传到pypi

course_backup


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK