우분투 Software & Updates에는 업데이트 채널을 활성화 하는 GUI가 있다는 것을 알고 있습니다.
- 업데이트
- 제안
- 백 포트
- 보안
이 스크린 샷에 표시된대로 :
터미널과 같은 명령을 사용 하여이 작업을 수행하는 쉬운 방법을 찾고 있습니다
sudo apt-add-update enable updates
sudo apt-add-update enable proposed
sudo apt-add-update enable backports
sudo apt-add-update enable security
sudo apt-add-update disable updates
sudo apt-add-update disable proposed
sudo apt-add-update disable backports
sudo apt-add-update disable security
그리고 추가 사항
sudo apt-add-update enable default
sudo apt-add-update disable default
더 나은 이해를위한 몇 가지 예
-
빈
sources.list
-
cat /etc/apt/sources.list
<empty>
-
sudo apt-add-update enable security
<empty>
-
-
하나의 활성화 된 저장소 (
main
)-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily main
-
sudo apt-add-update enable security
deb http://archive.ubuntu.com/ubuntu wily main deb http://archive.ubuntu.com/ubuntu wily-security main
-
-
하나 또는 두 줄에 둘 이상의 활성화 된 저장소
-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily main universe
또는
deb http://archive.ubuntu.com/ubuntu wily main deb http://archive.ubuntu.com/ubuntu wily universe
-
sudo apt-add-update enable security
deb http://archive.ubuntu.com/ubuntu wily main universe deb http://archive.ubuntu.com/ubuntu wily-security main universe
또는
deb http://archive.ubuntu.com/ubuntu wily main deb http://archive.ubuntu.com/ubuntu wily-security main deb http://archive.ubuntu.com/ubuntu wily universe deb http://archive.ubuntu.com/ubuntu wily-security universe
-
-
로
deb-src
엔트리-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily main universe deb-src http://archive.ubuntu.com/ubuntu wily main universe
-
sudo apt-add-update enable security
deb http://archive.ubuntu.com/ubuntu wily main universe deb-src http://archive.ubuntu.com/ubuntu wily main universe deb http://archive.ubuntu.com/ubuntu wily-security main universe deb-src http://archive.ubuntu.com/ubuntu wily-security main universe
-
-
비활성
deb-src
항목-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily main universe # deb-src http://archive.ubuntu.com/ubuntu wily main universe
-
sudo apt-add-update enable security
deb http://archive.ubuntu.com/ubuntu wily main universe # deb-src http://archive.ubuntu.com/ubuntu wily main universe deb http://archive.ubuntu.com/ubuntu wily-security main universe
-
-
default
일-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily-security universe
-
sudo apt-add-update enable default
deb http://archive.ubuntu.com/ubuntu wily universe deb http://archive.ubuntu.com/ubuntu wily-security universe
-
-
하나의 항목과
disable
작업 만-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily-security universe
-
sudo apt-add-update disable security
<empty>
-
-
서로 다르거 나 동일한 리포지토리에 대해 서로 다르거 나 동일한 서버, 각 서버를 존중
-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily universe deb http://us.archive.ubuntu.com/ubuntu wily main
-
sudo apt-add-update enable security
deb http://archive.ubuntu.com/ubuntu wily universe deb http://us.archive.ubuntu.com/ubuntu wily main deb http://archive.ubuntu.com/ubuntu wily-security universe deb http://us.archive.ubuntu.com/ubuntu wily-security main
-
-
다른 저장소에 대한 다른 우분투 릴리스, 각 릴리스 존중
-
cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu wily main universe deb http://archive.ubuntu.com/ubuntu trusty main
-
sudo apt-add-update enable security
deb http://archive.ubuntu.com/ubuntu wily main universe deb http://archive.ubuntu.com/ubuntu trusty main deb http://archive.ubuntu.com/ubuntu wily-security main universe deb http://archive.ubuntu.com/ubuntu trusty-security main
-
-
있는 PPA 또는 다른 패키지 소스 (안-정식)
sources.list
?무시하십시오!
-
프로토콜을 변경하지 마십시오, 예를 들어
https
,http
,tor
, …
답변
이것은 요청 된 내용을 정확하게 수행합니다.
필요한 경우 수시로 업데이트하겠습니다.
최첨단 버전은이 GitHub 리포지토리 에서 찾을 수 있습니다 .
GitHub 리포지토리에서 설치하려면 :
- 설치
git
:sudo apt-get install git
- 저장소를 복제하십시오.
git clone https://github.com/kos0/addRemoveDistribution.git
개요:
enableDisableDistribution.pl <enable|disable> <default|security|updates|proposed|backports>
#!/usr/bin/perl
sub printUsage {
print("Usage: enableDisableDistribution.pl \e[4maction\e[0m \e[4mdistribution\e[0m\n\n");
print("\e[4maction\e[0m must be \e[1menable\e[0m or \e[1mdisable\e[0m\n");
print("\e[4mdistribution\e[0m must be \e[1mdefault\e[0m, \e[1msecurity\e[0m, \e[1mupdates\e[0m, \e[1mproposed\e[0m or \e[1mbackports\e[0m");
exit(0);
}
sub parse {
open(my $in, "/etc/apt/sources.list") || die("Couldn't open '/etc/apt/sources.list': $!");
while(<$in>) {
my $matchDistribution;
chomp;
if(/^deb(-src)? +(.*?).ubuntu.com\/ubuntu\/? +(.*?) +(.*?) *(#.*)?$/) {
my $debSrc = $1 eq "-src";
my $URI = $2;
my @split = split("-", $3);
my @components = sort(split(" ", $4));
if(($distribution eq "default" && defined($split[1])) || ($distribution ne "default" && $split[1] ne $distribution)) {
push(@add, "$debSrc,$URI,$split[0],@components");
}
else {
$matchDistribution = 1;
}
}
(! $matchDistribution && push(@notMatchDistribution, $_)) || push(@matchDistribution, $_);
}
close($in);
}
sub update {
while(1) {
print("Would you like to update the cache? Y-y/N-n: \n");
my $update = <STDIN>;
if($update =~ /^y$/i) {
my $ret = system("apt-get update");
exit($ret);
}
elsif($update =~ /^n$/i) {
exit(0);
}
else {
print("Please enter Y-y or N-n.\n");
}
}
}
sub rewrite {
if($action eq "enable") {
if(@matchDistribution == 0) {
open(my $out, ">", "/etc/apt/sources.list") || die("Couldn't open '/etc/apt/sources.list': $!");
foreach(@notMatchDistribution) {
print $out ($_ . "\n");
}
foreach(@add) {
my @x = split(",");
my @y = split(" ", $x[3]);
my $line = sprintf("deb%s $x[1].ubuntu.com/ubuntu $x[2]%s @y", $x[0] && sprintf("-src"), $distribution ne "default" && sprintf("-$distribution"));
if(! grep(/^$line$/, @added)) {
print $out ($line . " #Added by enableDisableDistribution\n");
push(@added, $line);
}
}
close($out);
printf("Added %s %s.\n", scalar(@added), @added == 1 ? sprintf("entry") : sprintf("entries"));
update;
}
else {
print("$distribution is enabled already. Aborting.\n");
exit(1);
}
}
else {
if(@matchDistribution > 0) {
open(my $out, ">", "/etc/apt/sources.list") || die("Couldn't open '/etc/apt/sources.list': $!");
foreach my $line (@notMatchDistribution) {
print $out ($line . "\n");
}
close($out);
printf("Removed %s %s.\n", scalar(@matchDistribution), @matchDistribution == 1 ? sprintf("entry") : sprintf("entries"));
update;
}
else {
print("$distribution is disabled already. Aborting.\n");
exit(1);
}
}
}
if($> != 0) {
print("You must be root to run enableDisableDistribution.\n");
exit(1);
}
if(@ARGV == 2 && $ARGV[0] =~ /^(enable|disable)$/ && $ARGV[1] =~ /^(default|security|updates|proposed|backports)$/) {
$action = $ARGV[0];
$distribution = $ARGV[1];
}
else {
printUsage;
}
parse;
rewrite;
exit(0);
답변
2015 년 11 월 27 일 업데이트 :
스크립트의 두 번째 버전은 여전히 소스 코드의 부풀림과 여러 다른 도구를 사용해야한다는 사실에 불만을 남겼습니다. 따라서 스크립트를 AWK로만 다시 쓰려고했습니다.
새 스크립트는 순수한 AWK를 사용하며 요구 사항을 훨씬 더 잘 준수합니다. 기본적으로 /etc/apt/sources.list
실행될 때마다 다시 작성 됩니다.
스크립트를 실행 sudo apt-get update
한 후에는 업데이트가 필요하므로 스크립트가 성공적으로 종료 된 후에 실행 하십시오.
파일은 실행 가능 권한이 있어야 chmod +x add-update.awk
하며 $PATH
변수에 포함 된 디렉토리에 저장해야 합니다. 특히 스크립트를 $HOME/bin
폴더 에 저장하는 것이 좋습니다 (또한 $PATH
변수에 추가해야 함 ).
원본 /etc/apt/sources.list
파일 의 백업은 필요하지 않지만 강력히 권장됩니다. 파일을 백업하려면
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
용법:
sudo ./add-update.awk -v ACTION=[enable|disable|help] -v SOURCE=[updates|backports|security|proposed]
데모:
sergrep:$ cat /etc/apt/sources.list
deb http://it.archive.ubuntu.com/ubuntu wily main universe
deb http://us.archive.ubuntu.com/ubuntu wily-backports main
deb-src http://it.archive.ubuntu.com/ubuntu wily main universe
deb-src http://us.archive.ubuntu.com/ubuntu wily-backports main
# removed
sergrep:$ sudo ./add-update.awk -v ACTION="enable" -v SOURCE="security"
[sudo] password for xieerqi:
/etc/apt/sources.list
<<< Script finished processing
sergrep:$ cat /etc/apt/sources.list
deb http://it.archive.ubuntu.com/ubuntu wily main universe
deb http://it.archive.ubuntu.com/ubuntu wily-security main universe
deb http://us.archive.ubuntu.com/ubuntu wily-backports main
deb http://us.archive.ubuntu.com/ubuntu wily-security main
deb-src http://it.archive.ubuntu.com/ubuntu wily main universe
deb-src http://it.archive.ubuntu.com/ubuntu wily-security main universe
deb-src http://us.archive.ubuntu.com/ubuntu wily-backports main
deb-src http://us.archive.ubuntu.com/ubuntu wily-security main
소스 코드
#!/usr/bin/awk -f
#
###########################################################
# Author: Serg Kolo
# Date: Nov 27,2015
# Purpose: A script that enables/disables 4 ubuntu sources
# (namely updates, backports, proposed, and security )
# much in a way like software-properties-gtk does
# Written for: http://paste.ubuntu.com/13434218/
###########################################################
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
function printUsage() {
print "Usage: sudo ./add-update.awk -v ACTION=[enable|disable|help] -v SOURCE=[updates|backports|security|proposed]";
exit
}
function checkSourceEnabled()
{
if ( $3 ~ SOURCE) {
print SOURCE" is enabled; exiting"
VAL = 1
}
else {
VAL = 0
}
return VAL
}
function disableSource()
{
if ( $0 ~ SOURCE ) $0="# removed";
j++;
newLines[j]=$0;
}
function listStuff () {
for(k=4; k<=NF; k++) if ( $k~/#/ ) {break} else {
COMPONENTS=COMPONENTS" "$k
};
gsub(/\-.*/,"",$3);
STRING=$1" "$2" "$3APPEND" "COMPONENTS;
COMPONENTS=""
return STRING;
}
function replaceFile()
{
command="mv /tmp/sources.list "ARGV[1]
system(command);
}
############
# MAIN
#############
BEGIN {
# argument checking sequence
# must remain written in if-else
# structure rather than case,
# to consider users who may not be able
# to install gawk due to broken sources.list
# which is what this script should be aimed at
# actions checked first so that
# help message can be printed
if ( ACTION == "enable" ||
ACTION == "disable" ||
ACTION == "default" ) {
print "<<< ACTION ARG OK"
}
else if (ACTION == "help" ){
printUsage()
exit
}
if ( SOURCE == "update" ||
SOURCE == "security" ||
SOURCE == "backports" ||
SOURCE == "proposed" ) {
print "<<< SOURCE ARG OK"
}
else if ( ACTION != "default" || ACTION != "help" ) {
print "<<< E: SOURCE ARG INCORRECT";
printUsage();
exit 1 }
# static filename to operate on
ARGV[ARGC++]="/etc/apt/sources.list";
if (ACTION == "enable" ) {
APPEND="-"SOURCE;
} else{
APPEND="";
}
} # END OF BEGIN
$0~/^deb*/ && $0!~/partner/ && $0!~/extra/ {
if ( ACTION == "enable" ) {
j++;
ARRAY[j]=$0
ENABLED=checkSourceEnabled();
if ( ENABLED ) {
exit 1
}
else {
j++;
ARRAY[j]=listStuff();
}
}
else if ( ACTION == "disable" ){
disableSource() ;
}
else if ( ACTION == "default" && SOURCE == "default" ) {
j++;
defaultsArray[j]=$0;
j++;
defaultsArray[j]=listStuff();
}
}
END {
print "<<< Script finished processing" ;
if ( ACTION =="enable" && ENABLED == 0 ){
for(i=1;i<=j;i++)
print ARRAY[i] | "sort -u > /tmp/sources.list ";
replaceFile();
}
else if ( ACTION == "disable" ) {
for ( i=1;i<=j;i++ ) print newLines[i] | "sort -u > /tmp/sources.list"
replaceFile();
}
else if (ACTION == "default" ){
for ( i=1;i<=j;i++ ) print defaultsArray[i] | "sort -i -u > /tmp/sources.list"
replaceFile();
}
}
# END OF MAIN
–
이전 버전
답변
에 쓰여진 Ubuntu Software Center 의 출처를 분석 했습니다 python
.
그 후, 다음 코드를 잘 작성했습니다. aptsources
관리 우분투 소프트웨어 센터에서 사용하는 파이썬 모듈 /etc/apt/sources.list
및 /etc/apt/sources.list.d
.
#!/usr/bin/python
import aptsources.sourceslist
from subprocess import Popen, PIPE
import errno
import os
def _lsb_release():
"""Call lsb_release --idrc and return a mapping."""
result = {'Codename': 'sid', 'Distributor ID': 'Debian',
'Description': 'Debian GNU/Linux unstable (sid)',
'Release': 'unstable'}
try:
out = Popen(['lsb_release', '-idrc'], stdout=PIPE).communicate()[0]
# Convert to unicode string, needed for Python 3.1
out = out.decode("utf-8")
result.update(l.split(":\t") for l in out.split("\n") if ':\t' in l)
except OSError as exc:
if exc.errno != errno.ENOENT:
logging.warning('lsb_release failed, using defaults:' % exc)
return result
if __name__ == "__main__":
if len(os.sys.argv) != 3 or \
os.sys.argv[1] not in ['enable', 'disable'] or \
os.sys.argv[2] not in ['updates', 'security', 'proposed', 'backports', 'default']:
print "Usage: apt-add-update <enable|disable> <default|updates|security|proposed|backports>"
os.sys.exit(0)
release = _lsb_release()
codename = release['Codename']
sourcelist = aptsources.sourceslist.SourcesList()
template = None
main_uri = ""
main_comps = []
main_types = []
child_comps = []
child_types = []
for tmpl in sourcelist.matcher.templates:
if tmpl.name == codename and tmpl.distribution == "Ubuntu":
template = tmpl
break
updated = False
for source in sourcelist.list:
if source.invalid:
continue
for comp in source.comps:
if comp not in child_comps:
child_comps.append(comp)
if source.template and source.template.official and source.dist == codename and source.template.name == codename:
main_uri = source.uri
for comp in source.comps:
if comp not in main_comps:
main_comps.append(comp)
main_types.append(source.type)
else:
child_types.append(source.type)
if source.dist == codename + "-" + os.sys.argv[2]:
if os.sys.argv[1] == 'enable' and source.type in main_types:
source.set_enabled(True)
if os.sys.argv[1] == 'disable':
source.set_enabled(False)
updated = True
if source.dist == codename and os.sys.argv[2] == "default":
if os.sys.argv[1] == 'enable' and source.type in child_types:
source.set_enabled(True)
if os.sys.argv[1] == 'disable':
source.set_enabled(False)
updated = True
if not main_uri:
main_uri = "http://archive.ubuntu.com/ubuntu"
if os.sys.argv[2] == "default" and not main_comps:
main_comps = child_comps
if not main_comps:
main_comps = ['main', 'restricted', 'universe', 'multiverse']
if not updated and os.sys.argv[1] != 'disable':
if os.sys.argv[2] == "default":
uri = main_uri
if tmpl.base_uri:
uri = tmpl.base_uri
tmpl = template
line = tmpl.type + " " + uri + " " + tmpl.name + " " + " ".join(main_comps)
sourceentry = aptsources.sourceslist.SourceEntry(line)
sourcelist.list.append(sourceentry)
for tmpl in template.children:
if tmpl.name != codename + "-" + os.sys.argv[2] and \
not (os.sys.argv[2] == "default" and tmpl.name == codename):
continue
if os.sys.argv[2] == "default" and tmpl.type not in child_types:
continue
if os.sys.argv[2] != "default" and tmpl.type not in main_types:
continue
uri = main_uri
if tmpl.base_uri:
uri = tmpl.base_uri
if not uri:
continue
line = tmpl.type + " " + uri + " " + tmpl.name + " " + " ".join(main_comps)
sourceentry = aptsources.sourceslist.SourceEntry(line)
sourcelist.list.append(sourceentry)
sourcelist.save()
이 코드를 파일 이름으로 저장하십시오 /usr/local/bin/apt-add-update
. 그런 다음 다음과 같이 실행하십시오.
$ sudo apt-add-update <enable|disable> <default|updates|security|proposed|backports>
나는 업데이트 을 위해 그것을 다 배포판 지원 , 예를 들어 trusty
와 wily
.
#!/usr/bin/python
import aptsources.sourceslist
import os
subdistnames = ['updates', 'security', 'proposed', 'backports']
def get_subdistname(distname):
rc = "default"
try:
rc = distname.split("-")[1]
except:
pass
return rc
def get_distname(distname):
rc = distname
try:
rc = distname.split("-")[0]
except:
pass
return rc
def duplicate_check(entries):
new_entries = []
for source in entries:
for newsource in new_entries:
if source.type == newsource.type and source.uri == newsource.uri and source.dist == newsource.dist:
for comp in newsource.comps:
if comp in source.comps:
source.comps.remove(comp)
if len(source.comps) > 0:
new_entries.append(source)
return new_entries
if __name__ == "__main__":
if len(os.sys.argv) != 3 or \
os.sys.argv[1] not in ['enable', 'disable'] or \
( os.sys.argv[2] not in subdistnames and os.sys.argv[2] != 'default' ):
print "Usage: apt-add-update <enable|disable> <default|updates|security|proposed|backports>"
os.sys.exit(0)
sourcelist = aptsources.sourceslist.SourcesList()
sourcelist.list = []
sourcelist.load('/etc/apt/sources.list')
main_entries = []
child_entries = []
other_entries = []
distro_names = []
for tmpl in sourcelist.matcher.templates:
if tmpl.name.find('-') > 0 or tmpl.distribution != "Ubuntu":
continue
distro_names.append(tmpl.name)
for source in sourcelist.list:
if source.invalid or source.disabled:
continue
subdistname = get_subdistname(source.dist)
if source.dist in distro_names:
main_entries.append(source)
elif subdistname in subdistnames:
child_entries.append(source)
else:
other_entries.append(source)
if os.sys.argv[2] in subdistnames:
modified = True
while modified:
modified = False
for source in child_entries:
if get_subdistname(source.dist) == os.sys.argv[2]:
child_entries.remove(source)
modified = True
continue
if os.sys.argv[1] == "enable":
for source in main_entries:
uri = source.uri
if os.sys.argv[2] == "security":
uri = "http://security.ubuntu.com/ubuntu"
comps = []
for i in source.comps:
if i in ['main', 'restricted', 'universe', 'multiverse']:
comps.append(i)
line = source.type + " " + uri + " " + source.dist + "-" + os.sys.argv[2] + " " + " ".join(comps)
sourceentry = aptsources.sourceslist.SourceEntry(line)
child_entries.append(sourceentry)
else:
main_entries = []
if os.sys.argv[1] == "enable":
for source in child_entries:
uri = source.uri
if get_subdistname(source.dist) == "security":
uri = "http://archive.ubuntu.com/ubuntu"
comps = []
for i in source.comps:
if i in ['main', 'restricted', 'universe', 'multiverse']:
comps.append(i)
line = source.type + " " + uri + " " + get_distname(source.dist) + " " + " ".join(comps)
sourceentry = aptsources.sourceslist.SourceEntry(line)
main_entries.append(sourceentry)
main_entries = duplicate_check(main_entries)
child_entries = duplicate_check(child_entries)
other_entries = duplicate_check(other_entries)
sourcelist.list = []
sourcelist.list.extend(main_entries)
sourcelist.list.extend(child_entries)
sourcelist.list.extend(other_entries)
sourcelist.save()
참조 URL은 https://github.com/dupingping/apt-add-update/tree/master입니다.
답변
용법:
## testing
apt-add-update enable|disable default|security|updates|proposed|backports [file]
## real
sudo apt-add-update enable|disable default|security|updates|proposed|backports
여기 요점 :
다른 옵션을 직접 찾고 있었기 때문에 파일을 구문 분석했습니다.
-
공식적으로 (오래된 릴리스, 포트) 또는
python-apt
패키지 에서로드 된 커뮤니티에서 제공하는 기타 미러 (모든 미러가있는 파일 포함)가 미러인지 확인합니다./usr/share/python-apt/templates/Ubuntu.mirrors
-
항상 공식 URI를 파일에 보관하십시오. 따라서 모든 기능을 비활성화하더라도 지속성 설정을 위해 주석 처리 된 행을 유지합니다. 알파벳 정렬 유형, url, dist, comp를 사용하여 줄을 최소값으로 확인합니다.
-
입력 파일을 세 번째 인수로 얻거나 쓰기 권한이없는 경우 stdout에 인쇄합니다.
/etc/apt/sources.list
[ options ]
처럼 지원하지 않습니다[ arch=amd64 ]
.disable default
비활성화 할 항목을 지정 해야하는 사용자를 삭제했습니다 .- 나는 자신이 repo를 의도적으로 혼합하고 있기 때문에 마지막 옵션 (9)을 좋아하지 않습니다. 따라서 타사 리포지토리로 취급해야합니다.
다운로드 : 전체 테스트 세트
https://github.com/sneetsher/au_700860_apt_channels
스크립트:
#!/usr/bin/python3
import sys,os
import re
## official repo's
#http://ports.ubuntu.com/ubuntu-ports/
#http://old-releases.ubuntu.com/ubuntu/
#http://security.ubuntu.com/ubuntu/
#http://archive.ubuntu.com/ubuntu/
repo_official_uri_re = re.compile(r"\A(http|ftp)://(([a-zA-Z]*.)?archive|security|old-releases|ports).ubuntu.com/ubuntu(-ports)?[/]?\Z")
## load other mirrors
mirrors=[]
mir_re = re.compile(r"\A(http|ftp)://")
with open("/usr/share/python-apt/templates/Ubuntu.mirrors","r") as f:
for l in f:
if mir_re.match(l):
mirrors.append(l.strip())
f.close()
#print(mirrors)
## system release
with open("/etc/lsb-release","r") as f:
for l in f:
k,v=l.split("=")
if k=="DISTRIB_CODENAME":
release = v.strip()
break
#print(release)
f.close()
## load sources.list
##TODO: missing support deb line options like [ arch=whatever ]
emp_re = re.compile(r"\A\s*\Z")
repo_re = re.compile(r"\A#* *deb(-src)? *(http://|ftp://|file://|cdrom:)")
com_re = re.compile(r"\A#")
repo_details_re = re.compile(r"\A(?P<active>#*) *(?P<type>deb(-src)?) *(?P<uri>(http://|ftp://|file://|cdrom:\[[a-zA-Z0-9 \-_().]*\])?\S*) (?P<dist>[a-zA-Z\-_]*) (?P<comp>[a-zA-Z ]*\Z)")
##example
sources={
"http://archive.ubuntu.com/ubuntu/":{
"active":True,
"deb":{
"wily":["universe","multiverse","restricted","main"],
"wily-security":["main","restricted","universe","multiverse"]
},
"deb-src":{
"wily":["universe","multiverse","restricted","main"]
},
"mirror":True
}
}
sources={}
uri=""
##for testing
if len(sys.argv)>=4 and os.path.isfile(sys.argv[3]):
ifile = sys.argv[3]
else:
ifile = "/etc/apt/sources.list"
with open(ifile, "r") as f:
for l in f:
l=l.strip()
r = emp_re.match(l)
if r:
continue
else:
#print("raw:",l)
r = repo_re.match(l)
if r:
#print("repository:",l)
r = repo_details_re.match(l)
#print(r.groupdict())
uri=r.group("uri")
if uri[-1]!="/":
uri += "/"
if (uri not in sources):
sources[uri] = {"active":False,"deb":{},"deb-src":{},"mirror":False}
m = repo_official_uri_re.match(uri)
if m or uri in mirrors:
sources[uri]["mirror"] = True
if r.group("active")=="":
sources[uri]["active"]=True
sources[uri][r.group("type")][r.group("dist")]=r.group("comp").split()
else:
if r.group("active")=="" and sources[uri]["active"]==False:
sources[uri]["active"]=True
sources[uri]["deb"]={}
sources[uri]["deb-src"]={}
sources[uri][r.group("type")][r.group("dist")]=r.group("comp").split()
if (r.group("active")=="")==sources[uri]["active"]:
if r.group("dist") not in sources[uri][r.group("type")]:
sources[uri][r.group("type")][r.group("dist")]=r.group("comp").split()
else:
for c in r.group("comp").split():
if c not in sources[uri][r.group("type")][r.group("dist")]:
sources[uri][r.group("type")][r.group("dist")].append(c)
else:
r = com_re.match(l)
if r:
#print("comment",l)
continue
else:
print("unknown",l)
#print(sources)
f.close()
## process argumments
#fallback for default component to be copied from
comp=[release+"-security",release+"-update",release+"-proposed"]
found_other_comp=False
if sys.argv[2]=="default" and sys.argv[1]=="enable":
for u in sorted(sources.keys()):
if sources[u]["mirror"]:
if sources[u]["active"]:
for t in ["deb","deb-src"]:
if release not in sources[u][t]:
for d in range(len(comp)):
if comp[d] in sources[u][t]:
other_comp_found=True
for i in range(d):
sources[u][t][comp[i]]=sources[u][t][comp[d]]
sources[u][t][release]=sources[u][t][comp[d]]
###don't activate any thing if commented like an empty file.
#if not found_other_comp and t=="deb":
# sources[u][t][release]=["main"]
#else:
# sources[u]["active"]=True
# sources[u]["deb"]={release:["main"]}
# sources[u]["deb-src"]={}
## carry on enable security
sys.argv[2] = "security"
if sys.argv[2]=="security" or sys.argv[2]=="updates" or sys.argv[2]=="proposed" or sys.argv[2]=="backports":
for u in sorted(sources.keys()):
if sources[u]["mirror"] and sources[u]["active"]:
if sys.argv[1]=="disable":
if len(sources[u]["deb"])+len(sources[u]["deb-src"])>(release+"-"+sys.argv[2] in sources[u]["deb"])+(release+"-"+sys.argv[2] in sources[u]["deb-src"]):
if release+"-"+sys.argv[2] in sources[u]["deb"]:
del sources[u]["deb"][release+"-"+sys.argv[2]]
if release+"-"+sys.argv[2] in sources[u]["deb-src"]:
del sources[u]["deb-src"][release+"-"+sys.argv[2]]
else:
sources[u]["active"] = False
elif sys.argv[1]=="enable":
for t in ["deb","deb-src"]:
if release in sources[u][t]:
if release+"-"+sys.argv[2] not in sources[u][t]:
sources[u][t][release+"-"+sys.argv[2]]=sources[u][t][release]
else:
for c in sources[u][t][release]:
if c not in sources[u][t][release+"-"+sys.argv[2]]:
sources[u][t][release+"-"+sys.argv[2]].append(c)
## generate the new list
data_out=""
for u in sorted(sources.keys()):
#print(u)
for t in ["deb","deb-src"]:
for d in sorted(sources[u][t].keys()):
data_out += (not sources[u]["active"])*"#"+" ".join([t,u,d,""])+" ".join(sorted(sources[u][t][d]))+"\n"
if len(sys.argv)>=4 or not os.access("/etc/apt/sources.list", os.W_OK):
print(data_out)
else:
with open("/etc/apt/sources.list","w") as f:
f.write(data_out)
f.close()
sys.exit(0)
답변
를 사용하여 매우 간단한 방법으로 수행 할 수 있습니다 add-apt-repository
.
예를 들어, 당신은 추가 할 수 있습니다 proposed
에 의해
sudo add-apt-repository "http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-proposed restricted universe multiverse main"
그것은 추가 할 것입니다 deb
및 deb-src
에 라인 /etc/apt/sources.list
. 그러나 소스 라인은 주석 처리됩니다.
당신이 실행하는 경우 add-apt-repository
에 -s
매개 변수가 주석 처리되지 않습니다 deb-src
.
에 security
의해 활성화 할 수 있습니다
sudo add-apt-repository "http://security.ubuntu.com/ubuntu/ $(lsb_release -sc)-security restricted universe multiverse main"