# add
if server.distmgr.add_distribution( dist_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port ) then
- if server.save_db() then
- puts "Distribution is added successfully!"
- return true
- else
- puts "Add distribution to DB failed!"
- return false
- end
+ puts "Distribution is added successfully!"
+ return true
else
puts "Distribution already exists in list!"
return false
# remove
if server.distmgr.remove_distribution( dist_name ) then
- if server.save_db() then
- puts "Distribution is removed successfully!"
- return true
- else
- puts "Remove distribution from DB is failed!"
- return false
- end
+ puts "Distribution is removed successfully!"
+ return true
else
puts "Distribution does not exist in list!"
return false
end
+ # lock distribution
+ def self.lock_distribution(id, dist_name)
+ # get server
+ server = get_server(id)
+
+ # remove
+ if server.distmgr.set_distribution_lock(dist_name, true) then
+ puts "Distribution is locked!"
+ return true
+ else
+ puts "Locking distribution failed!"
+ return false
+ end
+ end
+
+
+ # unlock distribution
+ def self.unlock_distribution(id, dist_name)
+ # get server
+ server = get_server(id)
+
+ # remove
+ if server.distmgr.set_distribution_lock(dist_name, false) then
+ puts "Distribution is unlocked!"
+ return true
+ else
+ puts "Unlocking distribution failed!"
+ return false
+ end
+ end
+
+
# add remote package server
def self.add_sync_package_server(id, url, dist_name)
server = get_server(id)
REMOVE_OS="build-svr remove-os -n <server name> -o <os>"
ADD_DIST= "build-svr add-dist -n <server name> -D <distribution name> -u <package server url> -d <package server address>"
REMOVE_DIST="build-svr remove-dist -n <server name> -D <distribution name>"
+ LOCK_DIST="build-svr lock-dist -n <server name> -D <distribution name>"
+ UNLOCK_DIST="build-svr unlock-dist -n <server name> -D <distribution name>"
ADD_SYNC="build-svr add-sync -n <server name> -u <remote pkg server url> [--dist <distribution>]"
REMOVE_SYNC="build-svr remove-sync -n <server name> -u <remote pkg server url> [--dist <distribution>]"
ADD_PRJ="build-svr add-prj -n <server name> -N <project name> (-g <git repository> -b <git branch>|-P <package name>) [-w <password>] [-o <os list>] [--dist <distribution>]"
raise ArgumentError, "Usage: " + BuildServerUsage::REMOVE_DIST
end
+ when "lock-dist"
+ if options[:name].nil? or options[:name].empty? or
+ options[:dist].nil? or options[:dist].empty? then
+ raise ArgumentError, "Usage: " + BuildServerUsage::LOCK_DIST
+ end
+
+ when "unlock-dist"
+ if options[:name].nil? or options[:name].empty? or
+ options[:dist].nil? or options[:dist].empty? then
+ raise ArgumentError, "Usage: " + BuildServerUsage::UNLOCK_DIST
+ end
+
when "add-sync"
if options[:name].nil? or options[:name].empty? or
(options[:url].nil? or options[:url].empty?) then
+ "\t" + "remove-os Remove supported OS." + "\n" \
+ "\t" + "add-dist Add distribution." + "\n" \
+ "\t" + "remove-dist Remove distribution." + "\n" \
+ + "\t" + "lock-dist Lock distribution." + "\n" \
+ + "\t" + "unlock-dist Unlock distribution." + "\n" \
+ "\t" + "add-sync Add package repository URL to synchronize with." + "\n" \
+ "\t" + "remove-sync Remove package repository URL." + "\n" \
+ "\t" + "add-prj Add project to build." + "\n" \
+ "\t" + BuildServerUsage::REMOVE_OS + "\n" \
+ "\t" + BuildServerUsage::ADD_DIST + "\n" \
+ "\t" + BuildServerUsage::REMOVE_DIST + "\n" \
+ + "\t" + BuildServerUsage::LOCK_DIST + "\n" \
+ + "\t" + BuildServerUsage::UNLOCK_DIST + "\n" \
+ "\t" + BuildServerUsage::ADD_SYNC + "\n" \
+ "\t" + BuildServerUsage::REMOVE_SYNC + "\n" \
+ "\t" + BuildServerUsage::ADD_PRJ + "\n" \
cmd.eql? "add-svr" or cmd.eql? "remove-svr" or
cmd.eql? "add-os" or cmd.eql? "remove-os" or
cmd.eql? "add-dist" or cmd.eql? "remove-dist" or
+ cmd.eql? "lock-dist" or cmd.eql? "unlock-dist" or
cmd.eql? "add-sync" or cmd.eql? "remove-sync" or
cmd.eql? "add-prj" or cmd.eql? "remove-prj" or
cmd.eql? "fullbuild" or cmd.eql? "register" or
class PackageDistribution
attr_accessor :name, :pkgsvr_url, :pkgsvr_ip, :pkgsvr_port, :status
- def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, server )
- @server = server
+ def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, status )
@name = name
@pkgsvr_url = pkgsvr_url
@pkgsvr_ip = pkgsvr_ip
@pkgsvr_port = pkgsvr_port
- @status = "OPEN"
+ @status = status
+ end
+
+
+ def self.load(name, db)
+ row = db.select_one("SELECT * FROM distributions WHERE name='#{name}'")
+ if not row.nil? then
+ return load_row(row)
+ end
+
+ return nil
+ end
+
+
+ def self.unload(name, db)
+ db.do("DELETE FROM distributions WHERE name='#{name}'")
+ end
+
+
+ def self.load_all(db)
+ result = []
+ rows = db.select_all("SELECT * FROM distributions")
+ rows.each do |row|
+ result.push load_row(row)
+ end
+
+ return result
+ end
+
+
+ def self.load_first(db)
+ row = db.select_one("SELECT * FROM distributions")
+ if not row.nil? then
+ return load_row(row)
+ end
+
+ return nil
+ end
+
+
+ def self.load_row(row)
+ pkgsvr_ip = row['pkgsvr_addr'].split(":")[0]
+ pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i
+
+ return new(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port, row['status'])
+ end
+
+
+ def save(db)
+ dist_addr = @pkgsvr_ip + ":" + @pkgsvr_port.to_s
+ db.do "INSERT OR REPLACE INTO distributions VALUES ('#{@name}','#{@pkgsvr_url}','#{dist_addr}','#{@status}')"
end
end
class DistributionManager
- attr_accessor :distributions
# initialize
def initialize( server )
@server = server
- @distributions = []
end
# get default distribution
def get_default_distribution_name()
- if @distributions.count > 0 then
- return @distributions[0].name
+ dist = get_first_distribution()
+ if not dist.nil? then
+ return dist.name
+ else
+ return nil
end
-
- return nil
end
def get_default_pkgsvr_url()
- if @distributions.count > 0 then
- return @distributions[0].pkgsvr_url
+ dist = get_first_distribution()
+ if not dist.nil? then
+ return dist.pkgsvr_url
+ else
+ return ""
end
-
- return ""
end
# get distribution
def get_distribution(name)
- @distributions.each do |d|
- if d.name == name then
- return d
+ # conntect DB
+ begin
+ db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd)
+ begin
+ db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"')
+ rescue DBI::DatabaseError => e
+ # do nothing
end
+
+ return PackageDistribution.load(name, db)
+
+ rescue DBI::DatabaseError => e
+ @server.log.error "DB loading failed!"
+ @server.log.error e.errstr
+ ensure
+ db.disconnect if db
end
return nil
# add
def add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port)
- load_db()
+ # check already exist
if distribution_exist?(name) then
@server.log.info "The distribution \"#{name}\" already exists on server"
@server.log.error "Adding distribution failed!"
return false
end
- add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, "OPEN")
- save_db()
+ begin
+ # open DB
+ db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd)
+ new_dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, "OPEN")
+ new_dist.save(db)
+
+ rescue DBI::DatabaseError => e
+ @server.log.error "DB update failed!"
+ @server.log.error e.errstr
+ return false
+
+ ensure
+ db.disconnect if db
+ end
+
@server.log.info "Added a new distribution \"#{name}\""
return true
end
return false
end
- remove_distribution_internal(name)
+ begin
+ # open DB
+ db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd)
+ PackageDistribution.unload(name, db)
+
+ rescue DBI::DatabaseError => e
+ @server.log.error "DB update failed!"
+ @server.log.error e.errstr
+ return false
+
+ ensure
+ db.disconnect if db
+ end
+
@server.log.info "Removed the distribution \"#{name}\""
return true
end
- # save
- def save_db()
- result = true
+ def get_first_distribution()
begin
# open DB
db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd)
-
- # distributions
- db.do "DELETE FROM distributions"
- @distributions.each do |dist|
- dist_addr = dist.pkgsvr_ip + ":" + dist.pkgsvr_port.to_s
- db.do "INSERT INTO distributions VALUES('#{dist.name}','#{dist.pkgsvr_url}','#{dist_addr}','#{dist.status}')"
+ begin
+ db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"')
+ rescue DBI::DatabaseError => e
+ # do nothing
end
+
+ return PackageDistribution.load_first(db)
+
rescue DBI::DatabaseError => e
- puts "DB update failed!"
- puts e.errstr
- result = false
+ @server.log.error "DB loading failed!"
+ @server.log.error e.errstr
ensure
db.disconnect if db
end
- return result
- end
+ return nil
+ end
- # load
- def load_db()
- result = true
- @distributions = []
+ def get_all_distributions()
begin
# open DB
db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd)
-
begin
db.do('ALTER TABLE distributions ADD COLUMN status VARCHAR(32) DEFAULT "OPEN"')
rescue DBI::DatabaseError => e
# do nothing
end
+ return PackageDistribution.load_all(db)
- # distributions
- rs = db.execute "SELECT * FROM distributions"
- rs.fetch_hash do |row|
- pkgsvr_ip = row['pkgsvr_addr'].split(":")[0]
- pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i
- add_distribution_internal(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port,row['status'])
- end
- rs.finish
rescue DBI::DatabaseError => e
- puts "DB loading failed!"
- puts e.errstr
- result = false
+ @server.log.error "DB loading failed!"
+ @server.log.error e.errstr
ensure
- rs.finish if not rs.finished?
db.disconnect if db
end
- return result
+
+ return []
end
- def add_distribution_internal(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, status)
- dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, @server)
- dist.status = status
- @distributions.push dist
- end
+ def set_distribution_lock(name, value=true)
+ # check already exist
+ dist = get_distribution(name)
+ if dist.nil? then
+ return false
+ end
+ begin
+ # open DB
+ db = DBI.connect("DBI:#{@server.db_dsn}", @server.db_user, @server.db_passwd)
+ dist.status = value ? "LOCKED" : "OPEN"
+ dist.save(db)
- def remove_distribution_internal(name)
- @distributions.delete get_distribution(name)
- end
+ rescue DBI::DatabaseError => e
+ @server.log.error "DB update failed!"
+ @server.log.error e.errstr
+ return false
+ ensure
+ db.disconnect if db
+ end
+
+ if value then
+ @server.log.info "The distribution \"#{name}\" is locked!"
+ else
+ @server.log.info "The distribution \"#{name}\" is unlocked!"
+ end
- def get_all_distributions()
- return @distributions
+ return true
end
#END