require "packageServer.rb"
class PackageDistribution
- attr_accessor :name, :pkgsvr_url, :pkgsvr_ip, :pkgsvr_port, :pkgsvr_password, :status, :description, :id
-
- def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, status )
- @id = -1
- @name = name
- @pkgsvr_url = pkgsvr_url
- @pkgsvr_ip = pkgsvr_ip
- @pkgsvr_port = pkgsvr_port
- @pkgsvr_password = pkgsvr_password
- @status = status
- @description = ""
- end
-
-
- def self.create_table(db, inc, post_fix)
- db.do "CREATE TABLE distributions (
- id INTEGER PRIMARY KEY #{inc},
- name VARCHAR(32) NOT NULL UNIQUE,
- pkgsvr_url VARCHAR(256),
- pkgsvr_addr VARCHAR(64),
- pkgsvr_password VARCHAR(64),
- status VARCHAR(32) NOT NULL DEFAULT 'OPEN',
- description VARCHAR(256) ) #{post_fix}"
- end
-
-
- def self.load(name, db)
- row = db.select_one("SELECT * FROM distributions WHERE name='#{name}'")
- return ( row.nil? ) ? nil : load_row(row)
- end
-
-
- def unload(db)
- #TODO remove sync_pkg_server
- #TODO remove projects
- #TODO remove jobs
- db.do("DELETE FROM distributions WHERE name='#{@name}'")
- end
-
-
- def self.load_all(db)
- result = []
- db.select_all("SELECT * FROM distributions") do |row |
- result.push load_row(row)
- end
- return result
- end
-
-
- def self.load_first(db)
- row = db.select_one("SELECT * FROM distributions ORDER BY id")
- return ( row.nil? ) ? nil : load_row(row)
- end
-
-
- def self.load_row(row)
- pkgsvr_ip = row['pkgsvr_addr'].split(":")[0]
- pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i
- new_obj = new(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port, row['pkgsvr_password'], row['status'])
- new_obj.description = row['description']
- new_obj.id = row['id']
-
- return new_obj
- end
-
-
- def save(db)
- dist_addr = @pkgsvr_ip + ":" + @pkgsvr_port.to_s
- row = db.select_one("SELECT * FROM distributions WHERE name='#{@name}'")
- if row.nil? then
- db.do "INSERT INTO distributions(name, pkgsvr_url, pkgsvr_addr, pkgsvr_password, status, description) VALUES ('#{@name}','#{@pkgsvr_url}','#{dist_addr}','#{@pkgsvr_password}','#{@status}','#{@description}')"
- else
- db.do "UPDATE distributions SET pkgsvr_url='#{@pkgsvr_url}', pkgsvr_addr='#{dist_addr}', pkgsvr_password='#{@pkgsvr_password}', status='#{@status}', description='#{@description}' WHERE name='#{@name}'"
- end
- end
-
-
- def self.get_distribution_id(db, dist_name)
- row = db.select_one("SELECT * FROM distributions WHERE name='#{dist_name}'")
- return ( row.nil? ) ? "NULL" : row['id']
- end
+ attr_accessor :name, :pkgsvr_url, :pkgsvr_ip, :pkgsvr_port, :pkgsvr_password, :status, :description, :id
+
+ def initialize( name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, status )
+ @id = -1
+ @name = name
+ @pkgsvr_url = pkgsvr_url
+ @pkgsvr_ip = pkgsvr_ip
+ @pkgsvr_port = pkgsvr_port
+ @pkgsvr_password = pkgsvr_password
+ @status = status
+ @description = ""
+ end
+
+
+ def self.create_table(db, inc, post_fix)
+ db.do "CREATE TABLE distributions (
+ id INTEGER PRIMARY KEY #{inc},
+ name VARCHAR(32) NOT NULL UNIQUE,
+ pkgsvr_url VARCHAR(256),
+ pkgsvr_addr VARCHAR(64),
+ pkgsvr_password VARCHAR(64),
+ status VARCHAR(32) NOT NULL DEFAULT 'OPEN',
+ description VARCHAR(256) ) #{post_fix}"
+ end
+
+
+ def self.load(name, db)
+ row = db.select_one("SELECT * FROM distributions WHERE name='#{name}'")
+ return ( row.nil? ) ? nil : load_row(row)
+ end
+
+
+ def unload(db)
+ #TODO remove sync_pkg_server
+ #TODO remove projects
+ #TODO remove jobs
+ db.do("DELETE FROM distributions WHERE name='#{@name}'")
+ end
+
+
+ def self.load_all(db)
+ result = []
+ db.select_all("SELECT * FROM distributions") do |row |
+ result.push load_row(row)
+ end
+ return result
+ end
+
+
+ def self.load_first(db)
+ row = db.select_one("SELECT * FROM distributions ORDER BY id")
+ return ( row.nil? ) ? nil : load_row(row)
+ end
+
+
+ def self.load_row(row)
+ pkgsvr_ip = row['pkgsvr_addr'].split(":")[0]
+ pkgsvr_port = row['pkgsvr_addr'].split(":")[1].to_i
+ new_obj = new(row['name'], row['pkgsvr_url'], pkgsvr_ip, pkgsvr_port, row['pkgsvr_password'], row['status'])
+ new_obj.description = row['description']
+ new_obj.id = row['id']
+
+ return new_obj
+ end
+
+
+ def save(db)
+ dist_addr = @pkgsvr_ip + ":" + @pkgsvr_port.to_s
+ row = db.select_one("SELECT * FROM distributions WHERE name='#{@name}'")
+ if row.nil? then
+ db.do "INSERT INTO distributions(name, pkgsvr_url, pkgsvr_addr, pkgsvr_password, status, description) VALUES ('#{@name}','#{@pkgsvr_url}','#{dist_addr}','#{@pkgsvr_password}','#{@status}','#{@description}')"
+ else
+ db.do "UPDATE distributions SET pkgsvr_url='#{@pkgsvr_url}', pkgsvr_addr='#{dist_addr}', pkgsvr_password='#{@pkgsvr_password}', status='#{@status}', description='#{@description}' WHERE name='#{@name}'"
+ end
+ end
+
+
+ def self.get_distribution_id(db, dist_name)
+ row = db.select_one("SELECT * FROM distributions WHERE name='#{dist_name}'")
+ return ( row.nil? ) ? "NULL" : row['id']
+ end
end
class DistributionManager
- # initialize
- def initialize( server )
- @server = server
- end
-
-
- # get default distribution
- def get_default_distribution_name()
- dist = get_first_distribution()
- return ( dist.nil? ) ? nil : dist.name
- end
-
-
- def get_default_pkgsvr_url()
- dist = get_first_distribution()
- return ( dist.nil? ) ? "" : dist.pkgsvr_url
- end
-
-
- # get distribution
- #name get_distribution(name)
- #return PackageDistribution
- #return nil when package distribution not exit or DB connection error
- def get_distribution(name)
- # conntect DB
- result = nil
- begin
- @server.get_db_connection() do |db|
- result = get_distribution_internal(name, db)
- end
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.errstr
- end
- end
- return result
- end
-
-
- def get_distribution_internal(name, db)
- return PackageDistribution.load(name, db)
- end
-
-
- # add
- #name add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
- #return true when add distribution successed
- #return false when distribution already exist or DB connection error
- def add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
- result = false
- begin
- @server.get_db_connection() do |db|
- if not get_distribution_internal(name, db).nil? then
- @server.log.info "The distribution \"#{name}\" already exists on server"
- @server.log.error "Adding distribution failed!"
- else
- new_dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN")
- new_dist.save(db)
- result = true
- @server.log.info "Added a new distribution \"#{name}\""
- end
- end
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.errstr
- end
- end
- return result
- end
-
-
- # clone
- #name clone_distribution(origin_name, target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
- #return true when add distribution successed
- #return false when distribution already exist or DB connection error
- def clone_distribution(origin_name, target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
- result = false
- begin
- @server.get_db_connection() do |db|
- if get_distribution_internal(origin_name, db).nil? then
- @server.log.info "The distribution \"#{origin_name}\" is not exists on server"
- @server.log.error "Clone distribution failed!"
- elsif not get_distribution_internal(target_name, db).nil? then
- @server.log.info "The distribution \"#{target_name}\" already exists on server"
- @server.log.error "Clone distribution failed!"
- else
- new_dist = PackageDistribution.new(target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN")
- new_dist.save(db)
- @server.log.info "Added a new distribution \"#{target_name}\""
+ # initialize
+ def initialize( server )
+ @server = server
+ end
+
+
+ # get default distribution
+ def get_default_distribution_name()
+ dist = get_first_distribution()
+ return ( dist.nil? ) ? nil : dist.name
+ end
+
+
+ def get_default_pkgsvr_url()
+ dist = get_first_distribution()
+ return ( dist.nil? ) ? "" : dist.pkgsvr_url
+ end
+
+
+ # get distribution
+ #name get_distribution(name)
+ #return PackageDistribution
+ #return nil when package distribution not exit or DB connection error
+ def get_distribution(name)
+ # conntect DB
+ result = nil
+ begin
+ @server.get_db_connection() do |db|
+ result = get_distribution_internal(name, db)
+ end
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.errstr
+ end
+ end
+ return result
+ end
+
+
+ def get_distribution_internal(name, db)
+ return PackageDistribution.load(name, db)
+ end
+
+
+ # add
+ #name add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
+ #return true when add distribution successed
+ #return false when distribution already exist or DB connection error
+ def add_distribution(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
+ result = false
+ begin
+ @server.get_db_connection() do |db|
+ if not get_distribution_internal(name, db).nil? then
+ @server.log.info "The distribution \"#{name}\" already exists on server"
+ @server.log.error "Adding distribution failed!"
+ else
+ new_dist = PackageDistribution.new(name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN")
+ new_dist.save(db)
+ result = true
+ @server.log.info "Added a new distribution \"#{name}\""
+ end
+ end
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.errstr
+ end
+ end
+ return result
+ end
+
+
+ # clone
+ #name clone_distribution(origin_name, target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
+ #return true when add distribution successed
+ #return false when distribution already exist or DB connection error
+ def clone_distribution(origin_name, target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password)
+ result = false
+ begin
+ @server.get_db_connection() do |db|
+ if get_distribution_internal(origin_name, db).nil? then
+ puts "The distribution \"#{origin_name}\" is not exists on server"
+ puts "Clone distribution failed!"
+ @server.log.info "The distribution \"#{origin_name}\" is not exists on server"
+ @server.log.error "Clone distribution failed!"
+ elsif not get_distribution_internal(target_name, db).nil? then
+ puts "The distribution \"#{target_name}\" already exists on server"
+ puts "Clone distribution failed!"
+ @server.log.info "The distribution \"#{target_name}\" already exists on server"
+ @server.log.error "Clone distribution failed!"
+ else
+ new_dist = PackageDistribution.new(target_name, pkgsvr_url, pkgsvr_ip, pkgsvr_port, pkgsvr_password, "OPEN")
+ new_dist.save(db)
+ @server.log.info "Added a new distribution \"#{target_name}\""
#Get project list
projects = @server.prjmgr.get_projects_in_distribution(origin_name)
elsif prj.type.eql? "BINARY" then
@server.prjmgr.add_binary_project(prj.name, prj.pkg_name, prj.os_list, target_name)
end
+
+ new_prj = @server.prjmgr.get_project(prj.name, target_name)
# copy source info
source_cnt = db.select_one("SELECT count(*) val FROM sources WHERE project_id =#{prj.prj_id}")[0]
if( source_cnt > 0 )
- new_prj = @server.prjmgr.get_project(prj.name, target_name)
- db.do "INSERT INTO sources(project_id, pkg_ver,location)
- SELECT #{new_prj.prj_id}, pkg_ver, location FROM sources WHERE project_id = #{prj.prj_id}"
+ db.do "INSERT INTO sources(project_id, pkg_ver,location)
+ SELECT #{new_prj.prj_id}, pkg_ver, location FROM sources WHERE project_id = #{prj.prj_id}"
+ end
+
+ # copy access info
+ rows = db.select_all("SELECT * FROM group_project_accesses WHERE project_id = #{prj.prj_id}")
+ if rows.nil? then
+ next
+ end
+ rows.each do |row|
+ group_id = row['group_id']
+ if group_id == 1 then
+ next
+ end
+ db.do "INSERT INTO group_project_accesses (group_id, project_id, build)
+ VALUES (#{group_id}, #{new_prj.prj_id}, 'TRUE')"
end
end
- result = true
- end
- end
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- end
- return result
- end
-
-
- # remove
- #name remove_distribution(name)
- #return ture when remove distribution successed
- #return false when distribution not exist or DB connection error or DB conncetion error
- def remove_distribution(name)
- result = false
- begin
- @server.get_db_connection() do |db|
- dist = get_distribution_internal(name, db)
- if dist.nil? then
- @server.log.error "The distribution \"#{name}\" does not exists on server"
- @server.log.error "Removing distribution failed!"
- else
- dist.unload(db)
- result = true
- @server.log.info "Removed the distribution \"#{name}\""
- end
- end
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.errstr
- end
- end
-
- return result
- end
-
-
- #name get_first_distribution()
- #return PackageDistribution
- #return nil when no distribution exist or DB connection error
- def get_first_distribution()
- result = nil
- begin
- @server.get_db_connection() do |db|
- result = PackageDistribution.load_first(db)
- end
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.errstr
- end
- end
-
- return result
- end
-
-
- #name get_all_distributions()
- #return PackageDistribution list
- #return [] when no PackageDistribution exist or DB connection error
- def get_all_distributions()
- result = []
- begin
- @server.get_db_connection() do |db|
- result = PackageDistribution.load_all(db)
- end
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.errstr
- end
- end
-
- return result
- end
-
-
- #name set_distribution_lock(name, value=true)
- #return true when distribution lock setted
- #return false when distribution lock not exist or DB connection error
- def set_distribution_lock(name, value=true)
- result = false
- begin
- @server.get_db_connection() do |db|
- # check already exist
- dist = get_distribution_internal(name, db)
- if dist.nil? then return false end
-
- dist.status = (value)? "CLOSE" : "OPEN"
- dist.save(db)
- end
- if value then
- @server.log.info "The distribution \"#{name}\" is locked!"
- else
- @server.log.info "The distribution \"#{name}\" is unlocked!"
- end
- result = true
- rescue BuildServerException => e
- if not @server.log.nil? then
- @server.log.error e.message
- end
- rescue => e
- if not @server.log.nil? then
- @server.log.error e.errstr
- end
- end
-
- return result
- end
-
- #END
+ result = true
+ end
+ end
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ end
+ return result
+ end
+
+
+ # remove
+ #name remove_distribution(name)
+ #return ture when remove distribution successed
+ #return false when distribution not exist or DB connection error or DB conncetion error
+ def remove_distribution(name)
+ result = false
+ begin
+ @server.get_db_connection() do |db|
+ dist = get_distribution_internal(name, db)
+ if dist.nil? then
+ @server.log.error "The distribution \"#{name}\" does not exists on server"
+ @server.log.error "Removing distribution failed!"
+ else
+ dist.unload(db)
+ result = true
+ @server.log.info "Removed the distribution \"#{name}\""
+ end
+ end
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.errstr
+ end
+ end
+
+ return result
+ end
+
+
+ #name get_first_distribution()
+ #return PackageDistribution
+ #return nil when no distribution exist or DB connection error
+ def get_first_distribution()
+ result = nil
+ begin
+ @server.get_db_connection() do |db|
+ result = PackageDistribution.load_first(db)
+ end
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.errstr
+ end
+ end
+
+ return result
+ end
+
+
+ #name get_all_distributions()
+ #return PackageDistribution list
+ #return [] when no PackageDistribution exist or DB connection error
+ def get_all_distributions()
+ result = []
+ begin
+ @server.get_db_connection() do |db|
+ result = PackageDistribution.load_all(db)
+ end
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.errstr
+ end
+ end
+
+ return result
+ end
+
+
+ #name set_distribution_lock(name, value=true)
+ #return true when distribution lock setted
+ #return false when distribution lock not exist or DB connection error
+ def set_distribution_lock(name, value=true)
+ result = false
+ begin
+ @server.get_db_connection() do |db|
+ # check already exist
+ dist = get_distribution_internal(name, db)
+ if dist.nil? then return false end
+
+ dist.status = (value)? "CLOSE" : "OPEN"
+ dist.save(db)
+ end
+ if value then
+ @server.log.info "The distribution \"#{name}\" is locked!"
+ else
+ @server.log.info "The distribution \"#{name}\" is unlocked!"
+ end
+ result = true
+ rescue BuildServerException => e
+ if not @server.log.nil? then
+ @server.log.error e.message
+ end
+ rescue => e
+ if not @server.log.nil? then
+ @server.log.error e.errstr
+ end
+ end
+
+ return result
+ end
+
+ #END
end