2 inherit Service.Service;
6 void call_service(object user, mixed args, void|int id)
11 void install_spm(object spmModule, string pname)
13 object fp = connection->send_cmd(0, "get_module", "filepath:tree");
14 object packages = fp->path_to_object("/packages");
15 werror("Updating %O\n", pname);
16 if ( objectp(packages) ) {
18 object tfs = Filesystem.Tar("spms/"+pname);
19 if ( !objectp(tfs) ) {
20 werror(": " + pname + " not a valid SPM !\n");
23 mixed xml = tfs->open("package.xml", "r");
24 string packageXML = xml->read();
26 mapping config =spmModule->spm_check_configuration(packageXML);
27 werror("CONFIG = %O\n", config);
28 mapping pmod = connection->send_cmd(0, "get_module", config->name);
30 pmod = connection->send_cmd(0, "get_module", "package:"+config->name);
31 if ( objectp(pmod) ) {
32 if ( spmModule->spm_version_value(config->version) <= spmModule->spm_version_value(pmod->get_version()) ) {
33 werror("Found installed module with version %O, skipping installation !\n", pmod->get_version());
37 werror("Found installed module - updating to %O (previous version %O)\n",
38 config->version, pmod->get_version());
42 werror("Module " + config->name + " not found on server - installing\n");
45 Stdio.File file = Stdio.File("spms/"+pname, "r");
46 object package = packages->get_object_byname(pname);
47 if ( !objectp(package) ) {
48 object docfactory = connection->get_variable("Document.factory");
49 package = docfactory->execute( (["name": pname, ]));
50 package->move(packages);
52 string spmContent = file->read();
53 package->set_content(spmContent);
54 string spmRealContent = package->get_content();
55 werror("Content Length: %d and %d\n", strlen(spmContent), strlen(spmRealContent));
56 for ( int i = 0; i < strlen(spmContent); i++ ) {
57 if ( spmContent[i] != spmRealContent[i] ) {
58 werror("SPM Differs in byte %d\n 100 bytes:\n%O\n------\n%O\n",
59 i, spmContent[i-50..i+50], spmRealContent[i-50..i+50]);
63 spmModule->install_spm(package, fp->path_to_object("/"));
66 error("Failed to install - no /packages found on server");
72 call_out(check_spms, 86400); // once a day ought to be enough!
73 object _spm = connection->send_cmd( 0, "get_module", "SPM" );
75 werror("Failed to find SPM Module !\n");
76 array directory = get_dir("spms");
77 directory = sort(directory);
78 foreach ( directory, string file ) {
79 werror("file = %O\n", file);
80 if ( sscanf(file, "%*s.spm") ) {
81 mixed err = catch ( install_spm(_spm, file) );
83 werror( "Error while installing %s : %O\n%O", file, err[0], err[1] );
93 werror("cwd = " + getcwd() + "\n");
100 private void got_kill(int sig) {
106 int main(int argc, array argv)
108 signal(signum("QUIT"), got_kill);