Add and remove update channels in an easy terminal way
Nov 27, 2015 Update:
The second version of the script still left me dissatisfied with the bloatness of the source code and the fact that I had to employ several different tools. Hence I attempted to rewrite the script in AWK only.
The new script uses pure AWK, and adheres much better to the requirements. Essentially it rewrites the /etc/apt/sources.list
every time it runs.
After running the script , update is required, therefore run sudo apt-get update
after the script exits successfully.
The file must have executable permissions enabled with chmod +x add-update.awk
and be saved in any of the directories contained in the $PATH
variable. Particularly it is advised to save the script to $HOME/bin
folder ( which also must be appended to the $PATH
variable).
A backup of the original /etc/apt/sources.list
file is not required but strongly recommended. To backup the file do
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
Usage:
sudo ./add-update.awk -v ACTION=[enable|disable|help] -v SOURCE=[updates|backports|security|proposed]
Source on 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
SOURCE CODE
#!/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
--
Previous versions
Version #1 on github (bash script with AWK and SED)
Version #2 on github (also bash script)
I analysed the source of Ubuntu Software Center that written in python
.
After, I wrote following code runs well. aptsources
is a python module used by Ubuntu Software Center to manage /etc/apt/sources.list
and /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()
Save this code with the file name, /usr/local/bin/apt-add-update
.
And then run as following.
$ sudo apt-add-update <enable|disable> <default|updates|security|proposed|backports>
I updated it for the multi distro support, e.g. trusty
and 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()
Reference URL is https://github.com/dupingping/apt-add-update/tree/master
Usage:
## testing
apt-add-update enable|disable default|security|updates|proposed|backports [file]
## real
sudo apt-add-update enable|disable default|security|updates|proposed|backports
Here main points:
I parsed the file because I was looking for some other options myself.
-
Checks if any is a mirror, either official including (old-releases, ports) or other mirrors provided by community loaded from
python-apt
package (it contains a file with all mirrors)./usr/share/python-apt/templates/Ubuntu.mirrors
Always keep the official URI in the file. So even with all disabled, it will keep a commented line for a persistence setting. It resolves the lines to the minimum with alphabetic sorting type, url, dist, comp.
Prints to the stdout if it get an input file as 3rd argument or no permission to write
/etc/apt/sources.list
- Does not support
[ options ]
like[ arch=amd64 ]
. - Dropped
disable default
which i oblige user to specify what to disable. - I Don't like last option (9), because myself is mixing repo's on purpose. So they should be treated as 3rd party repositories.
Download: with full test set.
https://github.com/sneetsher/au_700860_apt_channels
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)
You can do it in a very simple way by using add-apt-repository
.
For example, you can add proposed
by
sudo add-apt-repository "http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc)-proposed restricted universe multiverse main"
It will add deb
and deb-src
lines to /etc/apt/sources.list
.
But the source line will be commented.
If you run add-apt-repository
with -s
parameter, it will not comment out deb-src
.
You can enable security
by
sudo add-apt-repository "http://security.ubuntu.com/ubuntu/ $(lsb_release -sc)-security restricted universe multiverse main"
This does exactly what has been asked;
I'll update this from time to time if necessary;
The bleeding edge version can be found at this GitHub repository;
To install from the GitHub repository:
- Install
git
:sudo apt-get install git
- Clone the repository:
git clone https://github.com/kos0/addRemoveDistribution.git
Synopsis:
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);