Я знаю, что существует GUI в программном обеспечении Ubuntu и Обновлениях для включения каналов обновления
как показано в этом снимке экрана:
Я ищу простой способ сделать, это из терминального использования управляет таким как
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>
Отличающийся или те же серверы для различного или samerepositories, уважайте каждый сервер
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
Различные релизы Ubuntu для различных репозиториев, уважайте каждый выпуск
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
PPAs или другие источники пакета (не - канонический) в 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);
27 ноября 2015 обновление:
Вторая версия сценария все еще оставила меня неудовлетворенным bloatness исходного кода и того, что я должен был использовать несколько различных инструментов. Следовательно я попытался переписать сценарий в 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 записанный в python
.
После, я записал, что следующий код работает хорошо. aptsources
модуль Python, используемый Центром программного обеспечения Ubuntu для управления /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, аккомпанементом.
Печать к stdout, если это получает входной файл как 3-й аргумент или никакое разрешение записать /etc/apt/sources.list
[ options ]
как [ arch=amd64 ]
. disable default
который я обязываю пользователя указывать, что отключить.Скачать: с полным набором тестов.
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"