require "installer"
class Distribution
- attr_accessor :name, :location, :server_url, :lock_file_name
+ attr_accessor :name, :location, :server_url, :lock_file_path
# constant
PKG_LIST_FILE_PREFIX = "pkg_list_"
@server_url = server_url
@log = pkg_server.log
@integrity = pkg_server.integrity
- @lock_file_name = "#{location}/#{LOCK_FILE}"
+ @lock_file_path = "#{location}/#{LOCK_FILE}"
@pkg_hash_os = {}
@archive_pkg_list = []
@snapshot_hash = []
client = Client.new( @server_url, "#{@location}/binary", @log )
# update os list
- client.support_os_list.each do |os|
- if not @support_os_list.include? os then
- add_os(os)
+ add_os_list = client.support_os_list - @support_os_list
+ add_os_list.each do |os|
+ add_os(os)
+ pkg_list_update_flag = true
+ end
+
+ if force then
+ remove_os_list = @support_os_list - client.support_os_list
+ remove_os_list.each do |os|
+ remove_os(os)
+ pkg_list_update_flag = true
end
end
+ update_pkg_list = []
+
for os in @support_os_list
# error check
if client.pkg_hash_os[os].nil? then
- raise "Package list can't generated. url is #{@server_url}. os is #{os}"
+ @log.error("package server does not have os : #{os}", Log::LV_USER)
+ next
end
server_pkg_name_list = client.pkg_hash_os[os].keys
full_pkg_name_list.each do |pkg_name|
ret = sync_package( pkg_name, client, os, force )
- if ret then pkg_list_update_flag = true end
+ if not ret.nil? then
+ update_pkg_list.push(ret)
+ pkg_list_update_flag = true
+ end
end
end
+ # lock
+ Utils.file_lock(@lock_file_path)
+
+ # reload pkg list from newest pkg list file
+ reload_binary_pkg_list
+
+ # update pkg_list hash
+ update_pkg_list.each do |update_option, os, pkg|
+ # if updated package's os is removed then skip update
+ if not @support_os_list.include? os then
+ next
+ end
+
+ case update_option
+ when "ADD"
+ new_pkg = @pkg_hash_os[os][pkg.package_name]
+
+ if (not force) and (not new_pkg.nil?) and
+ Utils.compare_version(new_pkg.version, pkg.version).eql?(-1) then
+ # if package is update then skip
+ next
+ end
+
+ @pkg_hash_os[os][pkg.package_name] = pkg
+ when "REMOVE"
+ if not force then
+ if @pkg_hash_os[os][pkg.package_name].origin.eql? "local" then
+ next
+ end
+ end
+
+ @pkg_hash_os[os].delete(pkg.package_name)
+ else
+ @log.error("Unsupportd update option : #{update_option}", Log::LV_USER)
+ next
+ end
+ end
+
+ # check install dependency integrity
+ if @integrity.eql? "YES" then
+ @log.info "integrity check"
+ check_integrity
+ else
+ @log.info "skip integrity check"
+ end
+
+ # update pkg_list file
if pkg_list_update_flag then
write_all_pkg_list()
return true
else
return false
end
+
+ # uplock
+ Utils.file_unlock(@lock_file_path)
end
def sync_archive_pkg
# if update list is empty then return false
if download_list.empty? then return false end
+ updated_file_list = []
+
download_list.each do |pkg|
file = client.download_dep_source(pkg)
if file.nil?
@log.error("Can't download archive package [#{pkg}]", Log::LV_USER)
else
- @archive_pkg_list.push pkg
+ updated_file_list.push pkg
end
end
+ # lock
+ Utils.file_lock(@lock_file_path)
+
+ # reload archive pkg list
+ @archive_pkg_list = read_archive_pkg_list( "" )
+
+ # update archive pkg list
+ updated_file_list.each do |pkg|
+ if not @archive_pkg_list.include? pkg then
+ @archive_pkg_list.push pkg
+ end
+ end
+
write_archive_pkg_list()
+ # uplock
+ Utils.file_unlock(@lock_file_path)
+
return true
end
def add_os(os)
if @support_os_list.include? os then
- @log.error("[#{os} is already exist ", Log::LV_USER)
+ @log.error("#{os} is already exist ", Log::LV_USER)
end
# update os information
File.open( "#{@location}/#{PKG_LIST_FILE_PREFIX}#{os}", "w" ) do |f| end
end
+ def remove_os(os)
+ if not @support_os_list.include? os then
+ @log.error("Can't remove os : #{os} does not exist ", Log::LV_USER)
+ end
+
+ # update os information
+ @support_os_list.delete os
+ @pkg_hash_os.delete os
+
+ # generate temp file
+ tmp_file_name = ""
+ while ( tmp_file_name.empty? )
+ tmp_file_name = @location + "/temp/." + Utils.create_uniq_name
+
+ if File.exist? tmp_file_name then
+ tmp_file_name = ""
+ end
+ end
+
+ info_file = File.readlines("#{@location}/#{OS_INFO_FILE}")
+ File.open(tmp_file_name, "w") do |f|
+ info_file.each do |line|
+ if not line.strip.eql? os then
+ f.puts line
+ end
+ end
+ end
+
+ FileUtils.mv( tmp_file_name, "#{@location}/#{OS_INFO_FILE}", :force => true )
+
+ # delete pkg_list_#{os} file
+ File.delete( "#{@location}/#{PKG_LIST_FILE_PREFIX}#{os}" )
+ end
+
def clean( remain_snapshot_list )
file_list = []
used_archive_list = []
# collect remaning file's name from snapshot list
for snapshot in remain_snapshot_list
- for os in @support_os_list
+ os_info = "#{@location}/snapshots/#{snapshot}/#{OS_INFO_FILE}"
+ os_list = []
+ # if snapshot has os_info file then using that file
+ if File.exist? os_info
+ File.open( os_info, "r" ) do |f|
+ f.each_line do |l|
+ os_list.push l.strip
+ end
+ end
+ # if snapshot does not have os_info file then using package server os_info list
+ else
+ os_list = @support_os_list
+ end
+
+ for os in os_list
begin
info_file = "#{@location}/snapshots/#{snapshot}/#{PKG_LIST_FILE_PREFIX}#{os}"
if not File.exist? info_file then
end
def check_package_integrity(pkg)
- error_msg = "[#{pkg.package_name}]'s install dependency not matched in "
+ error_msg = "[[#{pkg.package_name}] in #{pkg.os}]'s install dependency not matched in "
os = pkg.os
for dep in pkg.install_dep_list
end
- error_msg = "[#{pkg.package_name}]'s build dependency not matched in "
+ error_msg = "[[#{pkg.package_name}] in #{pkg.os}]'s build dependency not matched in "
for dep in pkg.build_dep_list
if dep.target_os_list.length == 0 then
build_dep_os = os
end
end
- error_msg = "[#{pkg.package_name}]'s source dependency not matched in "
+ error_msg = "[[#{pkg.package_name}] in #{pkg.os}]'s source dependency not matched in "
for dep in pkg.source_dep_list
if not @archive_pkg_list.include? dep.package_name then
raise RuntimeError,(error_msg + dep.to_s)
version_cmp = Utils.compare_version( local_pkg.version, server_pkg.version )
if ( version_cmp.eql? 0 ) then
# version is same then skip update
- return false
+ return nil
end
- if ( local_pkg.origin.eql? "local" ) then
- if not force then
- # local_pkg is generated from local and not force mode then skip update
- return false
- end
+ if ( local_pkg.origin.eql? "local" ) and (not force) then
+ # local_pkg is generated from local and not force mode then skip update
+ return nil
end
- sync_package2( server_pkg, client, os, force )
- return true
+ pkg = sync_package2( server_pkg, client, os, force )
+ return ["ADD", os, pkg]
# if package exist only server
elsif ( not server_pkg.nil? ) then
- sync_package2( server_pkg, client, os, force )
- return true
+ pkg = sync_package2( server_pkg, client, os, force )
+ return ["ADD", os, pkg]
# if package exist only local
elsif ( not local_pkg.nil? ) then
# if local pkg is generated from local then skip
- if local_pkg.origin.eql? "local" then
- return false
+ if local_pkg.origin.eql? "local" and (not force) then
+ return nil
end
# package remove
- @pkg_hash_os[os].delete(pkg_name)
- return true
+ return ["REMOVE", os, local_pkg]
else
raise RuntimeError,"hash merge error!"
end
- return false
+ return nil
end
def sync_package2( pkg, client, os, force )
# file download error check
if file_path_list.nil? or file_path_list.empty? then
@log.error("Can't download package file [#{pkg_name}]", Log::LV_USER)
- return
+ return nil
else
file_path = file_path_list[0]
end
# update pkg class
pkg.path = "/binary/#{File.basename(file_path)}"
pkg.origin = client.server_addr
- @pkg_hash_os[os][pkg_name] = pkg
+ return pkg
end
return rdepends_list
end
+
+ def reload_binary_pkg_list
+ if not File.exist?("#{@location}/#{OS_INFO_FILE}") then
+ return
+ end
+
+ # get support_os_list
+ File.open( "#{@location}/#{OS_INFO_FILE}", "r" ) do |f|
+ f.each_line do |l|
+ @support_os_list.push l.strip
+ end
+ end
+
+ # read package_list file
+ for os in @support_os_list
+ @pkg_hash_os[os] = {}
+ pkg_list_file = "#{@location}/#{PKG_LIST_FILE_PREFIX}#{os}"
+
+ if File.exist? pkg_list_file then
+ begin
+ @pkg_hash_os[os] = Parser.read_repo_pkg_list_from( pkg_list_file )
+ rescue => e
+ @log.error( e.message, Log::LV_USER)
+ @pkg_hash_os[os] = nil
+ end
+ end
+ end
+ end
end
Usage: pkg-svr <SUBCOMMAND> [OPTS] or pkg-svr -h
Subcommands:
- create Create a package-server.
- add-dist Add a distribution to package-server.
- register Register a package in package-server.
- remove Remove a package-server.
- remove-dist Remove a distribution to package-server.
- remove-snapshot Remove a snapshot in package-server.
- gen-snapshot Generate a snapshot in package-server.
- sync Synchronize the package-server from parent package server.
- start Start the package-server.
- stop Stop the package-server.
- clean Delete unneeded package files in package-server.
- list Show all pack
+create Create a package-server.
+add-dist Add a distribution to package-server.
+register Register a package in package-server.
+remove Remove a package-server.
+remove-dist Remove a distribution to package-server.
+remove-snapshot Remove a snapshot in package-server.
+gen-snapshot Generate a snapshot in package-server.
+sync Synchronize the package-server from parent package server.
+start Start the package-server.
+stop Stop the package-server.
+clean Delete unneeded package files in package-server.
+list Show all pack
Subcommand usage:
- pkg-svr create -n <server name> -d <distribution> [-u <remote server url>] [-l <location>]
- pkg-svr add-dist -n <server name> -d <distribution> [-u <remote_server_url>] [--clone]
- pkg-svr add-os -n <server name> -d <distribution> -o <os>
- pkg-svr register -n <server name> -d <distribution> -P <package file list> [--gen] [--test]
- pkg-svr link -n <server name> -d <distribution> --origin-pkg-name <origin pkg name> --origin-pkg-os <origin pkg os> --link-os-list <link os list>
- pkg-svr remove -n <server name>
- pkg-svr remove-dist -n <server name> -d <distribution>
- pkg-svr remove-pkg -n <server name> -d <distribution> -P <package name list> [-o <os>]
- pkg-svr remove-snapshot -n <server name> -d <distribution> -s <snapshot list>
- pkg-svr gen-snapshot -n <server name> -d <distribution> -s <snapshot name> [-b <base snapshot name>]
- pkg-svr sync -n <server name> -d <distribution> [--force]
- pkg-svr clean -n <server name> -d <distribution> [-s <snapshot list>]
- pkg-svr start -n <server name> -p <port>
- pkg-svr stop -n <server name> -p <port>
- pkg-svr list [-n <server name>]
+pkg-svr create -n <server name> -d <distribution> [-u <remote server url>] [-l <location>]
+pkg-svr add-dist -n <server name> -d <distribution> [-u <remote_server_url>] [--clone]
+pkg-svr add-os -n <server name> -d <distribution> -o <os>
+pkg-svr register -n <server name> -d <distribution> -P <package file list> [--gen] [--test]
+pkg-svr link -n <server name> -d <distribution> --origin-pkg-name <origin pkg name> --origin-pkg-os <origin pkg os> --link-os-list <link os list>
+pkg-svr remove -n <server name>
+pkg-svr remove-dist -n <server name> -d <distribution>
+pkg-svr remove-pkg -n <server name> -d <distribution> -P <package name list> [-o <os>]
+pkg-svr remove-snapshot -n <server name> -d <distribution> -s <snapshot list>
+pkg-svr gen-snapshot -n <server name> -d <distribution> -s <snapshot name> [-b <base snapshot name>]
+pkg-svr sync -n <server name> -d <distribution> [--force]
+pkg-svr clean -n <server name> -d <distribution> [-s <snapshot list>]
+pkg-svr start -n <server name> -p <port>
+pkg-svr stop -n <server name> -p <port>
+pkg-svr list [-n <server name>]
Options:
- -n, --name <server name> package server name
- -d, --dist <distribution> package server distribution
- -u, --url <server url> remote server url: http://127.0.0.1/dibs/unstable
- -o, --os <operating system> target operating system
- -P, --pkgs <package file list> package file path list
- -s, --snapshot <snapshot> a snapshot name or snapshot list
- -b, --base <base snapshot> base snapshot name
- -l, --loc <location> server location
- -p, --port <port> port number
- --recursive remove all depends packages
- --clone clone mode
- --force force update pkg file
- --test upload for test
- --gen generate snapshot
- --origin-pkg-name <origin_pkg_name>
- origin package name
- --origin-pkg-os <origin_pkg_os>
- origin package os
- --link-os-list <link_os_list>
- target os list to link origin file
- -h, --help display manual
- -v, --version display version
+-n, --name <server name> package server name
+-d, --dist <distribution> package server distribution
+-u, --url <server url> remote server url: http://127.0.0.1/dibs/unstable
+-o, --os <operating system> target operating system
+-P, --pkgs <package file list> package file path list
+-s, --snapshot <snapshot> a snapshot name or snapshot list
+-b, --base <base snapshot> base snapshot name
+-l, --loc <location> server location
+-p, --port <port> port number
+ --recursive remove all depends packages
+ --clone clone mode
+ --force force update pkg file
+ --test upload for test
+ --gen generate snapshot
+ --origin-pkg-name <origin_pkg_name>
+ origin package name
+ --origin-pkg-os <origin_pkg_os>
+ origin package os
+ --link-os-list <link_os_list>
+ target os list to link origin file
+-h, --help display manual
+-v, --version display version