Adicione e remova canais de atualização de maneira fácil

15

Eu sei que existe uma GUI no Ubuntu Software & Atualizações para ativar os canais de atualização

  • atualizações
  • proposto
  • backports
  • segurança

como mostrado nesta captura de tela:

Estou procurando uma maneira fácil de fazer isso de dentro de um terminal usando comandos como

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

e uma coisa adicional

sudo apt-add-update enable default

sudo apt-add-update disable default

Alguns exemplos para uma melhor compreensão

  1. Um vazio sources.list

    • cat /etc/apt/sources.list

      <empty>
      
    • sudo apt-add-update enable security

      <empty>
      
  2. Um repositório ativado ( 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
      
  3. Dois ou mais repositórios ativados em uma ou duas linhas

    • cat /etc/apt/sources.list

      deb http://archive.ubuntu.com/ubuntu wily main universe
      

      ou

      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
      

      ou

      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
      
  4. com deb-src entradas

    • 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
      
  5. Com inativo deb-src entradas

    • 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
      
  6. A coisa 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
      
  7. Apenas uma entrada e a disable action

    • cat /etc/apt/sources.list

      deb http://archive.ubuntu.com/ubuntu wily-security universe
      
    • sudo apt-add-update disable security

      <empty>
      
  8. Diferentes ou os mesmos servidores para diferentes ou os samerepositories, respeitam cada servidor

    • 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
      
  9. Diferentes versões do Ubuntu para diferentes repositórios, respeitando cada lançamento

    • 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
      
  10. PPAs ou outras fontes de pacotes (não-canônicas) no sources.list ?

    Ignore!

  11. Não altere os protocolos, por exemplo https , http , tor , ...

por A.B. 21.11.2015 / 18:43

5 respostas

5

Isso faz exatamente o que foi solicitado;

Vou atualizar isso de tempos em tempos, se necessário;

A versão de ponta pode ser encontrada neste repositório do GitHub ;

Para instalar a partir do repositório do GitHub:

  • Instale git : sudo apt-get install git
  • Clone o repositório: git clone https://github.com/kos0/addRemoveDistribution.git

Sinopse:

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);     
por kos 27.11.2015 / 19:21
12

Analisei a fonte do Ubuntu Software Center que foi escrito em python .

Depois, eu escrevi o seguinte código corre bem. aptsources é um módulo python usado pelo Ubuntu Software Center para gerenciar /etc/apt/sources.list e /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()

Salve este código com o nome do arquivo, /usr/local/bin/apt-add-update . E então corra como a seguir.

$ sudo apt-add-update <enable|disable> <default|updates|security|proposed|backports>

Eu atualizei para o suporte a várias distro , por exemplo trusty e 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()

O URL de referência é link

    
por xiaodongjie 26.11.2015 / 12:12
12

Atualização de 27 de novembro de 2015 :

A segunda versão do script ainda me deixou insatisfeito com o inchaço do código-fonte e com o fato de que eu tive que empregar várias ferramentas diferentes. Por isso, tentei reescrever o script apenas no AWK.

O novo script usa o AWK puro e adere muito melhor aos requisitos. Essencialmente, ele reescreve o /etc/apt/sources.list toda vez que é executado.

Depois de executar o script, a atualização é necessária, portanto, execute sudo apt-get update depois que o script sair com êxito.

O arquivo deve ter permissões executáveis habilitadas com chmod +x add-update.awk e ser salvo em qualquer um dos diretórios contidos na variável $PATH . Particularmente, é aconselhável salvar o script na pasta $HOME/bin (que também deve ser anexada à variável $PATH ).

Um backup do arquivo /etc/apt/sources.list original não é obrigatório, mas é altamente recomendável. Para fazer o backup do arquivo, faça

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

Uso:

sudo ./add-update.awk -v ACTION=[enable|disable|help] -v SOURCE=[updates|backports|security|proposed]

Fonte no github

Demo:

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

CÓDIGO-FONTE

#!/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

-

Versões anteriores

Versão # 1 no github (bash script com AWK e SED)

Versão # 2 no github (também script bash)

    
por Sergiy Kolodyazhnyy 22.11.2015 / 22:31
7

Uso:

## testing

apt-add-update  enable|disable  default|security|updates|proposed|backports  [file]


## real

sudo  apt-add-update  enable|disable  default|security|updates|proposed|backports

Aqui os principais pontos:

Eu analisei o arquivo porque eu mesmo procurava outras opções.

  • Verifica se algum é um espelho, seja oficial, incluindo (versões antigas, portas) ou outros espelhos fornecidos pela comunidade carregada de python-apt package (contém um arquivo com todos os espelhos).

    /usr/share/python-apt/templates/Ubuntu.mirrors
    
  • Sempre mantenha o URI oficial no arquivo. Assim, mesmo com todos os deficientes, manterá uma linha comentada para uma configuração de persistência. Ele resolve as linhas para o mínimo com o tipo de classificação alfabético, url, dist, comp.

  • Imprime na stdout se receber um arquivo de entrada como terceiro argumento ou sem permissão para escrever /etc/apt/sources.list

  • Não suporta [ options ] como [ arch=amd64 ] .
  • Caiu disable default , o que obrigou o usuário a especificar o que desabilitar.
  • Eu não gosto da última opção (9), porque eu estou misturando repo de propósito. Então, eles devem ser tratados como repositórios de terceiros.

Download: com o conjunto de testes completo.

link

Script:

#!/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)
    
por user.dz 29.11.2015 / 17:24
6

Você pode fazer isso de maneira muito simples usando add-apt-repository .

Por exemplo, você pode adicionar proposed por

sudo add-apt-repository "http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-proposed restricted universe multiverse main"

Ele adicionará deb e deb-src linhas a /etc/apt/sources.list . Mas a linha de origem será comentada.

Se você executar o parâmetro add-apt-repository with -s , ele não fará comentários sobre deb-src .

Você pode ativar security por

sudo add-apt-repository "http://security.ubuntu.com/ubuntu/ $(lsb_release -sc)-security restricted universe multiverse main"
    
por Pilot6 23.11.2015 / 19:54