인터넷이 되지 않는 어떤 머신에
OS가 Ubuntu가 설치 된 경우
apt get을 통해 패키지를 설치하고 싶지만, 인터넷이 되지 않기에
인터넷이 되는 다른 머신에서 repository에서 필요한 패키지를 찾아 직접 설치 해야 한다.
Python을 이용해 이를 자동화 할 수 있는 코드를 짜보았다.
import gzip
import os
import wget
import sys
repository="old-releases.ubuntu.com/ubuntu"
ARCH="arm64"
release="vivid"
branch="main"
def check_dependency(package_depends):
if package_depends == None:
return;
depends_list_pre = package_depends.split(", ")
depends_list_post = [] #[depend_package, version, comparator]
for depend in depends_list_pre:
if depend.find("(") != -1:
depend_package = depend[:depend.find("(")-1]
version = depend[depend.find(" ", depend.find("("))+1:depend.find(")")]
comparator = depend[depend.find("(")+1: depend.find(" ", depend.find("("))]
else:
depend_package = depend
version = ""
comparator = ""
depends_list_post.append([depend_package, version, comparator])
print(depends_list_post)
for depend, ver, com in depends_list_post:
find_package(depend, ver, com)
def down_pacakge(filename):
file_path_and_name = filename.split("/")
if not os.path.exists("./"+repository+"/"+release+"/"+branch+"/deb/"+file_path_and_name[-1]):
url = "http://"+repository+"/"+filename
print(url)
wget.download(url, "./"+repository+"/"+release+"/"+branch+"/deb/"+file_path_and_name[-1])
return 1;
return 0;
def find_package(package_name, version="", comparator=""):
package_list_file = "./"+repository+"/"+release+"/"+branch+"/binary-"+ARCH+"/Packages.gz"
if not os.path.exists(package_list_file):
if not os.path.exists("./"+repository+"/"+release+"/"+branch+"/binary-"+ARCH):
os.mkdir("./"+repository+"/"+release+"/"+branch+"/binary-"+ARCH)
#download Packages.gz
url = "http://"+repository+"/dists/"+release+"/"+branch+"/binary-"+ARCH+"/Packages.gz"
wget.download(url, package_list_file)
package_list = []
package_info = {}
package_list_filep = gzip.open(package_list_file, 'r')
for line in package_list_filep:
line_str = line.decode("utf-8")
line_str = line_str.replace("\n", "")
if line_str == "":
package_list.append(package_info)
package_info = {}
else:
line_elements = line_str.split(": ")
package_info.update({line_elements[0] : line_elements[1]})
package_list_filep.close()
for package in package_list:
if package.get("Package") == package_name:
if(version==""):
if down_pacakge(package.get("Filename")):
check_dependency(package.get("Depends"))
return package;
elif comparator == "=" and package.get("Version") == version:
if down_pacakge(package.get("Filename")):
check_dependency(package.get("Depends"))
return package;
elif comparator == ">=" and package.get("Version") >= version:
if down_pacakge(package.get("Filename")):
check_dependency(package.get("Depends"))
return package;
print("ERROR::Cannot find package("+package_name+")")
for argument in sys.argv:
if argument == "apt_get.py":
continue;
else:
find_package(argument)
패키지는 해당 머신에 복사해주시고,
설치는 아래와 같이 하면 된다.
$ sudo dpkg -i *.deb
원리는 간단하다.
repository 에는 package 정보가 담긴 파일이 존재하고(architecture / release / branch)
해당 파일에는 Package 의 이름, 버전, dependency, 패키지 파일 경로 등이 담겨 있다.
패키지 설치를 위해서는 각 패키지 파일(.deb)을 다운 받아야하고, 또한 dependency 파일들의 패키지 파일도 다운 받아야 한다.
다운받은 모든 파일을 dpkg 를 통해 한 번에 설치 하면 된다.
끗
'Programming > Python' 카테고리의 다른 글
Python 으로 탭/공백으로 구분 된 파일 parsing 하기 (0) | 2017.12.19 |
---|