示例#1
0
int main  (int argc, char *argv[])
{
    int arg;
    char *Parm = NULL;
    char *TempFileDir=NULL;
    int c;
    int InitFlag=0;
    int CmdlineFlag = 0; /** run from command line flag, 1 yes, 0 not */
    int user_pk;
    char *agent_desc = "Network downloader.  Uses wget(1).";

    memset(GlobalTempFile,'\0',MAXCMD);
    memset(GlobalURL,'\0',MAXCMD);
    memset(GlobalParam,'\0',MAXCMD);
    memset(GlobalType,'\0',MAXCMD);
    GlobalUploadKey = -1;
    int upload_pk = 0;           // the upload primary key
    //int Agent_pk;
    char *SVN_REV;
    char *VERSION;
    char agent_rev[MAXCMD];

    /* open the connection to the scheduler and configuration */
    fo_scheduler_connect(&argc, argv, &pgConn);

    /* Process command-line */
    while((c = getopt(argc,argv,"d:Gg:ik:A:R:l:Cc:Vvh")) != -1)
    {
        switch(c)
        {
        case 'd':
            TempFileDir = PathCheck(optarg);
            break;
        case 'g':
        {
            struct group *SG;
            SG = getgrnam(optarg);
            if (SG) ForceGroup = SG->gr_gid;
        }
        break;
        case 'G':
            GlobalImportGold=0;
            break;
        case 'i':
            InitFlag=1;
            break;
        case 'k':
            GlobalUploadKey = atol(optarg);
            if (!GlobalTempFile[0])
                strcpy(GlobalTempFile,"wget.default_download");
            break;
        case 'A':
            sprintf(GlobalParam, "%s -A %s ",GlobalParam, optarg);
            break;
        case 'R':
            sprintf(GlobalParam, "%s -R %s ",GlobalParam, optarg);
            break;
        case 'l':
            sprintf(GlobalParam, "%s -l %s ",GlobalParam, optarg);
            break;
        case 'c':
            break; /* handled by fo_scheduler_connect() */
        case 'C':
            CmdlineFlag = 1;
            break;
        case 'v':
            break;
        case 'V':
            printf("%s", BuildVersion);
            SafeExit(0);
        default:
            Usage(argv[0]);
            SafeExit(-1);
        }
    }
    if (argc - optind > 1)
    {
        Usage(argv[0]);
        SafeExit(-1);
    }

    /* When initializing the DB, don't do anything else */
    if (InitFlag)
    {
        if (pgConn) PQfinish(pgConn);
        SafeExit(0);
    }

    SVN_REV = fo_sysconfig("wget_agent", "SVN_REV");
    VERSION = fo_sysconfig("wget_agent", "VERSION");
    sprintf(agent_rev, "%s.%s", VERSION, SVN_REV);
    /* Get the Agent Key from the DB */
    fo_GetAgentKey(pgConn, basename(argv[0]), GlobalUploadKey, agent_rev, agent_desc);

    /** get proxy */
    GetProxy();

    /* Run from the command-line (for testing) */
    for(arg=optind; arg < argc; arg++)
    {
        memset(GlobalURL,'\0',sizeof(GlobalURL));
        strncpy(GlobalURL,argv[arg],sizeof(GlobalURL));
        /* If the file contains "://" then assume it is a URL.
           Else, assume it is a file. */
        LOG_VERBOSE0("Command-line: %s",GlobalURL);
        if (strstr(GlobalURL,"://"))
        {
            fo_scheduler_heart(1);
            LOG_VERBOSE0("It's a URL");
            if (GetURL(GlobalTempFile,GlobalURL,TempFileDir) != 0)
            {
                LOG_FATAL("Download of %s failed.",GlobalURL);
                SafeExit(21);
            }
            if (GlobalUploadKey != -1) {
                DBLoadGold();
            }
            unlink(GlobalTempFile);
        }
        else /* must be a file */
        {
            LOG_VERBOSE0("It's a file -- GlobalUploadKey = %ld",GlobalUploadKey);
            if (GlobalUploadKey != -1)
            {
                memcpy(GlobalTempFile,GlobalURL,MAXCMD);
                DBLoadGold();
            }
        }
    }

    /* Run from scheduler! */
    if (0 == CmdlineFlag)
    {
        user_pk = fo_scheduler_userID(); /* get user_pk for user who queued the agent */
        while(fo_scheduler_next())
        {
            Parm = fo_scheduler_current(); /* get piece of information, including upload_pk, downloadfile url, and parameters */
            if (Parm && Parm[0])
            {
                fo_scheduler_heart(1);
                /* set globals: uploadpk, downloadfile url, parameters */
                SetEnv(Parm,TempFileDir);
                upload_pk = GlobalUploadKey;

                /* Check Permissions */
                if (GetUploadPerm(pgConn, upload_pk, user_pk) < PERM_WRITE)
                {
                    LOG_ERROR("You have no update permissions on upload %d", upload_pk);
                    continue;
                }

                char TempDir[MAXCMD];
                memset(TempDir,'\0',MAXCMD);
                snprintf(TempDir, MAXCMD-1, "%s/wget", TempFileDir); // /var/local/lib/fossology/agents/wget
                struct stat Status;

                if (GlobalType[0])
                {
                    if (GetVersionControl() == 0)
                    {
                        DBLoadGold();
                        unlink(GlobalTempFile);
                    }
                    else
                    {
                        LOG_FATAL("upload %ld File retrieval failed: uploadpk=%ld tempfile=%s URL=%s Type=%s",
                                  GlobalUploadKey,GlobalUploadKey,GlobalTempFile,GlobalURL, GlobalType);
                        SafeExit(23);
                    }
                }
                else if (strstr(GlobalURL, "*") || stat(GlobalURL, &Status) == 0)
                {
                    if (!Archivefs(GlobalURL, GlobalTempFile, TempFileDir, Status))
                    {
                        LOG_FATAL("Failed to archieve. GlobalURL, GlobalTempFile, TempFileDir are: %s, %s, %s, "
                                  "Mode is: %lo (octal)\n", GlobalURL, GlobalTempFile, TempFileDir, (unsigned long) Status.st_mode);
                        SafeExit(50);
                    }
                    DBLoadGold();
                    unlink(GlobalTempFile);
                }
                else
                {
                    if (GetURL(GlobalTempFile,GlobalURL,TempDir) == 0)
                    {
                        DBLoadGold();
                        unlink(GlobalTempFile);
                    }
                    else
                    {
                        LOG_FATAL("upload %ld File retrieval failed: uploadpk=%ld tempfile=%s URL=%s",
                                  GlobalUploadKey,GlobalUploadKey,GlobalTempFile,GlobalURL);
                        SafeExit(22);
                    }
                }
            }
        }
    } /* if run from scheduler */

    SafeExit(0);
    exit(0);  /* to prevent compiler warning */
} /* main() */
示例#2
0
int	main	(int argc, char *argv[])
{
  int arg;
  char Parm[MAXCMD];
  char *TempFileDir=NULL;
  int c;
  int InitFlag=0;
  char *agent_desc = "Network downloader.  Uses wget(1).";

  memset(GlobalTempFile,'\0',MAXCMD);
  memset(GlobalURL,'\0',MAXCMD);
  memset(GlobalParam,'\0',MAXCMD);
  memset(Parm,'\0',MAXCMD);
  GlobalUploadKey = -1;
  /* Process command-line */
  while((c = getopt(argc,argv,"d:Gg:ik:A:R:l:")) != -1)
    {
    switch(c)
	{
	case 'd':
		TempFileDir = optarg;
		break;
	case 'g':
		{
		struct group *SG;
		SG = getgrnam(optarg);
		if (SG) ForceGroup = SG->gr_gid;
		}
		break;
	case 'G':
		GlobalImportGold=0;
		break;
	case 'i':
		InitFlag=1;
		break;
	case 'k':
		GlobalUploadKey = atol(optarg);
		if (!GlobalTempFile[0])
			strcpy(GlobalTempFile,"wget.default_download");
		break;
        case 'A':
                sprintf(GlobalParam, "%s -A %s ",GlobalParam, optarg);
                break;
        case 'R':
                sprintf(GlobalParam, "%s -R %s ",GlobalParam, optarg);
                break;
        case 'l':
                sprintf(GlobalParam, "%s -l %s ",GlobalParam, optarg);
                break;
	default:
		Usage(argv[0]);
		exit(-1);
	}
    }
  if (argc - optind > 1)
	{
	Usage(argv[0]);
	exit(-1);
	}

  /* Init */
  DB = DBopen();
  if (!DB)
	{
	printf("FATAL: Unable to connect to database\n");
	fflush(stdout);
	exit(20);
	}

  /* When initializing the DB, don't do anything else */
  if (InitFlag)
	{
	DBclose(DB);
	return(0);
	}

  /* Get the Agent Key from the DB */
  GetAgentKey(DB, basename(argv[0]), GlobalUploadKey, SVN_REV, agent_desc);

  /* Run from the command-line (for testing) */
  InitHeartbeat();
  signal(SIGALRM,ShowHeartbeat);
  for(arg=optind; arg < argc; arg++)
    {
    memset(GlobalURL,'\0',sizeof(GlobalURL));
    strncpy(GlobalURL,argv[arg],sizeof(GlobalURL));
    /* If the file contains "://" then assume it is a URL.
       Else, assume it is a file. */
    if (Debug) printf("Command-line: %s\n",GlobalURL);
    if (strstr(GlobalURL,"://"))
      {
      alarm(60);
      Heartbeat(0);
      if (Debug) printf("It's a URL\n");
      if (GetURL(GlobalTempFile,GlobalURL,TempFileDir) != 0)
	{
	printf("ERROR: Download of %s failed.\n",GlobalURL);
	fflush(stdout);
	DBclose(DB);
	exit(21);
	}
      InitHeartbeat();
      if (GlobalUploadKey != -1) { DBLoadGold(); }
      unlink(GlobalTempFile);
      alarm(0);
      }
    else /* must be a file */
      {
      if (Debug) printf("It's a file -- GlobalUploadKey = %ld\n",GlobalUploadKey);
      if (GlobalUploadKey != -1)
	{
	memcpy(GlobalTempFile,GlobalURL,MAXCMD);
	DBLoadGold();
	}
      }
    }

  /* Run from scheduler! */
  if (optind == argc)
    {
    printf("OK\n"); /* inform scheduler that we are ready */
    fflush(stdout);
    InitHeartbeat();
    alarm(60);
    while(ReadLine(stdin,Parm,MAXCMD) >= 0)
      {
      if (Parm[0] != '\0')
	{
    Heartbeat(0);
	/* 3 parameters: uploadpk downloadfile url */
	SetEnv(Parm,TempFileDir); /* set globals */
        char TempDir[MAXCMD];
        memset(TempDir,'\0',MAXCMD);
        snprintf(TempDir, MAXCMD-1, "%s/wget", TempFileDir); // /var/local/lib/fossology/agents/wget
	if (GetURL(GlobalTempFile,GlobalURL,TempDir) == 0)
		{
	  	  DBLoadGold();
		  unlink(GlobalTempFile);
                  struct stat sb;
                  /* Run from scheduler! delete the temp directory, /var/local/lib/fossology/agents/wget */
                  if (!stat(TempDir, &sb))
                  {
                    char CMD[MAXCMD];
                    memset(CMD,'\0',MAXCMD);
                    snprintf(CMD,MAXCMD-1, "rm -rf '%s' 2>&1", TempDir);
                    int rc_system = system(CMD); 
                    if (rc_system != 0) exit(25); // failed to delete the temperary directory
                  }
		}
	else
		{
		printf("FATAL upload %ld File retrieval failed.\n",GlobalUploadKey);
		printf("LOG upload %ld File retrieval failed: uploadpk=%ld tempfile=%s URL=%s\n",GlobalUploadKey,GlobalUploadKey,GlobalTempFile,GlobalURL);
		fflush(stdout);
		DBclose(DB);
		exit(22);
		}
	printf("OK\n"); /* inform scheduler that we are ready */
	fflush(stdout);
	alarm(60);
	}
      }
    } /* if run from scheduler */

  /* Clean up */
  DBclose(DB);
  return(0);
} /* main() */