]> git.saurik.com Git - apt.git/blob - cmdline/apt-cdrom.cc
try defaults if auto-detection failed in apt-cdrom
[apt.git] / cmdline / apt-cdrom.cc
1 // -*- mode: cpp; mode: fold -*-
2 // Description /*{{{*/
3 // $Id: apt-cdrom.cc,v 1.45 2003/11/19 23:50:51 mdz Exp $
4 /* ######################################################################
5
6 APT CDROM - Tool for handling APT's CDROM database.
7
8 Currently the only option is 'add' which will take the current CD
9 in the drive and add it into the database.
10
11 ##################################################################### */
12 /*}}}*/
13 // Include Files /*{{{*/
14 #include<config.h>
15
16 #include <apt-pkg/cmndline.h>
17 #include <apt-pkg/error.h>
18 #include <apt-pkg/init.h>
19 #include <apt-pkg/fileutl.h>
20 #include <apt-pkg/progress.h>
21 #include <apt-pkg/cdromutl.h>
22 #include <apt-pkg/strutl.h>
23 #include <apt-pkg/acquire.h>
24 #include <apt-pkg/acquire-item.h>
25 #include <apt-pkg/cdrom.h>
26 #include <apt-pkg/configuration.h>
27 #include <apt-pkg/pkgsystem.h>
28
29 #include <locale.h>
30 #include <iostream>
31 #include <fstream>
32 #include <vector>
33 #include <algorithm>
34 #include <sys/stat.h>
35 #include <fcntl.h>
36 #include <dirent.h>
37 #include <unistd.h>
38 #include <stdio.h>
39
40 #include <apti18n.h>
41 /*}}}*/
42
43 using namespace std;
44
45 class pkgCdromTextStatus : public pkgCdromStatus /*{{{*/
46 {
47 protected:
48 OpTextProgress Progress;
49 void Prompt(const char *Text);
50 string PromptLine(const char *Text);
51 bool AskCdromName(string &name);
52
53 public:
54 virtual void Update(string text, int current);
55 virtual bool ChangeCdrom();
56 virtual OpProgress* GetOpProgress();
57 };
58
59 void pkgCdromTextStatus::Prompt(const char *Text)
60 {
61 char C;
62 cout << Text << ' ' << flush;
63 read(STDIN_FILENO,&C,1);
64 if (C != '\n')
65 cout << endl;
66 }
67
68 string pkgCdromTextStatus::PromptLine(const char *Text)
69 {
70 cout << Text << ':' << endl;
71
72 string Res;
73 getline(cin,Res);
74 return Res;
75 }
76
77 bool pkgCdromTextStatus::AskCdromName(string &name)
78 {
79 cout << _("Please provide a name for this Disc, such as 'Debian 5.0.3 Disk 1'") << flush;
80 name = PromptLine("");
81
82 return true;
83 }
84
85
86 void pkgCdromTextStatus::Update(string text, int current)
87 {
88 if(text.size() > 0)
89 cout << text << flush;
90 }
91
92 bool pkgCdromTextStatus::ChangeCdrom()
93 {
94 Prompt(_("Please insert a Disc in the drive and press enter"));
95 return true;
96 }
97
98 OpProgress* pkgCdromTextStatus::GetOpProgress()
99 {
100 return &Progress;
101 };
102 /*}}}*/
103 // SetupAutoDetect /*{{{*/
104 bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
105 {
106 bool Debug = _config->FindB("Debug::Acquire::cdrom", false);
107
108 vector<struct CdromDevice> v = UdevCdroms.Scan();
109 if (i >= v.size())
110 return false;
111
112 if (Debug)
113 clog << "Looking at devce " << i
114 << " DeviveName: " << v[i].DeviceName
115 << " IsMounted: '" << v[i].Mounted << "'"
116 << " MountPoint: '" << v[i].MountPath << "'"
117 << endl;
118
119 if (v[i].Mounted)
120 {
121 // set the right options
122 _config->Set("Acquire::cdrom::mount", v[i].MountPath);
123 _config->Set("APT::CDROM::NoMount", true);
124 } else {
125 string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
126 if (!FileExists(AptMountPoint))
127 mkdir(AptMountPoint.c_str(), 0750);
128 if(MountCdrom(AptMountPoint, v[i].DeviceName) == false)
129 _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint.c_str());
130 _config->Set("Acquire::cdrom::mount", AptMountPoint);
131 _config->Set("APT::CDROM::NoMount", true);
132 }
133 i++;
134
135 return true;
136 }
137 /*}}}*/
138
139 // DoAdd - Add a new CDROM /*{{{*/
140 // ---------------------------------------------------------------------
141 /* This does the main add bit.. We show some status and things. The
142 sequence is to mount/umount the CD, Ident it then scan it for package
143 files and reduce that list. Then we copy over the package files and
144 verify them. Then rewrite the database files */
145 bool DoAdd(CommandLine &)
146 {
147 pkgUdevCdromDevices UdevCdroms;
148 pkgCdromTextStatus log;
149 pkgCdrom cdrom;
150 bool res = true;
151
152 bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
153 unsigned int count = 0;
154 if (AutoDetect && UdevCdroms.Dlopen())
155 while (AutoDetectCdrom(UdevCdroms, count))
156 res &= cdrom.Add(&log);
157 if (count == 0)
158 res = cdrom.Add(&log);
159
160 if(res)
161 cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
162
163 return res;
164 }
165 /*}}}*/
166 // DoIdent - Ident a CDROM /*{{{*/
167 // ---------------------------------------------------------------------
168 /* */
169 bool DoIdent(CommandLine &)
170 {
171 pkgUdevCdromDevices UdevCdroms;
172 string ident;
173 pkgCdromTextStatus log;
174 pkgCdrom cdrom;
175 bool res = true;
176
177 bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
178
179 unsigned int count = 0;
180 if (AutoDetect && UdevCdroms.Dlopen())
181 while (AutoDetectCdrom(UdevCdroms, count))
182 res &= cdrom.Ident(ident, &log);
183 if (count == 0)
184 return cdrom.Ident(ident, &log);
185 return res;
186 }
187 /*}}}*/
188 // ShowHelp - Show the help screen /*{{{*/
189 // ---------------------------------------------------------------------
190 /* */
191 int ShowHelp()
192 {
193 ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
194 COMMON_ARCH,__DATE__,__TIME__);
195 if (_config->FindB("version") == true)
196 return 0;
197
198 cout <<
199 "Usage: apt-cdrom [options] command\n"
200 "\n"
201 "apt-cdrom is a tool to add CDROM's to APT's source list. The\n"
202 "CDROM mount point and device information is taken from apt.conf\n"
203 "and /etc/fstab.\n"
204 "\n"
205 "Commands:\n"
206 " add - Add a CDROM\n"
207 " ident - Report the identity of a CDROM\n"
208 "\n"
209 "Options:\n"
210 " -h This help text\n"
211 " -d CD-ROM mount point\n"
212 " -r Rename a recognized CD-ROM\n"
213 " -m No mounting\n"
214 " -f Fast mode, don't check package files\n"
215 " -a Thorough scan mode\n"
216 " --auto-detect Auto detect drive and mount point\n"
217 " -c=? Read this configuration file\n"
218 " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
219 "See fstab(5)\n";
220 return 0;
221 }
222 /*}}}*/
223 int main(int argc,const char *argv[]) /*{{{*/
224 {
225 CommandLine::Args Args[] = {
226 {'h',"help","help",0},
227 { 0,"auto-detect","Acquire::cdrom::AutoDetect",0},
228 {'v',"version","version",0},
229 {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg},
230 {'r',"rename","APT::CDROM::Rename",0},
231 {'m',"no-mount","APT::CDROM::NoMount",0},
232 {'f',"fast","APT::CDROM::Fast",0},
233 {'n',"just-print","APT::CDROM::NoAct",0},
234 {'n',"recon","APT::CDROM::NoAct",0},
235 {'n',"no-act","APT::CDROM::NoAct",0},
236 {'a',"thorough","APT::CDROM::Thorough",0},
237 {'c',"config-file",0,CommandLine::ConfigFile},
238 {'o',"option",0,CommandLine::ArbItem},
239 {0,0,0,0}};
240 CommandLine::Dispatch Cmds[] = {
241 {"add",&DoAdd},
242 {"ident",&DoIdent},
243 {0,0}};
244
245 // Set up gettext support
246 setlocale(LC_ALL,"");
247 textdomain(PACKAGE);
248
249 // Parse the command line and initialize the package library
250 CommandLine CmdL(Args,_config);
251 if (pkgInitConfig(*_config) == false ||
252 CmdL.Parse(argc,argv) == false ||
253 pkgInitSystem(*_config,_system) == false)
254 {
255 _error->DumpErrors();
256 return 100;
257 }
258
259 // See if the help should be shown
260 if (_config->FindB("help") == true || _config->FindB("version") == true ||
261 CmdL.FileSize() == 0)
262 return ShowHelp();
263
264 // Deal with stdout not being a tty
265 if (isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
266 _config->Set("quiet","1");
267
268 // Match the operation
269 CmdL.DispatchArg(Cmds);
270
271 // Print any errors or warnings found during parsing
272 bool const Errors = _error->PendingError();
273 if (_config->FindI("quiet",0) > 0)
274 _error->DumpErrors();
275 else
276 _error->DumpErrors(GlobalError::DEBUG);
277 return Errors == true ? 100 : 0;
278 }
279 /*}}}*/