project:ccleanerautoupdate
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
project:ccleanerautoupdate [2013/04/20 07:02] – 초벌 구조 잡기 changwoo | project:ccleanerautoupdate [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 3: | 줄 3: | ||
{{http:// | {{http:// | ||
- | CCleaner는 개인이 집에서 무료로 이용할 수 있는 ' | + | CCleaner는 개인이 집에서 무료로 이용할 수 있는 ' |
- | 그런데 쓰다 보면 이 무료 버전의 자동 업데이트 미지원이 은근히 귀찮습니다. 대략 2-3주, 길면 한 두달에 한 번 생각날 때마다 한 번 정도 사용하는데 거의 이 주기가 지나면 적어도 1번쯤은 프로그램의 업데이트가 되어 있죠. 그래서 사실상 CCleaner를 사용할 때마다 먼저 업데이트부터 | + | 그런데 쓰다 보면 이 무료 버전의 자동 업데이트 미지원이 은근히 귀찮습니다. 대략 2-3주, 길면 한 두달에 한 번 생각날 때마다 한 번 정도 사용하는데 거의 이 주기가 지나면 적어도 1번쯤은 프로그램의 업데이트가 되어 있죠. 그래서 사실상 CCleaner를 사용할 때마다 먼저 업데이트부터 |
- | 하지만 여전히 무료로 사용하고 싶지만, 이 귀찮음을 감수하시는 분들이 계실 터입니다. 살짝 반칙 같지만, 그래서 약간 제작사인 Piriform에 미안한 맘이 들지만, | + | 하지만 여전히 무료로 사용하면서, 이 귀찮음을 |
- | 사실 얼마전부터 CCleaner의 유료 버전인 CCleaner Professional을 사용중입니다. 이 버전은 자동 업데이트가 지원되어 편하게 사용할 수 있지만, 사실 무료 버전의 CCleaner와 별다른 차이가 없습니다. 자동 업데이트가 지원되지 않는 점만 감안하면 무료 버전도 충분히 쓸만합니다. 사실 그렇게 큰 차이도 없는데 돈을 지불한 것이 조금 아깝기까지도 합니다. | + | 사실 얼마전부터 CCleaner의 유료 버전인 CCleaner Professional을 사용중입니다. 이 버전은 자동 업데이트가 지원되어 편하게 사용할 수 있지만, 사실 무료 버전의 CCleaner와 별다른 차이가 없습니다. 자동 업데이트가 지원되지 않는 점만 감안하면 무료 버전도 충분히 쓸만합니다. 사실 그렇게 큰 차이도 없는데 돈을 지불한 것이 조금 아깝기까지도 합니다. 이번에도 역시 파이썬 |
- | + | ||
- | 이번에도 역시 파이썬 스크립트를 사용합니다. CCleaner는 윈도우 기반의 소프트웨어이므로 이 스크립트는 윈도우에서만 동작한다고 가정합니다. | + | |
===== 작업 방법 ===== | ===== 작업 방법 ===== | ||
줄 22: | 줄 20: | ||
==== 로컬 PC 버전 쿼리 ==== | ==== 로컬 PC 버전 쿼리 ==== | ||
+ | CCleaner의 버전은 CCleaner의 파일 속성을 조사해보면 쉽게 알 수 있습니다. 탐색기에서 CCleaner.exe 파일을 선택해 우측 마우스를 클릭해서 ' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 문제는 이 정보를 우리가 쉽게 프로그램으로 가져올 수 있도록 해야합니다. 이렇게 마우스 클릭 및 메뉴 선택 등의 작업이 들어가면 자동화하기 어렵습니다. 이러한 명령을 CLI 상에서 쉽게 할 수 있는 방법을 찾아야 합니다. 아주 다행히도 이러한 방법은 구글에서 쉽게 검색을 통해 알아냈습니다. 이렇게 하면 됩니다. | ||
+ | |||
+ | <code dos> | ||
+ | wmic DATAFILE WHERE NAME=" | ||
+ | |||
+ | [version.txt 파일] | ||
+ | Version | ||
+ | 4.0.0.4064 | ||
+ | </ | ||
+ | |||
+ | [[http:// | ||
+ | 이렇게 얻어낸 version.txt 파일을 파이썬으로 처리하는 것은 식은 죽 먹기입니다. | ||
==== 온라인 최신 버전 쿼리 ==== | ==== 온라인 최신 버전 쿼리 ==== | ||
+ | 최신 버전 정보는 공식 홈페이지의 웹페이지를 크롤링해서 얻어낼 수 있습니다. 이 부분이 사실 민감하다면 민감한 부분입니다. 물론 홈페이지에서 버전 정보를 얻어내는 것이 문제가 되는 내용은 아닙니다만, | ||
+ | |||
+ | 최신 버전은 [[http:// | ||
+ | |||
+ | <code html> | ||
+ | <h2 class=" | ||
+ | <div class=" | ||
+ | <ul class=" | ||
+ | <li> | ||
+ | < | ||
+ | v4.00.4064 | ||
+ | </ | ||
+ | ..... | ||
+ | </ | ||
+ | |||
+ | 매우 쉽습니다. ul class=" | ||
==== 파일 다운로드 및 설치 ==== | ==== 파일 다운로드 및 설치 ==== | ||
+ | 이 부분도 Piriform이 디자인을 바꾸면 그에 따라 가야 하는 부분입니다. 다운로드는 [[http:// | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 위 그림처럼 ' | ||
+ | |||
+ | 이 다음은 새롭게 받은 CCleaner를 설치해야합니다. 그런데 여기서 GUI 창을 통해 클릭을 할 수는 없지요. 다운로드가 끝남과 동시에 자동으로 설치가 되어야 합니다. CCleaner 무료 버전도 다행히 명령줄을 통한 자동 설치가 가능합니다. 다음과 같은 명령을 입력하면 됩니다. | ||
+ | <code dos> | ||
+ | ccsetup.exe /S /L=1042 / | ||
+ | </ | ||
+ | |||
+ | '/ | ||
===== 구현 ===== | ===== 구현 ===== | ||
- | ==== 로컬 PC 쿼리 스크립트 ==== | ||
- | ==== 온라인 최신 버전 쿼리 스크립트 ==== | ||
- | ==== 파일 다운로드 및 설치 스크립트 ==== | ||
- | ==== 위 세 스크립트를 동작시키는 스크립트 ==== | ||
==== 설정 파일 ==== | ==== 설정 파일 ==== | ||
+ | 일단 간단한 텍스트 파일로 된 설정 파일을 먼저 만들도록 하겠습니다. 설정 파일의 내용에는 아래 사항이 기록될 것입니다. | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | <code text ccleaner_update.cfg> | ||
+ | ccleaner_path: | ||
+ | release_url: | ||
+ | relaese_re: <ul class=" | ||
+ | download_url: | ||
+ | download_re: | ||
+ | install_arg: | ||
+ | </ | ||
+ | |||
+ | ==== 본 구현 ==== | ||
+ | <code python CCleanerAutoUpdate.py> | ||
+ | # -*- coding: UTF-8 -*- | ||
+ | import sys | ||
+ | import os | ||
+ | import urllib2 | ||
+ | import re | ||
+ | |||
+ | def GetHTML(URL): | ||
+ | obj = urllib2.urlopen(URL) | ||
+ | html = obj.read() | ||
+ | obj.close() | ||
+ | return html | ||
+ | |||
+ | # Version 확인을 위한 클래스 | ||
+ | class Version: | ||
+ | |||
+ | major = None | ||
+ | minor = None | ||
+ | build = None | ||
+ | |||
+ | # 로컬 버전 문자열 읽음. | ||
+ | def FromLocalVersionString(self, | ||
+ | vers = localVersionString.split(' | ||
+ | self.major = int(vers[0]) | ||
+ | self.minor = int(' | ||
+ | self.build = int(vers[3]) | ||
+ | |||
+ | # 최신 버전 (웹페이지에서 확인한) 문자열 읽음 | ||
+ | def FromCurrentVersionString(self, | ||
+ | vers = currentVersionString.split(' | ||
+ | self.major = int(vers[0]) | ||
+ | self.minor = int(vers[1]) | ||
+ | self.build = int(vers[2]) | ||
+ | |||
+ | def __str__(self): | ||
+ | return ' | ||
+ | |||
+ | # 로컬 버전 <= 최신버전이므로 !=, == 만 정의. | ||
+ | def __eq__(self, | ||
+ | return isinstance(other, | ||
+ | |||
+ | def __ne__(self, | ||
+ | return not self.__eq__(other) | ||
+ | |||
+ | |||
+ | def CheckUpdate(config): | ||
+ | # check CCleaner.exe exists! | ||
+ | if os.path.exists(config[' | ||
+ | print >> sys.stderr, '%s does not exist!' | ||
+ | return 1 | ||
+ | |||
+ | # local ccleaner version | ||
+ | print " | ||
+ | command = 'wmic DATAFILE WHERE NAME=" | ||
+ | os.system(command) | ||
+ | |||
+ | # get version | ||
+ | with open(' | ||
+ | text | ||
+ | iv_txt = text.split(u' | ||
+ | |||
+ | # current release version | ||
+ | print ' | ||
+ | release_html = GetHTML(config[' | ||
+ | release_exp | ||
+ | release_srch = release_exp.search(release_html).groups() | ||
+ | |||
+ | cv_txt | ||
+ | reldate = release_srch[1].strip() | ||
+ | |||
+ | # To canonical versino expression. | ||
+ | installed_ver = Version() | ||
+ | current_ver | ||
+ | |||
+ | installed_ver.FromLocalVersionString(iv_txt) | ||
+ | current_ver.FromCurrentVersionString(cv_txt) | ||
+ | |||
+ | print ' | ||
+ | print ' | ||
+ | |||
+ | # compare two | ||
+ | if installed_ver == current_ver: | ||
+ | print ' | ||
+ | return 0 | ||
+ | else: | ||
+ | print ' | ||
+ | |||
+ | # download current release | ||
+ | download_html = GetHTML(config[' | ||
+ | download_exp | ||
+ | download_srch = download_exp.search(download_html) | ||
+ | |||
+ | url = download_srch.groups()[0] | ||
+ | filename | ||
+ | |||
+ | print 'Begin downloading...' | ||
+ | obj = urllib2.urlopen(url) | ||
+ | with open(filename, | ||
+ | f.write(obj.read()) | ||
+ | obj.close() | ||
+ | |||
+ | print ' | ||
+ | |||
+ | cmd = filename + ' ' + config[' | ||
+ | |||
+ | print ' | ||
+ | os.system(cmd) | ||
+ | print ' | ||
+ | return 0 | ||
+ | |||
+ | def ParseConfig(configfile): | ||
+ | config = {} | ||
+ | with open(configfile, | ||
+ | for l in f: | ||
+ | colon = l.find(':' | ||
+ | prop | ||
+ | val | ||
+ | |||
+ | config[prop] = val | ||
+ | |||
+ | return | ||
+ | |||
+ | def main(argv): | ||
+ | |||
+ | # parse config file | ||
+ | configfile = ' | ||
+ | if len(argv) == 2: | ||
+ | configfile = argv[1] | ||
+ | config = ParseConfig(configfile) | ||
+ | |||
+ | # begin the job | ||
+ | return CheckUpdate(config) | ||
+ | |||
+ | if __name__ == ' | ||
+ | sys.exit(main(sys.argv)) | ||
+ | </ | ||
+ | |||
===== 끝마치며 ===== | ===== 끝마치며 ===== | ||
- | 참으로 잉여롭습니다. 혹시나 CCleaner 설치라는 혹을 떼려다가 스크립트 관리라는 혹을 붙인 게 아닌가 싶습니다. 하지만 호기심을 | + | 참으로 잉여롭습니다! :-) 혹시나 CCleaner 설치라는 혹을 떼려다가 스크립트 관리라는 혹을 붙인 게 아닌가 싶습니다. 하지만 호기심을 |
===== 참고자료 ===== | ===== 참고자료 ===== |
project/ccleanerautoupdate.1366441332.txt.gz · 마지막으로 수정됨: 2014/10/09 21:23 (바깥 편집)